0

私は最近C/C++を学ぼうとしています。私は動作するはずの単純なリンクリストプログラムを作成しましたが、実際には動作しますが、リンクリストのヘッダー(node* mother)がグローバル変数であり、関数(void new_node(int number))のパラメーターとして使用されていない場合に限ります-この関数はコンストラクターです(I C構文を使用しています)。

以下のこのプログラムは正常に動作しますが、複数のリンクリストを作成することはできません。

#include <iostream>
#include <stdlib.h>
#include <stdio.h>

using namespace std;


struct node {
    node * next;
    int number;
};


node * mother = NULL;

void new_node(int number)
{
    node * newNode = (node*) malloc(sizeof(node));

    newNode -> next = NULL;
    newNode -> number = number;

    if (mother == NULL){
        mother = newNode;
    }
    else{
        node* temp = mother;
        while(temp->next != NULL){
            temp = temp->next;
        }
        temp->next = newNode;
    }
}

void destroy(){
    node* ntemp = mother;
    mother = NULL;
    node* t;

    while(ntemp != NULL){
        t = ntemp->next;
        free(ntemp);
        ntemp = t;
    }
}

void printAll(){
    node *tmp;
    tmp = mother;
    while (tmp != NULL){
        cout <<"value is : " << tmp->number <<endl;
        tmp = tmp->next;
    }

}

int main()
{
    cout <<"size is " << sizeof(node*) <<endl;

    new_node(5);
    new_node(17);
    new_node(-54);
    new_node(3);
    new_node(4);
    new_node(-24);
    new_node(10);
    printAll();
    return 0;
}

ただしnode* mother、関数の引数として使用すると、機能new_nodeしません。ノードのサイズのみが出力されます。

#include <iostream>
#include <stdlib.h>
#include <stdio.h>

using namespace std;


struct node {
    node * next;
    int number;
};

void new_node(node* mother, int number){
    node * newNode = (node*) malloc(sizeof(node));

    newNode -> next = NULL;
    newNode -> number = number;

    if (mother == NULL){
        mother = newNode;
    }
    else{
        node* temp = mother;
        while(temp->next != NULL){
            temp = temp->next;
        }
        temp->next = newNode;
    }
}

void destroy(node * mother){
    node* ntemp = mother;
    mother = NULL;
    node* t;

    while(ntemp != NULL){
        t = ntemp->next;
        free(ntemp);
        ntemp = t;
    }
}

void printAll(node * mother){
    node *tmp;
    tmp = mother;
    while (tmp != NULL){
        cout <<"value is : " << tmp->number <<endl;
        tmp = tmp->next;
    }

}

int main()
{
node * mother = NULL;

    cout <<"size is " << sizeof(node*) <<endl;

    new_node(mother, 5);
    new_node(mother, 17);
    new_node(mother, -54);
    new_node(mother, 3);
    new_node(mother, 4);
    new_node(mother, -24);
    new_node(mother, 10);
    printAll(mother);
    return 0;
}

最初のプログラムの出力:

size is 8
value is : 5
value is : 17
value is : -54
value is : 3
value is : 4
value is : -24
value is : 10

2番目のプログラムの出力:

size is 8

問題は、なぜこのプログラムの動作がそれほど異なるのかということです。

4

4 に答える 4

0

new_nodeを次のように変更してみてください。

void new_node(node** mother, int number){
    node * newNode = (node*) malloc(sizeof(node));

    newNode -> next = NULL;
    newNode -> number = number;

    if (*mother == NULL){
        *mother = newNode;
    }
    else{
        node* temp = *mother;
        while(temp->next != NULL){
            temp = temp->next;
        }
        temp->next = newNode;
    }
}

そしてこれの主なもの:

int main()
{
node * mother = NULL;

    cout <<"size is " << sizeof(node*) <<endl;

    new_node(&mother, 5);
    new_node(&mother, 17);
    new_node(&mother, -54);
    new_node(&mother, 3);
    new_node(&mother, 4);
    new_node(&mother, -24);
    new_node(&mother, 10);
    printAll(mother);
    return 0;
}

関数内のノードへのポインタにポインタを渡す必要があります。そうしないと、関数内new_nodeでポインタのコピーのみmotherが変更され、mainでは同じになります。new_nodemother

于 2013-02-20T16:47:07.990 に答える
0

motherこれは、次の行に設定すると次のようになるためです。

mother = newNode;

関数では、渡した変数ではなく、new_nodeのローカル コピーを設定します。mother

渡されたオリジナルを変更できるようにするには、参照node * &motherまたはダブル ポインターを使用する必要があります。node ** mothermother

于 2013-02-20T16:40:37.380 に答える
0

問題は、「new_node」という関数内で、ポインターのコピーだけを操作することです。そのため、関数の終了後に変更は保存されません。関数内のコピーの代わりにポインターを変更できるようにするには、関数の次の宣言を使用する必要があります。

void new_node(node*& mother, int number)

これは、2 番目のプログラムを機能させるための唯一の変更です。

于 2013-02-20T16:55:28.710 に答える