C语言 为什么我的堆栈实现不起作用,并给出错误“分段故障(内核转储)”

pcww981p  于 2022-12-02  发布在  其他
关注(0)|答案(2)|浏览(127)

为什么我的堆栈实现不工作并给出错误“Segmentation fault(core dumping)”下面是代码'

#include <stdio.h>
#include <stdlib.h>
struct node
{
    int data;
    struct node *next;
};

int main()
{
    struct node *head, *newNode, *temp;
    head = 0;
    int choice=1;
    while(choice)
    {
        
        newNode = (struct node *)malloc(sizeof(struct node));
        printf("Enter Data: \n");
        scanf("%d", &newNode->data);
        newNode->next = 0;
        if (head == 0)
        {
            head=newNode;
        }
        else{
            temp->next=newNode;
            temp=newNode;
        }
        printf("Do You Want to Continue(0,1)?\n");
        scanf("%d",&choice);
        
        }

        temp=head;
        while(temp!=0){
            printf("%d",temp->data);
            temp=temp->next;
    }
    return 0;
}

我试图实现链接列表,但收到错误“分段错误(内核转储)”

kmynzznz

kmynzznz1#

错误在行中

temp->next=newNode;

您必须为temp分配空间,或者将temp更改为指向已分配的内存块-temp未初始化,因此它指向随机内存。由于您尚未为temp分配内存,更改temp->next将更改属于其他位置的内存,这将导致分段错误。
放进去

if (head == 0)
{
    head=newNode;
    temp = head=newNode;
}
ff29svar

ff29svar2#

对于初学者来说,你并没有实现一个栈,因为你并没有试图在栈的顶部添加新的节点,你只是试图实现一个单链表。
至于这个else语句中的问题则

else{
        temp->next=newNode;
        temp=newNode;
    }

使用了具有不确定值的未初始化指针temo。请参见其声明

struct node *head, *newNode, *temp;

所以这句话

temp->next=newNode;

调用未定义的行为。
您需要在if语句中初始化它

if (head == 0)
    {
        head=newNode;
        temp = head;
    }

如果您确实想实现一个堆栈,那么您应该编写以下代码来代替if-else语句

newNode = malloc(sizeof(struct node));

    printf("Enter Data: \n");
    scanf("%d", &newNode->data);

    newNode->next = head;
    head = newNode;

在这种情况下,您将使用LIFO(最后输入-第一输出)数据结构。
注意,当不再需要堆栈时,应释放所有已分配的内存。

while ( head != NULL )
{
    temp = head;
    head = head->next;
    free( temp );
}

相关问题