我无法打印整个链表.. 我的错是什么?我是链接列表的新手..
这是基础结构
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. Insert\n5. Print List\n");
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: %d\tAge: %d\n", temp->id, temp->age);
temp = temp->next;
}
}
}
}
谢谢你的帮助。
答案 0 :(得分:2)
您永远不会将initial
初始化为任何内容,甚至不会NULL
或0
,因此您无法合理地追逐列表。
您还需要在两次insert->next = NULL;
来电之后和作业scanf()
之前设置insert = insert->next;
。你需要以某种方式将insert
挂钩到原始列表中;可能在struct data *initial = 0;
宣布时if (initial == 0) initial = insert;
,insert = insert->next;
之前scanf()
。
您还需要执行更多错误检查:malloc()
和{{1}}都可能失败,并且您应该做一些明智的事情。
答案 1 :(得分:1)
除了@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;
}
}
希望这是有道理的。