2

したがって、リンクリストがどのように機能し、C++でどのように参照を維持するかについては少し混乱しています。

たとえば、myListと言うリストを取得し、そのアイテムを印刷したいとします。印刷プロセス後にmyList
を同じ に保つには、リストを別のリストにコピーする必要があることを学校から知っています。

Node* n;
n = myList;
while(n)
{
    printf("%d ",n->val);
    n=n->next;
}

OK、別のリストn(同じポインタ)にmyListのコピーがあります。nをループした後、myListは同じですが、nのような同じポインターを持っていました。

nが変更された場合、なぜmyListが変更されなかったのですか(同じポインターですよね?)?

今私が言うなら:

Node* n;
n = myList;
n->next = NULL;//or n->next=another node -doesn t matter

2番目の例では、myListも変更されています。

これを説明してもらえますか?

4

4 に答える 4

9

実際のリスト構造とリスト構造への参照の違いについて、少し混乱していると思います。

最初の例では、リストのトラバースについて、トラバースする前に基本的にこの状況が発生します。ここでは、同じリストへの2つの参照があります。

o-->o-->o-->o-->o-->NULL
^
|
 \_ myList, n

リストをトラバースすると、次のようになります。

o-->o-->o-->o-->o-->NULL
^                   ^
|                   |
 \_ myList           \_ n

リストの先頭への参照をコピーしてトラバースしなかった場合は、トラバース後に次のようになります。

o-->o-->o-->o-->o-->NULL
                    ^
                    |
                     \_ myList

リストの先頭へのポインタがなくなったため、リストにアクセスできなくなりました。

2番目の例では、次のようになります。

o-->o-->o-->o-->o-->NULL
^
|
 \_ myList, n

そして、あなたはそれをこれに変換します:

  _________________
 /                 \
o   o-->o-->o-->o-->NULL
^
|
 \_ myList, n

この変換により、リストの実際の構造が変更され、そのリストへのすべての参照に反映されます。

于 2013-01-04T19:56:33.070 に答える
4

ポインタを変更すると、ポインタnと同じ値にはなりません...の値のコピーからmylistの初期値を生成したため、これらは最初は同じオブジェクトを指す2つの別個のポインタです。nmylist

そうは言っても、の値nからの初期化以降の値を調整していない場合mylist、2つのポインタは同じオブジェクトを指しています。どちらかのポインターを逆参照して、それらが指しているオブジェクトを変更すると、両方のポインターは同じオブジェクトを指しているため、指しているオブジェクトへの変更を反映します。

結局、の値をにコピーしているだけなので、mylistリンクnリストは1つしかありません...リストの「ディープ」コピーは作成していません。したがって、いずれかのポインタが指す実際のリストノードを変更すると、実際のリストが変更されます。

于 2013-01-04T19:48:19.483 に答える
3

n = myList;と同じ要素をn指しmyListます。それらは基本的に同じです-再割り当てできることを除いてn、しかしそれらは同じ場所を指しているので、実際にはリストのコピーを作成していません-最初のノードへのポインタのコピーだけです。

それらは同じ場所を指しているため、n->next = NULL;両方のリストを変更します。

于 2013-01-04T19:48:36.963 に答える
1

別のリストを作成しておらず、元のリストを変更していません。を使用してリストを繰り返し、n各要素を順番にポイントしました(配列を介したインデックス付けのようなものです)。

于 2013-01-04T19:53:26.037 に答える