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

时间:2016-12-01 20:23:27

标签: c++ linked-list runtime-error

这是程序

#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

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

2 个答案:

答案 0 :(得分:0)

首先,您需要了解按值传递与按引用传递。在前一种情况下,传递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!
}

我会做的一些事情: 首先,摆脱那种typedef。这是C ++,但你没有使用类,所以我假设你还没有学过它们。而是创建一个链表结构:

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

不再需要typedef,现在您可以通过引用轻松传递。例如:

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

答案 1 :(得分:0)

声明头变量时,它不会初始化为NULL。在C ++中 变量通常不会由编译器在声明时初始化。

所以当你拨打电话时

insert_end(header, 500);

在函数内部执行else块,因为header不是NULL而是垃圾值。罪魁祸首是:

 while(q->next!=NULL);

您无法评估 q-&gt; next ,因为q指向随机内存位置,因此也是segfault。您需要在访问变量之前分配它。

所以在你的main函数中添加:

list header = NULL;

除此之外,您可能想查看BLUPIX关于其他问题的评论。 如果编译器支持C ++ 11

,也使用nullptr而不是NULL