链表创建运行时错误

时间:2013-09-09 09:52:09

标签: c linked-list

当我在ubuntu 13.04中的gcc编译器中运行以下用于链接列表创建的C程序时,我收到一条消息:分段错误(核心转储),在从用户输入列表元素之后,没有继续进一步。请帮助。

#include<stdio.h>
#include<stdlib.h>
int main()
{

/* creating a singly linked list,displaying its elements and finding the sum and average of its elements and searching a particular element in it */

typedef struct node
{
   int info;
   struct node *next;
}N;


N *ptr,*start,*prev;
int i,n,x;
ptr=NULL;
start=NULL;
prev=NULL;  

printf("Enter the number of list elements:  ");      
scanf("%d",&n); 

prev = (N*)malloc(sizeof(N));
start = (N*)malloc(sizeof(N));                                     

for(i=0;i<n;i++)
{
   ptr= (N*)malloc(sizeof(N));
   prev->next = ptr;
   printf("enter the %dth element\t\n",(i+1));
   scanf("%d",&x);
   ptr->info = x;

   if(start==NULL)
   {
      start=ptr;
      prev=ptr;
      ptr->next = NULL;
   }
   else
   {
      prev=ptr;
   }
}                          /* linked list created consisting of n nodes */


/* finding sum and average*/

int sum=0;
float avg;
ptr=start;
for(i=0;i<n;i++)
{
   sum =sum + ptr->info;
   ptr = ptr->next;
}
avg = (float)sum/n;             /* summing and averaging completed */

/* displaying data */

ptr=start;
printf("\n The list elements are :  ");
while(ptr != NULL)
   printf("%d\t",ptr->info);
printf("\n");
printf("The sum of list elements is:  %d",sum);
printf("The average of list elements is:  %f",avg);


return 0;
}

2 个答案:

答案 0 :(得分:1)

看起来你打算做

    start = NULL; 
    prev = NULL;

一开始,也正确 -

  prev->next = ptr;

  if (prev != NULL)
      prev->next = ptr;

或将其移至else部分(在prev = ptr之前)。

这样,第一次迭代会使起始点指向第一个元素,而下一个迭代会使prev元素指向当前的ptr。

顺便说一下,一些链接列表包含一个虚拟的“锚点”元素,以便更简单的维护,但在您的情况下,我看到您希望数据已经从第一个元素出现。

答案 1 :(得分:0)

当我剥离你的代码时,我来到这个Seltsamkeit:

start = (N*)malloc(sizeof(N));                                     

for(i=0;i<n;i++) {
   if(start==NULL)

start在此上下文中永远不能为NULL

我通常使用“head”和“next”作为指向工作内存的指针,“list”作为指向真正分配的内存链表的列表的最后一个元素的运行指针。元代码是:

list = NULL;
head = NULL;
for (i = 0; i < n; i++) {
  next = malloc();
  if (head == NULL) {
    head = next; // setting the first haed;
  } else {
    list->next = next; // attaching to the end
  }
  list = next; // pointing to the last element
}