C 链表创建运行时错误

C 链表创建运行时错误,c,linked-list,C,Linked List,当我在Ubuntu13.04的gcc编译器中运行下面的创建链表的C程序时,我得到一条消息:Segmentation fault(内核转储),在用户输入列表元素之后,不再继续。请帮忙 #include<stdio.h> #include<stdlib.h> int main() { /* creating a singly linked list,displaying its elements and finding the sum and average of its

当我在Ubuntu13.04的gcc编译器中运行下面的创建链表的C程序时,我得到一条消息:Segmentation fault(内核转储),在用户输入列表元素之后,不再继续。请帮忙

#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;
}
#包括
#包括
int main()
{
/*创建单链表,显示其元素,查找其元素的总和和平均值,并搜索其中的特定元素*/
类型定义结构节点
{
国际信息;
结构节点*下一步;
}N;
N*ptr、*start、*prev;
int i,n,x;
ptr=NULL;
start=NULL;
prev=NULL;
printf(“输入列表元素的数量:”);
scanf(“%d”和“&n”);
prev=(N*)malloc(sizeof(N));
start=(N*)malloc(sizeof(N));
对于(i=0;不精确=ptr;
printf(“输入%dth元素\t\n”,(i+1));
scanf(“%d”和&x);
ptr->info=x;
if(start==NULL)
{
启动=ptr;
prev=ptr;
ptr->next=NULL;
}
其他的
{
prev=ptr;
}
}/*创建的链表由n个节点组成*/
/*求和与平均*/
整数和=0;
浮动平均值;
ptr=启动;
对于(i=0;iinfo;
ptr=ptr->next;
}
平均值=(浮点)和/n;/*求和和和平均完成*/
/*显示数据*/
ptr=启动;
printf(“\n列表元素为:”);
while(ptr!=NULL)
printf(“%d\t”,ptr->info);
printf(“\n”);
printf(“列表元素的总和为:%d”,总和);
printf(“列表元素的平均值为:%f”,平均值);
返回0;
}

当我去掉你的代码时,我来到这里:

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

for(i=0;i<n;i++) {
   if(start==NULL)
start=(N*)malloc(sizeof(N));
for(i=0;inxt=next;//附加到末端
}
list=next;//指向最后一个元素
}

看起来你是有意的

    start = NULL; 
    prev = NULL;
在开头,也是正确的-

  prev->next = ptr;

或者将其移动到else部分(在prev=ptr之前)

这样,第一次迭代将使起点指向第一个元素,下一次迭代将使prev元素指向当前ptr


顺便说一下,有些链表有一个虚拟的“锚”元素进行更简单的维护,但在您的情况下,我看到您希望数据已经显示在第一个元素中。

不要强制转换malloc的结果!使用诸如gdb之类的调试器分析内核转储/逐步遍历程序,以查看其崩溃的确切位置和原因。感谢您的答复。我理解如果我为开始时,它最初不会指向NULL,而是指向某个垃圾值。事实上,在for循环之前删除prev和start的内存分配时,我的程序开始运行。但是“start”和“prev”与“ptr”一样都是N*指针,那么为什么“ptr”需要内存分配,而“prev”和“start”不需要?指针指向某个memory(或NULL)。多个指针可以指向同一个内存。通过malloc()获得的内存(计算机堆中实际分配的空间)。很抱歉回复得太晚。但我怀疑的是,“start”和“prev”不是简单的指针,而是结构类型的指针,并以prev->info的形式保留元素值。如果不动态分配至少一个struct数据类型大小的内存块,它怎么还能工作?可以有多个指向同一个N类型对象的指针。发生的情况是,start和prev以NULL开头,不指向任何地方,然后为第一个对象分配空间并将地址放入ptr中,然后将该地址从那里复制到start/prev,并重用ptr分配下一个元素。换句话说,第一个对象分配一次,并且有不同的指针保存其地址Leeor:谢谢Leeor。你的回答告诉我,如果指针通过存储某个对象的地址指向该对象,它不需要单独的内存块,除非它存储一些元素。事实上,这似乎是解释中的一个正确和关键点。那么,你能告诉我->下一个指针指向下一个节点结构吗是真的还是下一个节点中的元素?
  prev->next = ptr;
  if (prev != NULL)
      prev->next = ptr;