2012-01-13 3 views
0

Ive просмотрел некоторые из предыдущих сообщений о переполнении стека перед публикацией этого. Каждый раз, когда я пытаюсь запустить это на ideone.com (который использует движок SPOJ), я получаю ошибку времени выполнения SIGSEGV, и я в тупике. Может ли кто-нибудь помочь мне? Ive заметил линию, где я думать я мог бы пойти не так ..Ошибка SIGSEGV при вставке в связанный список

//MY CODE TO INSERT INTO A LINKED LIST 
#include<iostream> 
#include<malloc.h> 

using namespace std; 

struct Node 
{ 
int data; 
struct Node *link; 
}; 
struct Node *node =NULL; //suspected error..not sure 

void insert(int item) 
{ 
if(node==NULL) 
{ 
     node->data=item; 
     node->link=NULL; 
} 
else 
{ 
    struct Node *temp; 
    temp=node->link; 
    node->data=item; 
    node->link=temp; 
} 
} 

void display() 
{ 
if(node==NULL) 
    cout<<"Linked list is empty!"; 
while(node!=NULL) 
{ 
    cout<<node->data<<" "; 
    node=node->link; 
} 
}   
int main() 
{ 
int n; 
    cin>>n; 
    display(); 
    insert(n); 

     display(); 
return 0; 
} 
+0

Ваш код даже не близко справа. 'Display()' function "забывает", где исходный старт связанного списка, ваш код для 'insert()' разделяет указатель после того, как вы JUST FINISHED подтвердили, что это NULL. Пожалуйста, используйте Google для рабочего примера простой реализации связанного списка и начинайте оттуда. – Celada

+0

Или еще лучше, возьмите книгу и начните читать – Aamir

+0

Спасибо за ваши входные данные @ Celada.Shall работают над ними – wave5459

ответ

1

Вы не выделяющий память для узла. Вы должны сделать это в функции вставки:

node = new Node(); 

И только после этого, вы должны начать заполнять data и link в вашем узле. Сделайте это как в случае if, так и else.

Исправленный код будет что-то вроде следующего (я не запустить его через компилятор, так что проверить на наличие ошибок компилятора):

void insert(int item) 
{ 
if(node==NULL) 
{ 
     node = new Node(); 
     node->data=item; 
     node->link=NULL; 
} 
else 
{ 
    struct Node *temp = new Node(); 
    temp=node->link; 
    node->data=item; 
    node->link=temp; 
} 
} 

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

+0

Да, да .. Я вижу свою ошибку сейчас. Спасибо. – wave5459

1

Вы никогда не выделяете память для новых создаваемых вами Node.

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