链表初学者

时间:2019-01-24 13:37:19

标签: c list

我刚刚开始学习链接列表,但是在创建一个可以读取链接列表的功能时遇到了问题。当我从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);
}

2 个答案:

答案 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));

我不清楚np是否需要分配。我认为您的意思是它们指向已分配的节点。

您可以使用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;
}

有两个原因:

  1. 防止传递的p为NULL
  2. 打印trei

p指向trei时,p->next为NULL。你不想退出 然后循环;您要打印trei,分配p = p->next,然后 测试p。然后,您可以删除printf("%d", p->nr); 循环,因为您必须这样做,因为p将为NULL。 :-)

我的“读取”功能没有其他问题,没有任何原因 它不会打印您的数据。我还要再多加一些 语句,并每次调用 fflush (3),以确保您看到 他们。我敢打赌您的程序没有按照您的想法去做。不去 不过担心。如果您喜欢编程,会发现它很漂亮 正常。

答案 1 :(得分:0)

很遗憾,我无法发表评论,因此,我将此建议写为答案。请仁慈。

检查this article,了解如何在Linux内核中实现链接列表。它可能有点先进,但值得阅读。