2015-05-01 76 views
-1

我開始研究算法和數據結構。我決定嘗試使用單向鏈表。它包含了像選擇元素之後插入元素,刪除具有給定值的元素並返回一定數量的已刪除項目等功能,函數返回列表和類的當前內容以寫入和讀取/讀取文件。功能上有一個小問題,它必須添加新元素。調試器返回以下錯誤:C++中的單向鏈表

AiSD.exe中0x00e71ea2的第一次機會異常:0xC0000005:訪問衝突讀取位置0x00000000。

AiSD.exe中的0x00e71ea2未處理的異常:0xC0000005:訪問衝突讀取位置0x00000000。

看起來像指針問題,但我不知道如何解決它。現在不是我的專業......然而!所以我請你幫助我。有一個代碼:當你進入AddAfter方法

#include<iostream> 
#include<fstream> 
#include<string> 
using namespace std; 

struct Node 
{ 
    Node *next; 
    int key; 
}; 

class List 
{ 
public: 
    Node *head; 
    unsigned int counter; 

    List() 
    { 
     head = NULL; 
     counter = 0; 
    } 

    unsigned size(Node *p) 
    { 
     unsigned int c=0; 

     while(p) 
     { 
      c++; 
      p = p->next; 
     } 
     return c; 
    } 


    void Addafter(Node *e, int v) 
    { 
    Node *p = new Node; 
    p->next = e->next; //there's a problem 
    p->key = v; 
    e->next = p; 
    } 

    int Delete(int v) 
    { 
     Node *p = new Node; 
     int count = 0; 
     while(p->next != NULL) 
     { 
      if(p->key = v) 
      { 
       delete p; 
       count++; 
       return count; 
      } 
     } 
    } 
    void Write() 
    { 
     string data; 
     fstream file; 
     file.open("D:\\plik2.txt", ios::out); 
     Node *p = head; 
     while(p->next != NULL) 
     { 
      p = p->next; 
      int wartosc = p->key; 
      file<<wartosc; 
     } 
     file.close(); 
    } 

    void Read() 
    { 
     string data; 
     fstream file; 
     file.open("D:\\plik.txt", ios::in); 
     Node *p = head; 
     for(int i=0; i<counter; i++) 
     { 
      getline(file, data); 
      int result = atoi(data.c_str()); 
      p->key = result; 
      p = p->next; 
     } 
     file.close(); 
    } 


}; 

int main() 
{ 
    List a; 
    a.Read(); 
    a.Addafter(a.head, 3); 
    a.Delete(5); 
    a.size(a.head); 
    system("PAUSE"); 
    return 0; 
} 

+0

可以通過將標題添加到標題中來指明所使用的語言嗎?請在類別中標記它? –

+0

像「這是一些代碼,修復我的錯誤」這樣的問題不適合Stackoverflow問答格式。你必須把它縮小到一個特定的問題,如果在找到錯誤的行時仍然沒有得到它 - 在使用指針時搜索關於訪問衝突的舊回答。 (通常,在爲它分配一個您擁有的對象的地址之前,不要對指針取消引用)。 – folkol

+0

我會知道下一次 –

回答

1

a.head爲NULL。那麼什麼情況是:

addAfter(Node *e /*Null in this case*/, int v) { 
    Node *p = new Node; // Ok. 
    p->next = e->next; // It is equivalent to p = NULL->next Which just segfaults. 

} 

在你可能想這樣做的話:

addAfter(Node *e /*Null in this case*/, int v) { 
     Node *p = new Node; 
     p->key = v; 
     if (e) { 
      p->next = e->next; 
      e->next = p; 
     } 
     else { 
      e = p; 
      e->next = NULL; 
     } 

} 

每當你正在做的鏈表,拿出一張紙,畫下你的代碼(小框和箭頭表示鏈接列表很好,可讓您將其展開,以便人眼可以理解/可見)。

+0

它給我帶來了新的光芒。非常感謝你! –

+0

@MichałHabigier如果是指針,請使用'printf(「%p」,yourPointer)''技巧。找出它們是否爲NULL。和圖紙。 :3聽起來有點不可思議,但當我開始嘗試理解鏈表時,幫助了我。此外,如果這回答了您的問題,請將其標記爲答案,以便該帖子被視爲已關閉。 :) – Khaldor