2013-09-09 5 views
0

Когда я запускаю следующую программу C для создания связанного списка в gcc-компиляторе в ubuntu 13.04, я получаю сообщение: Ошибка сегментации (сбрасывание ядра) после того, как элементы списка ввод от пользователя, без дальнейших действий. Незлая помощь.связанный список создания ошибки во время выполнения

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

не произносить результат malloc! –

+0

Используйте отладчик, такой как gdb, для анализа основного дампа/шага по программе, чтобы увидеть, где именно он сбой и почему. – laalto

ответ

1

Похоже, вы имели в виду, чтобы сделать

start = NULL; 
    prev = NULL; 

в начале, а также правильно -

prev->next = ptr; 

в

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

или переместить его в раздел else (до prev = ptr).

Таким образом, первая итерация сделала бы начальную точку для первого элемента, а следующие - сделать предыдущий элемент точкой для текущего ptr.

Кстати, некоторые связанные списки содержат фиктивный элемент «якорь» для более простого обслуживания, но в вашем случае я вижу, что вы ожидаете, что данные будут отображаться с первого элемента.

0

, когда я раздеть свой код, я пришел к этому Seltsamkeit:

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

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

начало никогда не может быть NULL в этом контексте

Я обычно использую «головы» и «рядом» для указателя в рабочую память и «список» в качестве запущенного указателя на последний элемент списка для действительно выделенного связанного с памятью списка. Metacode является:

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 
} 
+0

Спасибо за ваш ответ. Я понимаю, что если я выделил пространство памяти для начала, он не будет указывать на NULL изначально, а на некоторое количество мусора. Infact, при удалении распределений памяти prev и start перед циклом for моя программа запустилась. Но «start» и «prev» являются указателями N *, как и «ptr», тогда почему «ptr» нуждается в распределении памяти, но «prev» и «start» нет? –

+0

указатель указывает на некоторую память (или на NULL). Более чем один указатель может указывать на память SAME. память (реальное выделенное пространство в куче машины) вы получаете через malloc(). –

+0

Извините за поздний ответ. Но я сомневаюсь, что «start» и «prev» - не простые указатели, а скорее значения типа структуры и удерживания в форме prev-> info. Как он может работать, не будучи динамически распределенным по крайней мере одним блоком памяти с размером типа данных структуры? –

Смежные вопросы