c语言中的链表

  • 本文关键字:链表 语言 linked-list
  • 更新时间 :
  • 英文 :


我正在尝试一个示例链表程序。下面的代码有什么问题?当我试图访问的值…出现分段故障。我不能访问根目录以外的值。下面的问题是什么?

#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;
}

相关内容

  • 没有找到相关文章