2

リストの最後に新しいノードを追加すると、次のようにうまく機能します。

typedef struct node* edge;
struct node
{
   int data;
   edge next;
};

void add(edge start, int val)
{
   edge n = malloc(sizeof(struct node));
   n->data = val;
   n->next = NULL;

   while (start->next)
      start = start->next;

   start->next = n;
}

ただし、本体を次のように変更するadd()と:

edge n = malloc(sizeof(struct node));
n->data = val;
n->next = start;

start = n;

何も追加されません。

新しいノードがリストの新しい開始点になり、前の開始点が 2 番目になることを期待していました。最初の実装が期待どおりに機能し、2 番目の実装が機能しないのはなぜですか? 2 番目の方法に期待していた機能を実装する最良の方法は何ですか? void 関数で実行できますか?

4

2 に答える 2

3

これは、ポインターが値で渡されるためです。

start = n;

渡したポインターのローカル コピーのみが変更されます。これを修正するには、start by ポインターをポインターに渡します。

void add(edge* start, int val)
{
    edge n = malloc(sizeof(struct node));
    n->data = val;
    n->next = *start;

    *start = n;
}
于 2012-11-10T03:43:34.843 に答える
1

C の変数は、「参照渡し」ではなく「値渡し」で渡されることに注意してください。したがって、start = n2 番目のコードを設定しても、その変更はコード内の他の場所には反映されません。代わりに、次のようにします。

edge add(edge start, int val)
{
   edge n = malloc(sizeof(struct node));
   n->data = val;
   n->next = start;
   return n;
}

または、参照によるソリューションの場合:

void add(edge* start, int val)
{
   edge n = malloc(sizeof(struct node));
   n->data = val;
   n->next = *start;
   *start = n;
}

ここでポインターを使用すると、 への参照が提供さedgeれ、関数内と呼び出し元の両方で変更できます。(ただし、逆参照せずにポインター「start」の値を変更する場合、その変更は関数に対してローカルであることに注意してください。)

于 2012-11-10T03:44:37.807 に答える