在Beginning中插入链接列表

时间:2015-02-19 18:54:12

标签: c linked-list

我正在尝试使用C基本创建链表。我编写了以下代码,该代码一直工作到第一个节点,但最终在第二个节点上失败。我认为问题是我试图在列表中显示由箭头( - >)分隔的节点值。我认为我的逻辑是正确的,但请纠正我。提前致谢

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

struct node
{
    int number;
    struct node *next;
};

typedef struct node NODE;
NODE *node1, *node2, *start, *save;

int main()
{
    node1 = (NODE *)malloc(sizeof(NODE));

    int i = 0;
    start = NULL;

    for(i = 0; i < 3; i++)
    {
        int inf;

        printf("Enter node value:");
        scanf("%d", &inf);

        node1->number = inf;
        node1->next = NULL;

        if(start == NULL)
        {
            start = node1;
            save = node1;
        }
        else
        {
            // save=start;
            // start=node1;
            // node1->next=save;
            node1->next = start;
            start = node1;
        }

        while(node1 != NULL)
        {
            printf("%d ->",node1->number);
            node1 = node1->next;
        }
   }

   return 0;
}

3 个答案:

答案 0 :(得分:1)

问题是

  • 如何分配您的节点以进行插入(即保存为1,您不是)。
  • 修复上述内容后,如何将它们放入列表中。
  • 不要在C程序中使用malloc(请阅读here了解原因)。
  • 未能检查scanf调用是否成功。
  • 未能检查malloc调用
  • 是否成功

在你气馁之前,你做的事情正确

  • 屏蔽typedef
  • 中的节点指针
  • 正确包含MCVE以供审核
  • 展望你可能做错的事情。

将三个值迭代到链表中的非常简单示例如下所示:

#include <stdio.h>
#include <stdlib.h>

struct node
{
    int number;
    struct node *next;
};

typedef struct node NODE;

int main()
{
    NODE *head = NULL, *p;
    int i = 0;

    for(i = 0; i < 3; i++)
    {
        int inf;

        printf("Enter node value:");
        if (scanf("%d", &inf) == 1)
        {
            p = malloc(sizeof *p);
            if (p != NULL)
            {
                p->number = inf;
                p->next = head;
                head = p;
            }
            else
            {
                perror("Failed to allocate new node");
                return EXIT_FAILURE;
            }
        }
        else
        {
            // failed to read data. break
            break;
        }

        // report current linked list
        printf("%d", p->number);
        for (p=p->next; p; p = p->next)
            printf(" -> %d", p->number);
        fputc('\n', stdout);
    }

    // cleanup the linked list
    while (head)
    {
        p = head;
        head = head->next;
        free(p);
    }
    head = NULL;

    return 0;
}

<强>输入

在提示时输入值1 2 3

<强>输出

Enter node value:1
1
Enter node value:2
2 -> 1
Enter node value:3
3 -> 2 -> 1

祝你好运。

答案 1 :(得分:0)

您应该在malloc()循环内使用for。 因为它在外面,所以使用相同的内存。

答案 2 :(得分:0)

正如Vamsi所说,你应该使用malloc将节点放在堆上。您通常也不应该投出malloc的输出,这是不需要的。然后你就可以制作一个双向链表,你的prev内也有一个struct指针。