c - 无法打印链表



我无法打印整个链表。我的错误是什么?我是链表的新手。

这是基础结构

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. Insertn5. Print Listn");
    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: %dtAge: %dn", temp->id, temp->age);
                temp = temp->next;
            }
        }
    }
}

谢谢你的帮助。

你从不初始化initial任何东西,即使是NULL0,所以你不可能明智地从中追逐列表。

您还需要在两次scanf()呼叫之后和分配insert = insert->next;之前设置insert->next = NULL;。 您需要以某种方式insert挂钩到原始列表中;也许在宣布并在insert = insert->next;之前if (initial == 0) initial = insert;struct data *initial = 0;.

您还需要执行更多的错误检查:scanf()malloc()都可能失败,当它们失败时,您应该做一些明智的事情。

除了@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. insert变得insert->next .但是insert->next在声明之前没有初始化为任何内容。在声明的最后,insert指出了一些完全不可预测的事情。
  4. 您已经忘记了您分配的内存,因为没有任何内容指向它。

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

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

这里发生了什么?

  1. 您重复了相同的过程。
  2. 您已经忘记了两次调用 malloc 分配的内存。
  3. insert仍然指出一些不可预测的事情。

每次执行该循环时,都会重复此过程。

这是您可以修复它的方法。

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;
    }
}

希望这是有道理的。

相关内容

  • 没有找到相关文章

最新更新