Beginning 中的链表插入

Linked List insertion in Beginning

我正在尝试使用 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;
}

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

正如 Vamsi 所说,您应该使用 malloc 将节点放在堆上。您通常也不应该强制转换 malloc 的输出,这不是必需的。然后你可以尝试制作一个双向链表,其中你的 struct.

中也有一个 prev 指针

问题是

  • 您如何分配用于插入的节点(即,除了一个,您不是)。
  • 解决上述问题后,它们在列表中的位置。
  • 不要在 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

祝你好运。