我正在尝试一个示例链接列表程序。以下代码有什么问题?当我尝试访问值时...出现分段错误。我无法访问root之外的值。以下是什么问题?
#include<stdio.h>
#include<stdlib.h>
struct node{
int val;
struct node* next;
};
void create(int n,struct node** ref){
struct node *temp,*newnode;
newnode=(struct node*)calloc(1,sizeof(struct node));
newnode->val=n;
newnode->next=NULL;
if(*ref==NULL){
*ref=newnode;
temp=newnode;
}
else{
temp->next=newnode;
temp=newnode;
}
return;
}
int main(){
struct node *root=NULL,*p;
int n,i,j=1;
while(j==1){
printf("enter the value...\n");
scanf("%d",&n);
create(n,&root);
//printf("%d",root->val);
printf("Press 1 to continue..\n");
scanf("%d",&j);
}
p=root;
while(p!=NULL){
printf("%d-",p->val);
p=p->next;
}
printf("\n");
return 0;
}
答案 0 :(得分:1)
我认为你只需要将temp声明为静态。至少这对我有用:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
struct node{
int val;
struct node* next;
};
void create(int n,struct node** ref){
static struct node *temp;
struct node *newnode;
newnode=(struct node*)calloc(1,sizeof(struct node));
newnode->val=n;
newnode->next=NULL;
if(*ref==NULL){
*ref=newnode;
temp=newnode;
}
else{
temp->next=newnode;
temp=newnode;
}
return;
}
输出:
enter the value...
1
Press 1 to continue..
1
enter the value...
2
Press 1 to continue..
1
enter the value...
3
Press 1 to continue..
0
1-2-3-
答案 1 :(得分:0)
您尚未为temp添加内存。添加以下第二行。
newnode=(struct node*)calloc(1,sizeof(struct node));
temp=(struct node*)calloc(1,sizeof(struct node));
答案 2 :(得分:0)
您的链接列表创建方法不正确。你没有为temp分配内存,并尝试将newnode分配给temp-&gt; next。 正确如下:
struct node{
int val;
struct node* next;
};
node *lastnode = NULL;
void create(int n,struct node** ref){
struct node *temp,*newnode;
newnode=(struct node*)calloc(1,sizeof(struct node));
newnode->val=n;
newnode->next=NULL;
if(*ref==NULL){
*ref=newnode;
// temp=newnode;
}
else{
// temp->next=newnode;
// temp=newnode;
lastnode->next = newnode;
}
lastnode = newnode;
return;
}
答案 3 :(得分:0)
您的代码有两个问题:
当您尝试访问未启动的temp
时会发生段错误。而且你不需要那个变量和两行
temp=newnode;
不做任何事;变化
temp->next=newnode;
到
(*ref)->next=newnode;
并完全删除temp
。
第二个问题是由
引起的内存泄漏 create(n,&root);
每次具有相同的根值(您的列表当前永远不会超过两个元素)。
int main(){
struct node *root=NULL;
struct node **current = &root;
int n,i,j=1;
while(j==1){
printf("enter the value...\n");
scanf("%d",&n);
/*create(n,&root);*/
create(n, current);
current = &(*current)->next;
//printf("%d",root->val);
printf("Press 1 to continue..\n");
scanf("%d",&j);
}
struct node *p;
p=root;
while(p!=NULL){
printf("%d-",p->val);
p=p->next;
}
printf("\n");
return 0;
}