2011-08-13 3 views
1

私の頭がこれからかなり崩れた後、私は助けを求めています。たぶん私はここで本当に馬鹿なことをしています。以下はリンクリストの基本的な実装です。しかし、それは動作していないようです。誰かが見てみることができますか?このリンクされたリストの実装で何が問題になりますか?

編集:私はそれが追加機能のelse部分の無限ループに入ることを意味します。

#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私は '頭部 'と'尾部 'を持つ' 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!)。 //リンクが初期化されていないため、ここでは無限ループに入る

とにかく、初期化されていない値を使用しないでください。それが最初に初期化されることを確認してください。

しかし明らかに、この問題はnull以外の値で発生します。値が変更されるループ内に方法がないため、永遠に非nullになり続けます。多分あなたはその論理を再考すべきでしょうか?コードのこの部分は何ですべきか、なぜですか?

(あなたがあなた自身の思考を行うことができますので、私は故意に直接答えていないのです - それは重要なスキルです。)

関連する問題