如何在 ( C ) 中打印链表上的所有节点

how to print all node on linked list in ( C )

我的链表只打印最后一个节点。 我该如何解决我的问题;

我有一个函数可以将示例数据填充到链表中,然后打印所有节点。但是我的代码只打印这张图片:

我的函数是:

void FillSamples()
{
    db = (database *)malloc(sizeof(database));
    db->name = "College";

    tables=NULL;

    char na[5];
    int i = 0;
    for (i = 1; i <= 20; i++) {

        temptable = (table *)malloc(sizeof(table));

        itoa(i, na, 10);

        temptable->name = na;
        temptable->next = tables;

        tables = temptable;
    }

    // create links
    db->tables = tables;

    // print sample
    printf("database name = %s \n", db->name);
    temptable=tables;

    while (temptable)
    {
        printf("tables name = %s \n", temptable->name); 
        temptable=temptable->next;
    }
}

您创建节点的代码在列表结构中保存指向 na 的指针:

temptable->name = na;

但是您立即用下一个值覆盖 na,直到最后一个。因此,当您尝试打印时,所有节点都指向 na 的当前值,也就是最后一个

您必须以不同方式存储名称。

  • 一种选择是在结构中使用char name[32];代替char *name;,并使用strcpy(temptable->name, na);设置值。

  • 另一种选择是使用 strdup() 复制字符串:temptable->name = strdup(na);。注意,如果使用strdup(),后面还要用free()释放字符串

在你的循环结束时tables指向列表的末尾。 temptable 也是如此。我建议保存你的第一个 table 指针并在最后遍历它:

 tables=NULL;
 table * begin_ptr = NULL;

 ...

 for (i = 1; i <= 20; i++) {
      ...
      if(!begin_ptr) begin_ptr = temptalbe;
 }
 ...
 db->tables = begin_ptr;
 temptable = begin_ptr;