我正在尝试一个示例链表程序。下面的代码有什么问题?当我试图访问的值…出现分段故障。我不能访问根目录以外的值。下面的问题是什么?
#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;
}
我认为你只需要声明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-
您的链接列表创建方法不正确。您没有将内存分配给temp,并尝试将newnode分配给temp->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;
}
您没有分配内存给temp.添加下面的第二行。
newnode=(struct node*)calloc(1,sizeof(struct node));
temp=(struct node*)calloc(1,sizeof(struct node));
你的代码有两个问题:
当您试图访问未初始化的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;
}