我需要有关链接列表的以下代码的帮助:
#include <stdlib.h>
#include <stdio.h>
struct nodo {
int d;
struct nodo *next;
};
struct nodo *full();
int main()
{
struct nodo *l;
/* l=(struct nodo *)malloc(sizeof(struct nodo)); */
l = full();
while(l!=NULL) {
printf("-->%d\n", l->d);
l =l->next;
}
system("PAUSE");
}
struct nodo *full()
{
int i;
struct nodo *head, *nes;
head = (struct nodo *)malloc(sizeof(struct nodo));
head->next = NULL;
for(i = 1; i < 5; i++) {
nes = (struct nodo *)malloc(sizeof(struct nodo));
printf("Insert the %d element:\n", i);
scanf("%d", &nes->d);
nes->next = head;
head = nes;
}
return head;
}
如果我尝试输入1, 2, 3, 4
,我会得到以下输出:
-->4
-->3
-->2
-->1
-->9708864
为什么我会得到最后一个号码?我的代码出了什么问题?
答案 0 :(得分:3)
正如@Vinska在评论中指出的那样,full()
的第3行不是必需的;它正在创建一个额外的节点。
有问题的行是
head = (struct nodo *)malloc(sizeof(struct nodo));
相反,说
head = NULL
使用现有代码,您的链接列表包含5个元素。第一个是在上述行上创建的。正如预期的那样,其余四个项目在循环中创建,共计5个元素。
9708864
号码是垃圾值。当你打电话给malloc()
时,无论发生在记忆中的是什么。这就是你必须初始化所有变量的原因!或者,在这种情况下,使用memset()
或calloc()
将这些块设置为某个合理的值。 (但是,无论如何,这条线完全是多余的。)
答案 1 :(得分:0)
在您的代码中,我没有看到您保留链接列表的开头。我会这样做:
struct nodo *full()
{
int i;
struct nodo *head, *nes;
head = (struct nodo *)malloc(sizeof(struct nodo));
nes = head;
for(i = 1; i < 5; i++) {
nes->next = (struct nodo *)malloc(sizeof(struct nodo));
printf("Insert the %d element:", i);
scanf("%d", &nes->d);
printf("%s","\n");
nes = nes->next;
}
return head;
}
这将创建列表的头部,但随后使用“running”或“current”列表指针 - nes - 作为列表创建者。
在创建列表时,head仍然指向列表的头部。
我做了另一个修改,以便在您输入数字后发生行终止符。