我尝试在C中创建链接列表,允许用户插入数据,打印列表并退出程序。我可以插入数据并打印列表一次,但当我尝试再次打印列表时,它会将列表显示为空。标头的地址已更改为NULL
。
#include <stdio.h>
#include <stdlib.h>
struct Node* head;
struct Node
{
int data;
struct Node* next;
};
void Insert(int x)
{
struct Node* temp=(struct Node*)malloc(sizeof(struct Node));
temp->data=x;
temp->next=head;
head=temp;
}
print()
{
printf("%d",head);
printf("\nthe list is\n");
while(head!=NULL)
{
printf("%d\t",head->data);
head=head->next;
}
}
int main()
{
//head=NULL;
int n,i,x,option;
do
{
printf("\n1.Insert 2.Print 3.Exit");
printf("\nenter option:");
scanf("%d",&option);
if(option==1){
printf("\nTotal no to be entered:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("\nEnter the number:");
scanf("%d",&x);
Insert(x);
}}
else{
if(option==2){
print();
}
}
}while(option!=3);
}
答案 0 :(得分:2)
您的print
方法更改 head
指针,因此下次访问该列表时,head
将指向null
。您应该为迭代使用不同的指针:
void print()
{
Node* iter = head;
printf("%d", iter);
printf("\nthe list is\n");
while(iter!=NULL)
{
printf("%d\t",iter->data);
iter=iter->next;
}
}
答案 1 :(得分:1)
您正在使用指针head
将链接列表拖到列表的头部,因此在循环结束时,head
到达列表的末尾,没有任何内容可供打印。
要解决此问题,您需要将head
放在其位置(列表的头部)并使用第二个指针loop_ptr
print()
{ Node* loop_ptr = head;// create a pointer to loop with
printf("%d",loop_ptr);
printf("\nthe list is\n");
while(loop_ptr!=NULL)
{
printf("%d\t",loop_ptr->data);
loop_ptr=loop_ptr->next;// at the end head points always to the head of your list
}
}
Nota Bene:
struct Node* next;
struct Node* head;
处理指针时,这是一种不好的做法。与其他数据结构不同,指针必须始终正确初始化以避免unexpected mess。在您的情况下,您可以这样做:
struct Node* next= NULL;
struct Node* head= NULL;