c编程语言中的链表

时间:2014-06-05 10:10:48

标签: c linked-list

我正在尝试一个示例链接列表程序。以下代码有什么问题?当我尝试访问值时...出现分段错误。我无法访问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;
}

4 个答案:

答案 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;
}