c++ 链表 删除各种情况节点问题。。。。求教。。在线等。。。
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;
}
二、当只有一个结点时,因为一开始定义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;
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询