c++ 链表 删除各种情况节点问题。。。。求教。。在线等。。。

2024-12-04 05:53:56
推荐回答(2个)
回答(1):

一、结尾节点无法删除的问题,你可以想象一个只有三个节点的链表,结尾节点的ID=findid,开始时,p指向第二个节点,然后执行到第一个if时,由于p->next->ID==findid,于是执行第二个if语句,但是此时p->next->next是等于NULL的,所以删除节点的代码没被执行。
二、当只有一个结点时,因为一开始定义p=head->next,所以一开始p=NULL,当执行到第一个if时,p->next->ID的对象是不存在的,故出错;当只有两个节点时,同上,只是这时候变成一开始时p->next是为NULL的,所以p->next->ID也是不存在的,也会出错。
当你写程序时,最好是画出一个个节点的图画,把一个个指针放到各自的位置进行操作,这样出错率会低很多。下面是我写的删除节点的代码:
studentnode *p1,*p2; //p1用来指向后一个节点,p2用来指向前一个节点
if( (head->next=NULL){
if(head->ID==findid)
delete head; //当只有一个结点且该结的该删时
else return 0;
}
else{ //默认一条链表里有可能不止一个该删的结点
p2=head;
p1=head->next;
do{
if(p1->ID==findid){ //删除结点,把p1,p2推后
p2->next=p1->next;
delete p1;
p1=p2->next;
}
else { p2=p1; p1=p1->next; } //没发现该删节点时,把p1,p2推后
}while(p1!=NULL)
return 0;
}

回答(2):

根据你提供的情况来看,因为“只有1个或2个程序也无法运行。。。”,所以我猜程序的数据结构应该是这样的,先考虑只有一个或两个时为什么无法运行,head本身也是存放数据的链表,是第一个有用的节点,head->next是第二个有用节点,head->next->next就为空了。。。
在来看你的代码“studentnode * p = head->next,”是从head->next节点(也就是第二个)开始查着的,在看“while (p) {
if (findid == p->next->ID) {
”当p不为空时循环执行while里面的东西,当只有一个节点时,head->next为空,根据“studentnode * p = head->next”,p为空,while循环不执行,
当只有两个节点时,根据“studentnode * p = head->next”,p指向第二个节点,不为空,但看代码“while (p) {
if (findid == p->next->ID) {”p->next是第三个节点,是空啊,里面没有内容,所以执行到p->next->ID就出错了。。。。而且代码“if (p->next->next != NULL) {”p->next就为空了,p->next->next问题就更大了。。。。
代码本身问题不少,改了以上问题之后还会出现其他问题,可加qq(用户名)给你个详细解释
至于最后一个节点无法删除的情况我就不了解了,程序不全