2016-02-07 96 views
-2

我目前正在學習C++對我自己的,並已經歷了一些教科書和試圖做的一些問題。在學習指針時,我決定嘗試自己實現一個鏈表。我寫的程序,但要得到一個錯誤,指出:「分割錯誤(核心轉儲)」。我已經通過本網站上的其他類似的問題搜索,雖然也有關於同一主題很多,還沒有幫我解決我的問題。我很新的編程和指針,所以任何幫助將不勝感激!C++鏈表實現分段錯誤(核心轉儲)錯誤

#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); 
} 

問題發生在我的代碼(主要是我寫pl.ADD(1))的第39行。在此行中我試圖開始列表與淡水河谷1有可能與我的代碼的其餘太問題,但我一直沒能闖過這條線進行檢查。請幫忙!

+1

Pointerlist爲空。您需要創建pointerlist類的新實例執行ADD操作 –

+0

之前,您應該獲得良好的C++的書,這說明指針是什麼。現在您將代碼發送給其他人進行調試。 – Tapani

回答

1

列表爲開頭空,因此它會在s-> nexts == start ==NULL失敗:

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

感謝您的幫助!我可以通過添加第一個將第一個元素添加到列表中的函數來解決問題。但是現在我遇到了END函數的問題。它在被調用時似乎沒有進入函數內的循環。我找不到這個原因。任何人都可以幫助我找出爲什麼我的END功能不起作用?