2015-02-21 4 views
0

Эта программа всегда дает мне ошибку сегментации, когда я добавляю последний узел, что может быть возможной причиной. он появляется только при добавлении последнего узла, я прокомментировал строку, в которой я получаю ошибку сегментации. Я новичок в программировании.В чем причина этой ошибки сегментации в этой программе Linked List?

#include<stdio.h> 
#include<stdlib.h> 

struct node{ 
     int data; 
     struct node *next; 
}; 


struct node *createNode(int val){ 
     struct node *ret=(struct node *)malloc(sizeof(struct node)); 
     ret->data=val; 
     ret->next=NULL; 
     return ret; 
} 


struct node *addNode(struct node *ll,int val){ 
     //Gives error here for the last node, it creates the node succesfull but this step give segmentation fault 
     struct node *new_node=createNode(val); 
     new_node->next=ll; 
     return new_node; 
} 

void printList(struct node *ll){ 
     printf("printing list"); 
     struct node *temp=ll; 
     while(temp->next){ 
       printf("%d ->",temp->data); 
       temp=temp->next; 
     } 
} 

int main(){ 
     struct node *head; 
     head=addNode(head,3); 
     head=addNode(head,5); 
     head=addNode(head,1); 
     head=addNode(head,9); 
     printList(head); 
} 
+3

Вы пытались запустить его через отладчик? Если нет, сделайте это и соблюдайте значение всех переменных в видимости, ищите что-нибудь подозрительное. –

+0

Возможно, вам понравилось читать здесь: http://ericlippert.com/2014/03/05/how-to-debug-small-programs/ – alk

+0

Я ожидал, что код сработает здесь: 'printList() ' – alk

ответ

3
struct node *head; 

head не инициализирован так что использование неинициализированных переменных приводит к неопределенному поведению. Инициализируйте свой head до NULL перед добавлением узлов.

struct node *head = NULL; 

DO NOT CAST MALLOC AND FAMILY

1

NULL Присвоить к голове.

struct node * head=NULL; 

, потому что в AddNode вы делаете, как это,

new_node->next=ll; 

Затем во время печати узел сделать условие, как это,

while(node){ 
... 
} 

Если вы используете node>next вы будете проигрыш последнее значение в связанном списке.

Don't cast malloc и семья.

0

Вы столкнулись с этой проблемой, потому что когда вы добавляете новый узел в список ссылок, вы добавляете этот узел в начало списка ссылок.

Первоначально:

struct node* head; //This is not NULL.Big mistake by you.But this is not the only problem. 

Неисправность сегментации там, потому что вы пытаетесь получить доступ к недопустимой области памяти в printList(), как указатель последнего узла (который впервые был объявлен вами как head) не указует на любое допустимое место памяти. Попробуйте прокомментировать вызов printList(), вы увидите, что эта ошибка. Но это не то решение, которое вы ищете, даже если вы инициализируете голову до NULL, вы столкнетесь с проблемой, когда последний узел не будет распечатан. для этого использования: -

while(temp) 

в printList().

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