如何从用户获取链表的数据

时间:2014-10-26 07:19:28

标签: c pointers linked-list

我尝试在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);
}

2 个答案:

答案 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;