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

C++ 我的链表程序在代码块编译器(x0000000005)中以状态-1073741819终止,c++,linked-list,runtime-error,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; }

这是节目

#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;
}
#包括
#包括
#包括
#包括
使用名称空间std;
结构节点
{
int数据;
节点*下一步;
};
typedef节点*列表;
bool创建(列表标题){
返回头==NULL;
}
无效插入开始(列表标题,整数项){
节点*p;
p=新(节点);
如果(p=NULL)
{
返回;
}
p->data=项目;
p->next=标题;
标题=p;
}
无效插入\u结束(列表标题,整数项){
列表p,q;
p=新(节点);
p->data=项目;
p->next=NULL;
if(头==NULL)
{
标题=p;
}
其他的
{
q=标题;
while(q->next!=NULL){
q=q->next;
}
q->next=p;
}
}
作废打印列表(列表标题){
节点*p;
p=收割台;
while(p->next!=NULL){

cout首先,您需要了解传递值与传递引用。在前一种情况下,传递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
}
在程序中,您通过值传递
标题

void insert_begining(list header,int item){
    // ....
    header=p;    // Only modifying the local var!
}
我会做一些事情: 首先,去掉TyEndof。这是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;
}

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

所以当你打电话的时候

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

 while(q->next!=NULL);
您无法计算q->next,因为q指向随机内存位置,因此存在segfault。您需要在访问变量之前对其赋值

因此,在主函数中添加以下内容:

list header = NULL;
除此之外,您可能还想查看BLUPIX对其他问题的评论。
如果编译器支持C++11

1)
if(p=NULL)
-->
if(p=NULL),也可以使用nullptr而不是NULL
2)
header=p;
不更改调用方变量。3)
列表头;
未初始化。我是一名初学者,我对链接列表真的不太了解-如果不了解您要编写的内容,编写代码将很困难。请阅读链接列表。如果您搜索go,将有很多可用的链接对于您得到的特定错误,@BLUEPIXY指出。您正在通过值传递
参数,因此无论何时您认为您正在分配给它,实际上您都没有。