我刚刚开始学习链接列表,但是在创建一个可以读取链接列表的功能时遇到了问题。当我从switch选择read函数时,它变成空白,什么也没发生(如果我将代码放在main()中,它将起作用)。我在做什么错了?
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct nod
{
int nr;
struct nod *next;
} nod;
int read(struct nod *p)
{
while(p->next != NULL )
{
printf("%d", p->nr);
p=p->next;
}
printf("%d", p->nr);
}
int main()
{
struct nod* trei = NULL;
struct nod* unu = NULL;
struct nod* doi = NULL;
struct nod* p = NULL;
struct nod* n = NULL;
unu = (struct nod*)malloc(sizeof(struct nod));
doi = (struct nod*)malloc(sizeof(struct nod));
trei = (struct nod*)malloc(sizeof(struct nod));
p = (struct nod*)malloc(sizeof(struct nod));
n = (struct nod*)malloc(sizeof(struct nod));
unu->nr = 1;
unu->next = doi;
doi->nr = 2;
doi->next = trei;
trei->nr = 3;
trei->next = NULL;
p = unu;
int meniu = 0;
while(1)
{
printf("1. Read list");
scanf("%d", meniu);
switch(meniu)
{
case(2):
read(p);
break;
}
}
printf("%d", p->nr);
}
答案 0 :(得分:1)
一些建议,没有完整的解决方法。
无需初始化指向NULL的指针,只需一步定义和初始化即可。另外,不要从 void * 进行强制转换,这是 malloc 返回的结果。 C让您隐式地从void指针来回转换;每次转换都是出错的机会。
struct nod* trei = malloc(sizeof(struct nod));
struct nod* unu = malloc(sizeof(struct nod));
struct nod* doi = malloc(sizeof(struct nod));
我不清楚n
和p
是否需要分配。我认为您的意思是它们指向已分配的节点。
您可以使用c99语法在一个语句中初始化您的结构。我认为这种形式要清晰得多。
*unu = (struct nod) { .nr = 1, .next = doi };
*doi = (struct nod) { .nr = 2, .next = trei };
*trei = (struct nod) { .nr = 3, .next = NULL };
帮自己一个忙,不要调用您的函数 read ,除非您 表示要覆盖标准的 read (2)函数。你不是 阅读,您正在举报。也许称之为“印刷”。
循环很尴尬。你想要
while(p != NULL )
{
printf("%d", p->nr);
p=p->next;
}
有两个原因:
p
为NULL trei
当p
指向trei
时,p->next
为NULL。你不想退出
然后循环;您要打印trei
,分配p = p->next
,然后
测试p
。然后,您可以删除printf("%d", p->nr);
循环,因为您必须这样做,因为p
将为NULL。 :-)
我的“读取”功能没有其他问题,没有任何原因 它不会打印您的数据。我还要再多加一些 语句,并每次调用 fflush (3),以确保您看到 他们。我敢打赌您的程序没有按照您的想法去做。不去 不过担心。如果您喜欢编程,会发现它很漂亮 正常。
答案 1 :(得分:0)
很遗憾,我无法发表评论,因此,我将此建议写为答案。请仁慈。
检查this article,了解如何在Linux内核中实现链接列表。它可能有点先进,但值得阅读。