如何在 ( 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;
我的链表只打印最后一个节点。 我该如何解决我的问题;
我有一个函数可以将示例数据填充到链表中,然后打印所有节点。但是我的代码只打印这张图片:
我的函数是:
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;