c++ 链表 删除各种情况节点问题。。。。求教。。在线等。。。
studentnode*p=head->next,*p1;cout<<"PleaseinputtheStudentIDofwhomyouwanttodelete:";ci...
studentnode * p = head->next, * p1;
cout << "Please input the Student ID of whom you want to delete: ";
cin >> findid;
cout << endl;
while (p) {
if (findid == p->next->ID) {
if (p->next->next != NULL) {
p1 = p->next;
p->next = p1->next;
delete p1;
} else {
}
return 0;
}
p = p->next;
}
部份程序只实现了 当存在3个或以上的节点时可以删除成功。。。。
但是。。1.结尾节点无法删除
2、只有1个或2个程序也无法运行。。。
求教大神~~~~
ps: 请看好这是根据学生ID遍历节点 来删除的。。。。万分感谢
请高人给出具体代码。。。。链表这块实在没学好 展开
cout << "Please input the Student ID of whom you want to delete: ";
cin >> findid;
cout << endl;
while (p) {
if (findid == p->next->ID) {
if (p->next->next != NULL) {
p1 = p->next;
p->next = p1->next;
delete p1;
} else {
}
return 0;
}
p = p->next;
}
部份程序只实现了 当存在3个或以上的节点时可以删除成功。。。。
但是。。1.结尾节点无法删除
2、只有1个或2个程序也无法运行。。。
求教大神~~~~
ps: 请看好这是根据学生ID遍历节点 来删除的。。。。万分感谢
请高人给出具体代码。。。。链表这块实在没学好 展开
2个回答
展开全部
一、结尾节点无法删除的问题,你可以想象一个只有三个节点的链表,结尾节点的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;
}
展开全部
根据你提供的情况来看,因为“只有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(用户名)给你个详细解释
至于最后一个节点无法删除的情况我就不了解了,程序不全
在来看你的代码“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(用户名)给你个详细解释
至于最后一个节点无法删除的情况我就不了解了,程序不全
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询