2017-05-30 3 views
0

私はcppでリンクリストを実装していますが、次のコードに間違っていますか? 私は関数--- AddToTailにステップインするたびに、「リスト」は正しい値を取得できません。新しい値に変更されます。リンクリストCPPを追加する

#include <iostream> 
using namespace std; 

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

void AddToTail(Node* &list, int value) 
{ 
    Node newnode; 
    newnode.value = value; 
    newnode.next = NULL; 

    if (list == NULL) 
     list = &newnode; 
    else 
    { 
     Node * list1 = list; 
     while (list1->next != NULL) 
     { 
      list1 = list1->next; 
     } 
     list1->next = &newnode; 
     int a = 1; 
    } 
} 
int main() 
{ 
    Node *list=NULL; 

    AddToTail(list, 1); 
    AddToTail(list, 2); 
    AddToTail(list, 3); 

    while (list->next != NULL) 
    { 
     cout << list->value << endl; 
     list = list->next; 
    } 
    system("pause"); 
} 
+0

は、この[質問](https://stackoverflow.com/questions/79923を参照してください。スタックとヒープ・メモリの違いを知るために、スタック・アンド・ヒープとは何ですか? –

答えて

1
void AddToTail(Node* &list, int value) 
{ 
    Node newnode; 
    // Set up fields of newnode. 
    // Store address of newnode into some other data structure. 
} 

これはあなたの問題です。スタック上にノードを作成すると、このノードは関数の最後にスコープから外れます。後でノードの作成を妨げるように見える理由は、関数を再入力すると、前の呼び出しとまったく同じアドレスにnewnodeが作成されるためです。あなたはオブジェクトが関数スコープを生き残るためにしたい場合は

、あなたは動的に割り当てることが必要になるだろう、のようなもの:

void AddToTail (Node *&list, int value) { 
    Node *newnode = new Node();    // create on heap. 
    newnode->value = value;     // set up node. 
    newnode->next = nullptr; 

    if (list == nullptr) {     // list empty, 
     list = newnode;      // just create. 
     return; 
    } 

    Node *lastNode = list;     // find last item. 
    while (lastNode->next != nullptr) 
     lastNode = lastNode->next; 
    lastNode->next = newnode;    // append to that. 
} 
関連する問題