我的链接列表程序在代码块编译器(X0000000005)中以状态-1073741819终止

My linked lists program terminated with status -1073741819 In Code blocks compiler(x0000000005))

本文关键字:X0000000005 状态 终止 -1073741819 编译器 列表 链接 程序 代码 我的      更新时间:2023-10-16

这是程序

#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
using namespace std;
struct node
{
    int data;
    node *next;
};
typedef node *list;
bool create(list header){
    return header==NULL;
}
void insert_begining(list header,int item){
    node*p;
    p=new(node);
    if (p=NULL)
    {
        return;
    }
    p->data=item;
    p->next=header;
    header=p;
}
void insert_end(list header,int item){
    list p,q;
    p=new(node);
    p->data=item;
    p->next=NULL;
    if (header==NULL)
    {
        header=p;
    }
    else
    {
        q=header;
        while(q->next!=NULL){
            q=q->next;
        }
        q->next=p;
    }
}
void print_list(list header){
    node* p;
    p=header;
    while(p->next!=NULL){
        cout<<p->data<<endl;
        p=p->next;
    }
}
int main(){
    list header;
    create(header);
    insert_end(header,500);
    insert_end(header,600);
    insert_end(header,4);
    insert_end(header,6);
    print_list(header);
    return 0;
}

我运行该程序,并显示

流程返回-1073741819(0xc0000005)执行时间:6.720 S

我真的不知道为什么。我认为语法是正确的请检查上面的程序,并告诉我该怎么做。我是一个初学者,我对链接列表的了解不多

首先,您需要了解通过价值与通过参考的传递。在前一种情况下,var的复制将传递,在后者中,实际var传递了。例如:

void f1(int x) {   // Pass by value
    x = 1;
}
void f2(int& x) {  // Pass by reference
    x = 2;
}
int main() {
    int y = 0;
    f1(y);
    // y is still 0
    f2(y);
    // y is now 2
}

在您的程序中,您按值传递header

void insert_begining(list header,int item){
    // ....
    header=p;    // Only modifying the local var!
}

我会做一些事情:首先,摆脱类型。这是C ,但您没有使用课程,所以我认为您还没有学到它们。而是创建一个链接列表结构:

struct node
{
    int data;
    node *next;
};
struct linked_list {
    struct node *head;
    linked_list() : head(nullptr) {}  // ctor
};

不再需要打字,现在您可以轻松地通过参考来传递。例如:

void insert_begining(linked_list& list, int item){
    // removed for brevity
    p->next = list.head;
    list.head = p;
}

当您声明标题变量时,它不会初始化为null。在C 中声明时,通常不会由编译器初始化变量。

所以当您拨打电话

insert_end(header, 500);

在函数内部执行其他块,因为标题不是空的,而是垃圾值。罪魁祸首是:

 while(q->next!=NULL);

您无法评估 Q->下一个,因为Q指向随机内存位置,因此segfault。您需要在访问变量之前分配给变量。

因此,在您的主函数中添加此信息:

list header = NULL;

为此,您可能想检查Blupix对其他问题的评论。如果编译器支持C 11

,也请使用NULLPTR代替NULL
相关文章: