2016-02-07 3 views
-2

В настоящее время я пытаюсь самостоятельно изучить C++ и прохожу через некоторые учебники и пытаюсь сделать некоторые проблемы. Во время обучения указателям я решил попытаться реализовать связанный список самостоятельно. Я написал программу, но продолжаю получать сообщение об ошибке «Ошибка сегментации (core dumped)». Я просмотрел другие подобные вопросы на этом веб-сайте, и хотя в одной теме много, ни одна из них не помогла мне решить мою проблему. Я довольно новичок в программировании и указателях, поэтому любая помощь будет оценена!Ошибка реализации сегментации реализации связанного списка C++ (core dumped)

#include <iostream> 
#include <cstdio> 
#include <cstdlib> 

using namespace std; 


struct node 
{ 
    int element; 
    struct node *next; 
}*start; 


class pointerlist 
{ 
     public: 
       node* CREATE(int num); 
       void ADD(int num); 
       int FIRST(); 
       int END(); 
       int RETRIEVE(int pos); 
       int LOCATE(int num); 
       int NEXT(int pos); 
       int PREVIOUS(int pos); 
       void INSERT(int pos, int num); 
       void DELETE(int pos); 
       void MAKENULL(); 
       pointerlist() 
       { 
         start = NULL; 
       } 
}; 

main() 
{ 
     pointerlist pl; 
     start = NULL; 
     pl.ADD(1); 
     cout << "Added 1" << endl; 
     for (int j=1; j<=5; j++) 
       pl.ADD(j); 
     cout << "The pointer implemented list is: " << endl; 
     for (int i=1; i<=5; i++) 
     { 
       cout << pl.END() << " " ; 
     } 
     cout << endl << endl; 
} 

void pointerlist::ADD(int num) 
{ 
     struct node *temp, *s; 
     temp = CREATE(num); 
     s = start; 
     while (s->next != NULL) 
       s = s->next; 
     temp->next = NULL; 
     s->next = temp; 
} 

node *pointerlist::CREATE(int num) 
{ 
     struct node *temp, *s; 
     temp = new(struct node); 
     temp->element = num; 
     temp->next = NULL; 
     return temp; 
} 

int pointerlist::FIRST() 
{ 
     int num; 
     struct node *s; 
     s = start; 
     num = s->element; 
     return num; 
} 

int pointerlist::END() 
{ 
     struct node *s; 
     s = start; 
     int num; 
     while (s != NULL); 
     { 
       num = s->element; 
       s = s->next; 
     } 
     return num; 
} 

int pointerlist::RETRIEVE(int pos) 
{ 
     int counter = 0; 
     struct node *s; 
     s = start; 
     while (s != NULL) 
     { 
       counter++; 
       if (counter == pos) 
       { 
         return s->element; 
       } 
       s = s->next; 
     } 
} 

int pointerlist::LOCATE(int num) 
{ 
     int pos = 0; 
     bool flag = false; 
     struct node *s; 
     s = start; 
     while (s != NULL) 
     { 
       pos++; 
       if (s->element == num) 
       { 
         flag == true; 
         return pos; 
       } 
       s = s->next; 
     } 
     if (!flag) 
       return -1; 
} 

int pointerlist::NEXT(int pos) 
{ 
     int next; 
     int counter = 0; 
     struct node *s; 
     s = start; 
     while (s != NULL) 
     { 
       counter++; 
       if (counter == pos) 
         break; 
       s = s->next; 
     } 
     s = s->next; 
     next = s->element; 
     return next; 

} 

int pointerlist::PREVIOUS(int pos) 
{ 
     int previous; 
     int counter = 1; 
     struct node *s; 
     s = start; 
     while (s != NULL) 
     { 
       previous = s->element; 
       counter++; 
       if (counter = pos) 
         break; 
       s = s->next; 
     } 
     return previous; 
} 

void pointerlist::INSERT(int pos, int num) 
{ 
     struct node *temp, *s, *ptr; 
     temp = CREATE(num); 
     int i; 
     int counter = 0; 
     s = start; 
     while (s != NULL) 
     { 
       s = s->next; 
       counter++; 
     } 
     if (pos == 1) 
     { 
       if (start = NULL) 
       { 
         start = temp; 
         start->next = NULL; 
       } 
       else 
       { 
         ptr = start; 
         start = temp; 
         start->next = ptr; 
       } 
     } 
     else if(pos>1 && pos <= counter) 
     { 
       s = start; 
       for (i=1; i<pos; i++) 
       { 
         ptr = s; 
         s = s->next; 
       } 
       ptr->next = temp; 
       temp->next = s; 
     } 
} 

void pointerlist::DELETE(int pos) 
{ 
     int counter; 
     struct node *s, *ptr; 
     s = start; 
     if (pos == 1) 
     { 
       start = s->next; 
     } 
     else 
     { 
       while (s != NULL) 
       { 
         s = s->next; 
         counter++; 
       } 
       if (pos >0 && pos <= counter) 
       { 
         s = start; 
         for(int i=1; i<pos; i++) 
         { 
           ptr = s; 
           s = s->next; 
         } 
         ptr->next = s->next; 
       } 
       free(s); 
     } 
} 

void pointerlist::MAKENULL() 
{ 
     free(start); 
} 

Проблема возникает в строке 39 моего кода (внутри main, где я пишу pl.ADD (1)). В этой строке я пытался запустить список с довой 1. Возможно, проблемы с остальной частью моего кода тоже, но я не смог пройти эту строку, чтобы проверить. Пожалуйста помоги!

+1

Pointerlist - null. Вам нужно создать новый экземпляр класса pointerlist перед выполнением операции ADD. –

+0

Вы должны получить хорошую книгу на C++, которая объясняет, что такое указатели. Теперь вы отправляете свой код для отладки других. – Tapani

ответ

1

Список пуст в начале, поэтому она не будет выполнена на s-> next в s == start ==NULL:

s = start; 
    while (s->next != NULL) 
0

Спасибо за помощь! Я смог исправить проблему, добавив первую функцию, которая добавляет первый элемент в список. Но теперь у меня возникают проблемы с моей функцией END. Кажется, что он не входит в цикл внутри функции, когда он вызывается. Я не могу найти причины для этого. Кто-нибудь сможет помочь мне понять, почему моя функция END не работает?

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