c - 链表无法打印所有元素

标签 c linked-list printf insertion

我正在尝试打印提示用户输入的链接列表。 下面的代码不会打印整个列表,一次只打印最后一个元素。 我好像没发现bug可以请您看一下吗?

#include <stdio.h>
#include <stdlib.h>

struct Node {
    int data;
    struct Node *next;
};

struct Node *head;

void Insert(int x) {
    struct Node *temp = (struct Node *)malloc(sizeof(struct Node));
    temp->data = x;
    temp->next = NULL;
    head = temp;
};

void Print() {
    struct Node *temp = head;
    printf("Linked list is: ");
    while (temp != NULL) {
        printf("%d ", temp->data);
        temp = temp->next;
    }
    printf("\n");
};

int main() {
    head = NULL;
    int i, x;
    for (i = 1; i <= 10; i++) {
        if (i == 1) {
            printf("Enter 1st number: \n");
        } else if (i == 2) {
            printf("Enter 2nd number: \n");
        } else {
            printf("Enter %dth number: \n", i);
        }
        scanf("%d", &x);
        Insert(x);
        Print();
    }
}

最佳答案

temp->next = NULL; 是罪魁祸首。它应该是 temp->next = head;

另一个(更多的极端情况)问题是您的代码无法检查 mallocscanf 中的错误。


编辑回复评论:

如果你想追加(而不是前置),你需要保留一个尾指针用于向前遍历,然后使用虚拟第一个节点(避免分支)或特殊情况插入到空列表.

在一段代码中两者的示例(通过 exit(1) 进行简单的错误处理):

#include <stdio.h>
#include <stdlib.h>

struct Node {
    int data;
    struct Node *next;
};

#define DUMMYFIRST 1 //change to 0 to compile the other variant

#if DUMMYFIRST
    struct Node dummyfirst;
    struct Node *head=&dummyfirst;
#else
    struct Node *tail,*head=0;
#endif

void Insert(int x) {
    struct Node *newnode = malloc(sizeof(struct Node));
    //don't cast the result of malloc in C
    //https://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc

    if(!newnode) { perror("malloc"); exit(1); }
    newnode->data = x;
    newnode->next = 0;

    #if !DUMMYFIRST
        if(!tail) tail = head = newnode;
        else head->next = newnode;
    #else
        head->next = newnode;
    #endif

    head = newnode;
};

void Print() {
    #if DUMMYFIRST
        struct Node *newnode = dummyfirst.next;
    #else
        struct Node *newnode = tail;
    #endif
    printf("Linked list is: ");
    while (newnode != NULL) {
        printf("%d ", newnode->data);
        newnode = newnode->next;
    }
    printf("\n");
};

int main() {
    int i, x;
    for (i = 1; i <= 10; i++) {
        if (i == 1) {
            printf("Enter 1st number: \n");
        } else if (i == 2) {
            printf("Enter 2nd number: \n");
        } else {
            printf("Enter %dth number: \n", i);
        }
        if(1!=scanf("%d", &x)) exit(1);
        Insert(x);
        Print();
    }
}

一种对库更友好的处理错误的方法是将错误传播给调用者,即,不是立即退出并显示错误消息,而是将返回值从 void 更改为指示错误的值,例如以便调用者可以检查并决定要做什么(打印它、以本地化版本打印它、尝试不同的算法......)

例如:

struct Node *Insert(int x) {
    struct Node *newnode = malloc(sizeof(struct Node));
    //don't cast the result of malloc in c
    //https://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc

    if(!newnode) return NULL;
    //...
};
//...
//calling code:
    if(!Insert(x)) perror("Insert"),exit(1);

关于c - 链表无法打印所有元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72430747/

相关文章:

c - uintptr_t 太小,无法存储地址

c - 图数据结构在C中的实现

c - 递归调用清除链表?

linux - 如何为每个运行的脚本设置计时器

c - 带参数函数的 printf 返回指向 char 的指针

c - 在 gdb 中显示函数调用的值

c - 在同一个 C 程序中同时使用 putchar 和 printf ?

c - 简单链表C代码段错误

c - 获取链接列表fgets和scanf C的输入

c - C语言中如何打印引号?