【问题标题】:Trying to make a reverse circular singly linked list where each node is added at the front of the list but all the succeeding nodes are lost试图制作一个反向循环单链表,其中每个节点都添加到列表的前面,但所有后续节点都丢失了
【发布时间】:2021-11-17 04:05:53
【问题描述】:

用 C 语言编写了一个反向循环单链表的程序,其中每个节点都应添加到列表的前面,但由于某种原因,所有后续节点都在此过程中丢失。无法确定这是代码编写中的逻辑缺陷还是某些错误/错字。 代码如下:

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

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

int main()
{
    struct node *start, *p;
    int n;
    printf("Enter length of list: ");
    scanf(" %i", &n);
    start = NULL;
    for (int i = 0; i < n; i++)
    {
        p = malloc(sizeof(struct node));
        printf("Enter data: ");
        scanf(" %i", &p->data);
        if (start == NULL)
        {
            p->next = start;
            start = p;
        }
        else
        {
            p->next = start->next;
            start = p;
        }
    }
    p = start;
    printf("List entered is: ");
    for (p = start; p->next != start; p = p->next)
    {
        printf("%i\t", p->data);
    }
    printf("%i", p->data);
    return 0;
}

【问题讨论】:

  • p-&gt;next = start-&gt;next; 看起来不对。如果您考虑一下start 指向的内容(以及下一行如何修改start),它应该是p-&gt;next = start;
  • 如果你添加到列表的前面,你不需要检查是否有任何节点。 p-&gt;next = start; start = p; 可以使用任何一种方式,只要列表为空时start 为 NULL。
  • 我已将您对问题的编辑还原。请不要更正您问题中的代码以使其正常工作。它使答案看起来无关紧要。而是用接受标记标记提供修复的答案。这就是这个网站的运作方式。

标签: c data-structures linked-list circular-list


【解决方案1】:

问题是p-&gt;next = NULL 为第一个分配的p。 在p-&gt;next 中取消引用p 等于NULL未定义的行为。所以任何事情都有可能发生。

现在修复 您需要保留对列表中最后一个元素的引用,以将其 next 设置为新创建的节点 p。我们的名字是end

在初始步骤中,只需形成一个微微圆形列表 (p-&gt;next = p),然后将 startend 指向它。

每次迭代都会使新分配的p 重新开始,更新end-&gt;next 以指向p

内部分配循环可以改写为:

  for (int i = 0; i < n; i++) {
        p = malloc(sizeof(struct node));
        printf("Enter data: ");
        scanf(" %i", &p->data);
    if (start) {
        p->next = start;
        end->next = p;
        start = p;
    } else {
        p->next = p;
        start = end = p;
    }
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-18
    • 1970-01-01
    • 2013-07-26
    相关资源
    最近更新 更多