2016-04-07 105 views
1

下面的樸素代碼實現了一個鏈表,不打印主函數中的所有元素,一切都會好的。然而,LinkedList::printll函數將觸發一個設置錯誤(海灣合作委員會5.3.0),這個問題涉及到適當的處理頭節點我想...鏈表中的頭節點

那麼,有沒有什麼辦法讓這段代碼的工作printll函數的最小修改?

#include <iostream> 

using namespace std; 

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

struct LinkedList{ 
    Node* head= NULL ; 
    void append(int); 
    void printll(); 
}; 

void LinkedList::append(int data){ 
    Node* cur = head; 
    Node* tmp = new Node; 
    tmp->value = data; 
    tmp->next = NULL; 

    if(!cur){ 
     cur = tmp;      // cur-> head 
    } 
    else{ 
     while(cur->next != NULL){ 
     cur = cur->next; 
     } 
     cur->next = tmp; 
    } 
    std::cout<<cur->value<<std::endl; // cur-> temp 
    delete tmp;       // comment out 
} 

void LinkedList::printll(){ 
    Node* cur = head; 
     while(cur->next != NULL){  // 
     std::cout<<cur->value<<std::endl; 
     cur = cur->next; 
     } 
} 


int main(){ 
    LinkedList LL; 
    LL.append(5); 
    LL.append(6); 
    LL.append(7); 
    LL.printll(); // --without this, the program is fine 
    return 0; 
} 

回答

3

你有一些錯誤的append

if(!cur){ 
    cur = tmp; 
} 

這僅分配給本地副本。我假設你在這裏嘗試設置head,那麼請這樣做:head = tmp;。請注意,在這種情況下,您無法打印cur,因爲您尚未設置。但你可以打印tmp->value

然後:

delete tmp; 

你只剛剛創建,並將其分配到的地方 - 你爲什麼要刪除它?你知道還有一個指向它的指針。只有當您完成清理清單時(此時您根本沒有這樣做),它纔會被清除。

除此之外,您printll不會打印的最後一個元素 - 想想什麼時候會停止:

A -> B -> C -> NULL 

它將停止節點C,但從來沒有打印C的價值。只需更換:

while(cur->next != NULL){ 

while(cur != nullptr){ 

(還有,我不喜歡endl)。

See here for these changes running

#include <iostream> 

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

struct LinkedList{ 
    Node* head = nullptr ; 
    void append(int); 
    void printll(); 
}; 

void LinkedList::append(int data){ 
    Node* cur = head; 
    Node* tmp = new Node; 
    tmp->value = data; 
    tmp->next = nullptr; 

    if(!cur){ 
     head = tmp; 
    } 
    else{ 
     while(cur->next != nullptr){ 
      cur = cur->next; 
     } 
     cur->next = tmp; 
    } 
} 

void LinkedList::printll(){ 
    Node* cur = head; 
    while(cur != nullptr){ 
     std::cout << cur->value << '\n'; 
     cur = cur->next; 
    } 
} 


int main(){ 
    LinkedList LL; 
    LL.append(5); 
    LL.append(6); 
    LL.append(7); 
    LL.printll(); 
} 
+0

作爲@BoBTFish說,你必須刪除'刪除TMP;'從你的代碼(爲什麼你'delete'一個'node'剛纔添加它到'List'?),並在'printll'中改變'while'循環,建議:'while(cur)' –

+0

我改變了@BoBTFish所提出的所有建議,而且我正在使用GCC 5.3.0進行編譯。 ,它仍然segfault ..問題發生在「cur-> next」我猜 – lorniper

+0

@lorniper當我做了我建議的更改,我能夠編譯和正常運行。你可以發佈你的確切代碼仍然是殘疾人嗎? – BoBTFish

0

1.you水溼

delete tmp; 

原因TMP是一個指針,當您運行刪除tmp目錄,您刪除的對象。

2.打印功能應該是這樣的:

void LinkedList::printll(){ 
    Node* cur = head; 
     while(cur->next != NULL){  // -> problems is here 
     std::cout<<cur->value<<std::endl; 
     cur = cur->next; 
     } 
     std::cout<<cur->value<<std::endl; 
}