我无法打印整个链表。我的错误是什么?我是链表的新手。
这是基础结构
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
任何东西,即使是NULL
或0
,所以你不可能明智地从中追逐列表。
您还需要在两次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;
}
首次执行此块时,请执行以下操作:
- 为
struct data
创建内存,并让insert
指向它。 - 填写
struct data
中的数据。 - 让
insert
变得insert->next
.但是insert->next
在声明之前没有初始化为任何内容。在声明的最后,insert
指出了一些完全不可预测的事情。 - 您已经忘记了您分配的内存,因为没有任何内容指向它。
第二次执行此块时,请执行以下操作:
- 为
struct data
创建内存,并让insert
指向它。 - 填写
struct data
中的数据。 - 让
insert
变得insert->next
.但是insert->next
在声明之前没有初始化为任何内容。在声明的最后,insert
指出了一些完全不可预测的事情。 - 您已经忘记了您分配的内存,因为没有任何内容指向它。
这里发生了什么?
- 您重复了相同的过程。
- 您已经忘记了两次调用
malloc
分配的内存。 -
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;
}
}
希望这是有道理的。