无法打印链表

时间:2014-05-13 17:20:25

标签: c struct linked-list

我无法打印整个链表.. 我的错是什么?我是链接列表的新手..

这是基础结构

struct data {
    int id;
    int age;
    struct data *next;
};

主要功能

int main() {
    int mode;
    struct data *initial;
    struct data *insert;
    struct data *temp;

    insert = initial;
    printf("1. Insert\n5. Print List\n");

    while (1) {
        printf("Mode: ");
        scanf("%d", &mode);
        if (mode == 1) {
            insert = malloc(sizeof(struct data));

            printf("Id: ");
            scanf("%d", &(insert->id));

            printf("Age: ");
            scanf("%d", &(insert->age));

            insert=insert->next;
        } else if (mode == 5) {
            temp = initial;
            while (temp != insert) {
                printf("Id: %d\tAge: %d\n", temp->id, temp->age);
                temp = temp->next;
            }
        }
    }
}

谢谢你的帮助。

2 个答案:

答案 0 :(得分:2)

您永远不会将initial初始化为任何内容,甚至不会NULL0,因此您无法合理地追逐列表。

您还需要在两次insert->next = NULL;来电之后和作业scanf()之前设置insert = insert->next;。你需要以某种方式将insert挂钩到原始列表中;可能在struct data *initial = 0;宣布时if (initial == 0) initial = insert;insert = insert->next;之前scanf()

您还需要执行更多错误检查:malloc()和{{1}}都可能失败,并且您应该做一些明智的事情。

答案 1 :(得分:1)

除了@JonathanLeffler提出的观点之外,我在这段代码中看到了问题:

if(mode==1)
{
    insert=malloc(sizeof(struct data));
    printf("Id: ");scanf("%d",&(insert->id));
    printf("Age: ");scanf("%d",&(insert->age));
    insert=insert->next;
}

首次执行此块时,请执行以下操作:

  1. struct data创建内存并让insert指向它。
  2. 填写struct data
  3. 中的数据
  4. insert成为insert->next。但insert->next在声明之前没有初始化为任何内容。在声明的最后insert指出一些完全不可预测的事情。
  5. 你已经忘记了你分配的内存,因为没有任何内容指向它。
  6. 第二次执行此块时,请执行以下操作:

    1. struct data创建内存并让insert指向它。
    2. 填写struct data
    3. 中的数据
    4. insert成为insert->next。但insert->next在声明之前没有初始化为任何内容。在声明的最后insert指出一些完全不可预测的事情。
    5. 你已经忘记了你分配的内存,因为没有任何内容指向它。
    6. 这里发生了什么?

      1. 你重复了同样的过程。
      2. 您已经忘记了两次拨打malloc所分配的内存。
      3. insert仍然指出一些不可预测的事情。
      4. 每次执行该循环时都会重复此过程。

        以下是您可以解决的问题。

        if(mode==1)
        {
            // Allocate memory and let temp point
            // to the allocated memory.
            temp=malloc(sizeof(struct data));
        
            // Fill up the data of the newly allocated memory.
            printf("Id: ");scanf("%d",&(temp->id));
            printf("Age: ");scanf("%d",&(temp->age));
        
            // Make temp clean by making its next point to NULL.
            temp->next = NULL;
        
            // Now figure out where to link this newly allocated
            // memory to the linked list.
        
            // Assuming you initialize insert correctly...
            if ( insert == NULL )
            {
               initial = insert = temp;
            }
            else
            {
               insert->next = temp;
               insert = temp;
            }
        }
        

        希望这是有道理的。