如果我创建1个节点并显示,则以下代码可以正常工作。但是,如果我插入2个或更多节点,则仅显示输入的最后一个节点以及已在链接列表中的节点。例如,如果我链接了3 1 2 4的列表,并且我连续输入2 1 3并调用显示功能,则输出= 3 1 2 4 3.
struct node
{
char info;
node* link;
}*f,*nn,*p,*c;//variables to make new node, head and control previous and current
void create(char inf)
{
if(f=='\0')
{
nn=new node[sizeof(struct node)];
nn->info=inf;
nn->link='\0';
f=c=p=nn;
}
else
{
nn=new node[sizeof(struct node)];
nn->info=inf;
p->link=nn;
c=nn;
c->link='\0';
}
}
void display()
{
c=p=f;
while(c!='\0')
{
cout<<c->info<<" ";
p=c;
c=c->link;
}
cout<<endl;
}
int main()
{
while(3)
{
int sw=0;
cout<<"Enter \n1. to create list \n2. to display list"<<endl;
cin>>sw;
switch(sw)
{
case 1:{
char info;
cout<<"Enter info!"<<endl;
cin>>info;
create(info);
break;
}
case 2:display();
break;
default:
cout<<"Wrong entry, try again!"<<endl;
}
}
}
请原谅,如果事情是如此明显,因为我已尽力找到解决方案。
答案 0 :(得分:1)
问题出在这一行:
p->link=nn;
您正在相同位置添加新节点而不更新“p”。因此,如果添加2个节点,则第二个添加到第一个节点,第一个节点丢失。因此,您总是只看到添加的最后一个。
答案 1 :(得分:1)
我看到的问题:
f
,nn
,p
和c
未初始化。
将行更改为:
struct node
{
char info;
node* link;
};
node *f = NULL;
node* nn = NULL;
node* p = NULL;
node* c = NULL;
更改行
if(f=='\0')
到
if (f == NULL)
这是一种风格变化,但更具可读性。仅使用'\0'
来比较字符。使用NULL
比较指针。
以下行似乎不正确。
nn=new node[sizeof(struct node)];
它分配一个包含sizeof(struct node)
项的对象数组,并返回指向该数组的指针。你只需要一个对象。将行更改为:
nn=new node;
有两条这样的行,if (f=='\0')
下的每个块中有一行。
您未在else
阻止下正确建立链接。
nn=new node[sizeof(struct node)];
nn->info=inf;
p->link=nn; // This is good only for the second item.
// When you add the third item, the second item becomes an orphan.
// When you add the fourth item, the third item becomes an orphan.
c=nn;
c->link='\0';
您需要的是:
nn=new node;
nn->info=inf;
nn->link = NULL;
c->next = nn;
c = nn;
您正在修改p
中的全局变量c
和display
。如果您在调用display
后尝试添加任何其他项目,则会出现意外行为。在display
中使用局部变量可以防止出现此问题。
void display()
{
Node* n = f;
while( n != NULL)
{
cout << n->info << " ";
n = n->link;
}
cout << endl;
}
建议清理
您不需要全局范围内的变量nn
。它仅在create
中使用。将其从全局范围中删除并将其放在create
。
根本不需要全局变量p
。您认为唯一有用的地方是else
区块。但是,正如你所看到的,那里不需要它。
使用NULL
代替'\0'
来比较指针。