【C++语言】请教高手关于删除链表头节点的问题

2024-12-13 10:00:45
推荐回答(4个)
回答1:

1 从你的代码来看,你的全局头指针在这里没有起到作用。
2 你删除头结点时,你的头指针的值并没有变化,它指向的仍然是你 delete的p的值,而这个存储已经无效了,所有你显示错误,代码见 p = head; head = head->next;...
3 你的createnode函数有问题,代码
while(pn->sn != 0)
{
p = pn;
pn = new book;
cout<<"输入图书编号: ";
cin>>pn->sn;
if(pn->sn != 0)
...
}
其判断输入编号结束的条件是以上次输入为基准判断的,在你输入0后,程序会再次创建一个编号为0,价格为未知的节点,你可以验证。
4 给你 稍微改了 下

#include

class book
{//一个简单的链表book类
public:
int sn;
float price;
book *next;
};

book *head = NULL;//全局指针

book *createnode()
{//创建链表
book *p, *pn;
pn = new book;
head = pn;
p = pn;

//头节点的创建
cout<<"输入图书编号: ";
cin>>pn->sn;
if(pn->sn != 0)
{
cout<<"输入图书价格: ";
cin>>pn->price;
}
else
{
delete pn;
p = NULL;
p->next = NULL;
head = NULL;
}
//return head;

//创建更多节点,以图书编号0结束创建
while(p->sn != 0)
{
p = pn;
pn = new book;
pn->next = NULL;
cout<<"输入图书编号: ";

cin>>pn->sn;
if(pn->sn != 0)
{
cout<<"输入图书价格: ";
cin>>pn->price;
p->next = pn;
}
else
{
break;
}
}
//delete pn;
//p->next = NULL;
//return head;

return head;
}

//显示节点
void shownode(book *head)
{
cout< cout<<"图书信息如下: "< book * p = head;
while(p)
{
cout<<"图书编号: "<sn<<" 图书价格: "<price< p = p->next;
}
}

//删除节点
void deletenode(book* &head, int sn)
{
book *p, *ph;

if(head->sn == sn)
{//删除头节点,也就是这个测试总不能成功!
p = head;
head = (head->next);
//::head = head;//更新后的节点地址赋给全局头指针
delete p;
cout<<"操作成功!"< return;
}

ph = head;
while(ph)
{//删除非头节点,这些测试都是成功的
if(ph == NULL)
{
cout<<"找不到要删除的编号!"< return;
}
if( ph->next && (ph->next->sn == sn) )
{
p = ph->next;
ph->next = p->next;
delete p;
cout<<"操作成功!"< return;
}

ph = ph->next;
}
//cout<<"找不到要删除的编号!"<}

void main()
{
book *head;
head = createnode();
shownode(head);

cout< cout<<"请输入要删除的图书编号: ";
int sn;
cin>>sn;
deletenode(head, sn);
cout< shownode(head);
}

可以讨论

回答2:

你既然已经定义了一个全局变量的head指针,那么在主函数 main() 里就不需要再定义一个head的头指针了。
所以一楼所说的是正确的。或者你把 void main() 里的第一句 book *head; 删除也可以。

回答3:

呵呵,那肯定不是系统的问题。他们都没有说点子上。
问题的根本是形参里的head指针是临时指针,再把全局的::head指针指向这个临时指针的next时,当返回该函数时,临时head已被释放,那还怎以通过这个临时的head去找head的next 呀。那肯定是不存在。那么全局的::head已经成为野指针了。

回答4:

程序没有问题,问题在于最后的head调用
shownode(head);
你在这调用的是局部变量head,已经给删除了,输出报错
应该改为
shownode(::head);