2011-08-13 80 views
1

經過一段時間的打破我的頭腦後,我正在尋求幫助。也許我在這裏做了一些非常愚蠢的事情。以下是鏈表的基本實現。但是,它似乎並不奏效。有人可以看看嗎?這個鏈表實現有什麼問題?

編輯:通過不工作我的意思是它進入無限循環在添加功能的其他部分。

#include <iostream> 

struct node 
{ 
    int data; 
    node* link; 
}; 

void add(struct node** list, int i) 
{ 
    //populate a node 
    node* tempNode = (node*) malloc(sizeof(node)); 
    tempNode->data = i; //**This does not seem to initialize data** 
    tempNode->link = NULL; //**Same here** 

    //check if the list is empty 
    if(*list == NULL) 
    { 
     //create the node 
     *list = tempNode; 
    } 
    else 
    { 
     while((*list)->link != NULL); //Enters in to an endless loop here because the link is not initialized 
     (*list)->link = tempNode; 
    } 

} 

void print(node** list) 
{ 
    node* itr = *list; 
    while(itr != NULL) 
    { 
     std::cout << itr->data << "\n"; 
     itr = itr->link; 
    } 
} 

int main() 
{ 
    node* linkedList = NULL; 
    node** t = &linkedList; 
    add(&linkedList, 10); 
    add(&linkedList, 20); 
    add(&linkedList, 30); 
    add(&linkedList, 40); 
    print(&linkedList); 

} 
+1

請你的意思是「不行」是什麼更多的描述。我們看不懂頭腦:) – hugomg

+0

對不起我的壞。將其添加到編輯 – koobi

+2

在一般情況下,您應該檢查'malloc'是否返回NULL以防止出現分段錯誤。 – keks

回答

2

您的add功能有誤(else分支)。由於(*list)->link未發生變化,因此會永久循環。嘗試這個。

void add(struct node** list, int i) 
{ 
    /* .... */ 
    if(*list == NULL) 
     *list = tempNode; 
    else { 
     struct node *p = *list; 
     /* Search for tail. */ 
     while(p->link) 
      p = p->link; 

     /* Since p->link is NULL, it's the tail. */ 
     p->link = tempNode; 
    } 
} 

這插入O(n); user786653在評論中有一個很好的建議。

+2

+1擊敗拳頭。同樣,因爲這樣每次人們通常在列表的開始處插入列表或保留尾指針以避免行走時,這些列表都會走路。 – user786653

+1

@ user786653我喜歡用「head」和「tail」來保留'struct' :-) – cnicutar

+0

另外,我們不再需要'if..else'。 – keks

0

試試這個在add()

else 
    { 
     struct node *n = *list; 
     while (n->link != NULL) 
      n = n->link; 
     n->link = tempNode; 
    } 
0

這裏是一個工作版本。我不確定,但可能是這樣的情況,閱讀本文並將其與您的內容進行比較將會告訴您更多的東西,而不是閱讀對差異的分析。

#include <iostream> 

struct node { 
    int data; 
    node* link; 
}; 

void add(struct node** list, int i) 
{ 
    // populate a node 
    node* tempNode = (node *)malloc(sizeof(node)); 
    tempNode->data = i; 
    tempNode->link = NULL; 

    //check if the list is empty 
    if(*list == NULL) 
    *list = tempNode; //create the node 
    else { 
    while((*list)->link != NULL) 
     list = &(*list)->link; 
    (*list)->link = tempNode; 
    } 
} 

void print(node** list) 
{ 
    node* itr = *list; 
    while(itr != NULL) { 
    std::cout << itr->data << "\n"; 
    itr = itr->link; 
    } 
} 

int main() 
{ 
    node* linkedList = NULL; 
    add(&linkedList, 10); 
    add(&linkedList, 20); 
    add(&linkedList, 30); 
    add(&linkedList, 40); 
    print(&linkedList); 
} 
1

,而((*名單) - >鏈接!= NULL); //進入一個無限循環,因爲鏈接沒有初始化

那麼,你不應該嘗試使用未初始化的值;確保它首先被初始化。

但很明顯,問題發生在任何非空值:循環內部沒有辦法改變值,所以它將永遠是非空的。也許你應該重新思考邏輯?這段代碼應該做什麼,爲什麼?

(我故意不回答,直接,所以你可以做你自己的想法 - 這是一個重要的技能。)