这是程序
#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
我真的不知道为什么。我认为语法是正确的 请检查上面的程序并告诉我该怎么做。 我是初学者,我真的不太了解链接列表
答案 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