头未在链接列表中正确链接 [英] Head not linked correctly in linked list
本文介绍了头未在链接列表中正确链接的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
从链接列表中删除元素后显示时,将显示0以代替删除的元素。我有麻烦更新节点。任何人请解释发生了什么?为什么显示0?
When i display after removing a element from linked list, 0 is displayed in place of removed element. I am having trouble updating the nodes.Can anyone Please explain what is happening? Why 0 is displayed?
#include<iostream>
#include<stdlib.h>
using namespace std;
class node {
public:
int data;
node *link;
};
class linkedlist {
node *head;
public:
linkedlist() {
head=NULL;
}
int add(int data1) {
node *insertnode=new node;
insertnode->data=data1;
insertnode->link=NULL;
node *temp=head;
if(temp!=NULL)
{
while(temp->link!=NULL)
{
temp=temp->link;
}
temp->link=insertnode;
}
else{head=insertnode;}
}
void disp()
{
node *temp1=head;
cout<<endl;
if(temp1==NULL)
{
cout<<"Empty"<<endl;
}
if(temp1->link==NULL)
{
cout<<temp1->data<<endl;
}
else {
do {
cout<<temp1->data<<endl;
temp1=temp1->link;
} while(temp1!=NULL);
}
}
int remove(int removedata)
{
node *previous;
node *temp2=head;
if(temp2==NULL)
{exit(0);}
if(temp2->link==NULL)
{
delete temp2;
head=NULL;
}
else
{
while(temp2!=NULL)
{
if(temp2->data==removedata)
{
previous=temp2;
delete temp2;
}
temp2=temp2->link;
}
}
}
};
int main()
{
linkedlist list;
list.add(10);
list.add(100);
list.add(200);
list.remove(10);
list.disp();
}
显示的输出是:
0
100
200
推荐答案
这与此答案密切相关, a href =http://stackoverflow.com/q/14118775/78845>您的上一个问题。
This is closely related to this answer to your previous question.
让我们格式化此函数并关闭
Let's format this function and take a closer look.
int remove(int removedata)
{
node* previous; // Why is this unintialised?
node* temp2 = head; // Can you think of a more meaningful name for this
// variable? Perhaps "current"?
if (temp2 == NULL)
{
exit(0); // Do you really want to exit the program if you try to
// remove an item from an empty list? Is there a better way
// to handle this?
}
if(temp2->link == NULL) // What is so special about a linked list with one element?
{
delete temp2; // You've not checked to see if this element is
// `removedata`
head = NULL; // So calling this function for any list with one element
// results in an empty list. This is probably
// undesirable
}
else
{
while (temp2 != NULL) // Consider using a for-loop for iteration. It
// couples the increment(s) with the
// terminating condition.
{
if (temp2->data == removedata) // At this point we have found
// our candidate for removal
{
previous = temp2; // This is not the "previous" node, but
// the "current" one. And this variable is
// never used. You do need to know where
// the previous node is and whether it is
// 'head' to update either the 'link' or
// 'head'
delete temp2; // This does remove the correct node but
// leaves the previous 'link' pointer
// dangling and any subsequent nodes are
// orphaned.
}
temp2 = temp2->link; // See comment above about for-loops.
}
}
} // This function is declared `int` but has no return statement.
另一个实现可能看起来像这样(未测试):
An alternative implementation may look something like this (untested):
void remove(int removedata)
{
for (node* current = head, * previous = NULL;
current;
previous = current, current = current->link)
{
if (current->data == removedata)
{
if (previous)
{
previous->link = current->link;
}
else
{
head = current->link;
}
delete current;
break;
}
}
}
这篇关于头未在链接列表中正确链接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文