#include<stdio.h>
#include<stdlib.h>
struct node {
char str[200];
int nn;
struct node* next;
};
int number;
struct node* start=NULL;
struct node* current;
//function to insert into the list
void insert() {
struct node* n;
n=(struct node*)malloc(sizeof(struct node));
n->str=malloc(sizeof(char) * 1000);
printf("please enter the data that you would like to insert: ");
gets(n->str);
printf("asdasdasdasd");
n->next=NULL;
if( start==NULL ) {
start->next=n;
current=n;
}
else {
current->next=n;
current=n;
}
printf("done\n");
}
void display() {
current=start;
int i=0;
while( current->next!=NULL ) {
printf("node%d= %s\n",++i,current->str);
current=current->next;
}
printf("this the end");
}
int main() {
char c;
int input;
do {
printf("Select from the following options:\n"
"1.Display list\n"
"2.Add to list\n"
"3.delete from list\n");
scanf("%d",&input);
switch (input) {
case 1: display(); break;
case 2: insert(); break;
// case 3: delete(); break;
default : printf("Please select 1 , 2 or 3\n");
}
printf( "would you like to continue?(y/n)\n");
scanf("%s",&c);
} while(c=='y');
return 0;
}
这在插入功能A SEGMENTATION FAULT中给我一个错误!
我尝试过但事实并非如此。我指点有点弱,实际上很困惑!
请告诉我我做错了什么,请帮帮我。忘记我的链表逻辑,让它错了。我只是想知道为什么会发生分段错误!
答案 0 :(得分:3)
由于您没有告诉我们您的段错误发生的行,我只能猜测。
至少这些线条对我来说听起来很虚伪:
if( start==NULL ) {
start->next=n;
current=n;
}
您确定要start
时NULL
取消引用吗?这就是你在start->next
做的事情。解除引用NULL
会导致段错误。
也许这会按照你期望的方式运作:
if( start==NULL ) {
start=n;
current=n;
}
所以基本上,如果尚未定义start
,请定义它,它也会成为您当前的项目。
答案 1 :(得分:3)
你有很多错误,但你的崩溃是因为你没有分配开始
n->next=NULL;
if( start==NULL ) {
start->next=n;
current=n;
}
else {
current->next=n;
current=n;
你询问start是否为null,如果是,你试着通过调用start-&gt; next来读它。你需要先分配它。
答案 2 :(得分:2)
编译错误
n->str=malloc(sizeof(char) * 1000);
这是地址重新分配一个常量!!!!!你正在改变数组的地址???
危险功能,执行概率为25%。
gets(n->str);
在空指针处设置值!!!
struct node* start=NULL;....
start->next=n;
工作代码示例
#include<stdio.h>
#include<stdlib.h>
struct node {
char *str;
int nn;
struct node* next;
};
int number;
struct node* start=NULL;
struct node* current;
//function to insert into the list
void insert() {
struct node* n;
n=(struct node*)malloc(sizeof(struct node));
n->str=(char*)malloc(sizeof(char) * 1000);
printf("please enter the data that you would like to insert: ");
scanf("%s",n->str);
printf("asdasdasdasd");
n->next=NULL;
if( start==NULL ) {
//start->next=n;
current=n;
}
else {
current->next=n;
current=n;
}
printf("done\n");
}
void display() {
current=start;
int i=0;
while( current->next!=NULL ) {
printf("node%d= %s\n",++i,current->str);
current=current->next;
}
printf("this the end");
}
int main() {
char c;
int input;
do {
printf("Select from the following options:\n"
"1.Display list\n"
"2.Add to list\n"
"3.delete from list\n"
);
scanf("%d",&input);
switch (input) {
case 1: display(); break;
case 2: insert(); break;
// case 3: delete(); break;
default : printf("Please select 1 , 2 or 3\n");
}
printf( "would you like to continue?(y/n)\n");
scanf("%s",&c);
}while(c=='y');
return 0;
}
答案 3 :(得分:2)
您应该使用调试器(而不是我们)来查找有关该问题的更多信息。
例如gdb(GNU Debuger)。
答案 4 :(得分:1)
if( start==NULL ) {
start->next=n;
current=n;
}
我觉得你这里有点问题; - )
答案 5 :(得分:1)
下一行不安全:
scanf("%s",&c);
scanf添加了终结空字符'\ 0',在您的情况下会破坏堆栈。