这个链表哪里写错了。你输入三个节点的数据。在删除的时候如果删除第一个节点就会出错,删除其他的没事。

2024-12-23 14:51:35
推荐回答(2个)
回答1:

经过断点调试,你的问题是由于全局head和局部head同名造成。
所以我的修改是如下:
另外给你几点建议:
全局和局部变量最好不要同名;
要想修改链表可以传入链表头指针的引用;
另外你这代码,排版咋这样,看得好乱。
OK,就这些了。经过测试,现在已经正常,不过你的代码确实写的有点菜。
// xp.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}
#include
#include
#include
using namespace std;
class book //定义一个book类
{
public:
int num; //book的编号
float price; //book的价格
book *next; //指向下一个节点的指针
};
book *head=NULL;
bool check(string str) //用于检查输入的是否为数字
{
for (unsigned int i=0;iif (str[i]>'9'||str[i]<'0'&&str[i]!='.')
return false;
return true;
}
book *cteat() //动态数组的创建
{
book *p1,*p2;
head=NULL;//将head指针先初始化为NULL
p1=new book;
head=p1;//将head指针指向第一个节点
p2=p1;//p2用于记录上一个节点
cout<<"请输入图书的编号,以0结束\n";
string str;cin>>str;
while(!check(str)) //执行检查是否为数字
{
cout<<"您输入的不是数字,请重新输入";
cin>>str;
}
p1->num=atoi(str.c_str()); //将string类型转换成int类型
if (p1->num!=0)
{
cout<<"请输入图书的价格\n";
cin>>str;
while(!check(str)) //执行检查是否为数字
{
cout<<"您输入的不是数字,请重新输入";
cin>>str;
}
p1->price=atof(str.c_str()); //将string类型转换成float类型
//p1->price=(float)str;
}
else
{
delete p1;p2=NULL;head=NULL;return head;
}
while(p1->num!=0)
{
p2=p1;
p1=new book;
cout<<"请输入图书的编号,以0结束\n";
string str;
cin>>str;
while(!check(str))
{
cout<<"您输入的不是数字,请重新输入";
cin>>str;
}
p1->num=atoi(str.c_str());
if (p1->num!=0)
{
cout<<"请输入图书的价格\n";
cin>>str;
while(!check(str))
{
cout<<"您输入的不是数字,请重新输入";
cin>>str;
}
p1->price=(float)atof(str.c_str());
}
p2->next=p1;
}
delete p1;
p2->next=NULL;
return head;
}
void showbook(book *head) //动态链表的显示
{
cout<cout<<"图书的信息如下:"<while(head)
{
cout<<"书的编号:"<num<<"\t"<<"书的价格:"<price<head=head->next;
}
}
void Delete(book *&head,int num)
{
book *current; //定义一个变量保存当前要删除的节点
if (head->num==num)
{
current=head;
head=head->next;
//::head=head; //将head地址给全局的head
delete current;
return;
}
while(head)
{
if (head->next==NULL) //如果head没有下一个节点
{
cout<<"找不到要删除的编号";
return;
}
if (head->next->num==num) //下一个要删除的节点找到了
{
current=head->next;
head->next=current->next;
delete current;
cout<<"操作成功";
return;
}
head=head->next;
}
cout<<"找不到要删除的编号";
}
int main()
{
book *head=NULL;
head=cteat();
showbook(head);
cout<<"请输入要删除的图书编号";
int booknum;
cin>>booknum;
Delete(head,booknum);
showbook(head);
system("pause");
return 0;
}

回答2:

把main函数里的head指针去掉,因为你已经定义了一个全局变量的head了,没有必要在main函数里再定义一个,改成这样
int main()
{
cteat();
showbook(head);
cout<<"请输入要删除的图书编号";
int booknum;
cin>>booknum;
Delete(head,booknum);
showbook(head);
system("pause");
return 0;
}