【问题标题】:Display function of Circular Linked List Debugging循环链表调试显示功能
【发布时间】:2021-12-28 10:59:36
【问题描述】:

我尝试使用诸如插入、删除位置等功能实现循环链​​接列表,然后根据位置变化重复插入或删除。但是有一种情况,最初列表尚未创建,我想在位置 1 插入。我的程序应该允许这样做,并且应该为上述情况的其他位置提供无效位置。但是,每当我尝试这样做时,它都会在 while 循环中显示期间给我分段错误。请帮忙。我的代码是:

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

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

typedef struct node node;

node *head;
int count=0;



void insert(int d,int pos)
{
    if((pos==(count+1))||(head==NULL))
    {
        addnode(d);
    }
    else
    {
        if(pos==1)
        {
            node *newnode = (node *)malloc(sizeof(node));
            newnode->data = d;
            newnode->next = head;
            head = newnode;
            tail->next = newnode;
        }
        else
        {
            int a = 1;
            node *temp = head;
            while(a!=(pos-1))
            {
                temp = temp->next;
                a++;
            }
            node *newnode = (node *)malloc(sizeof(node));
            newnode->data = d;
            newnode->next = temp->next;
            temp->next = newnode;
        }
        count++;
    }
}

void display()
{
    node *temp = head;
    if(head==NULL)
    {
        printf("Empty List \n");
        return;
    }
    while(temp->next != head)       
    {
        printf("%d ",temp->data);
        temp = temp->next;
    }
    printf("%d %d\n",temp->data,temp->next->data);
}

【问题讨论】:

  • 请将代码缩减为minimal reproducible example。也就是说,删除所有不是重现问题所必需的代码。例如,删除所有用户输入代码,只删除硬编码测试值。同样删除菜单系统,只需硬编码重现问题所需的最小函数调用序列。以此类推。
  • 好的@kaylum让我试试。
  • @kaylum 我试过但同样的问题。
  • 我想你误会了。 Stack Overflow 问题的一个要求是它们必须显示代码的最小示例。因此,您需要删除所有不必要的代码来更新问题。请参阅 How to Askminimal reproducible example 了解有关预期内容以及如何创建最小示例的更多信息。
  • 哦,好的,谢谢。我是堆栈溢出的新手。下次我会记住的。谢谢

标签: c segmentation-fault circular-list


【解决方案1】:

当列表为空时,即head 为NULL,您的addnode 不会创建循环列表。

您的代码会将newnode-&gt;next 设置为NULL(因为head 为NULL),但您想要的是newnode-&gt;next = newnode 来获得一个循环列表。

所以在addnode 里面你需要:

    ...
    if(head==NULL)
    {
        head = newnode;
        tail = newnode;
        newnode->next = newnode;
    }
    ...

或者,您可以将行 newnode-&gt;next = head; 移动到 if-else 子句之后。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-12
    • 2022-01-12
    • 2016-05-20
    • 1970-01-01
    • 1970-01-01
    • 2013-07-15
    • 1970-01-01
    • 2020-06-01
    相关资源
    最近更新 更多