2016-07-13 10 views
0

私はC++を使用してリンクリストを学習しようとしています。ここに私のコードは次のとおりです。C++ポインタが動作しない

#include<bits/stdc++.h> 
using namespace std; 

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

void show(node *head) 
{ 
    node *n; 
    n=head; 
    while(n) 
    { 
     cout<<n->data<<' '; 
     n=n->next; 
    } 
    cout<<endl; 
} 

void insert(node *list,int x) 
{ 
    list->data=x; 
    node *t=new node; 
    list->next=t; 
    list=t; 
} 
int main() 
{ 
    node *head,*t,*list=new node; 
    head=list; 
    for(int i=0;i<10;i++) 
    { 
     insert(list,i+1); 
    } 
    show(head); 
} 

私はlistが指しているメモリに、メモリリストにヘッドが最初に指しますが、insert関数の呼び出しを挿入した後にされheadの点を指摘しているが、それは仮定されました発生する。頭は変わらないとは思わない?

+0

何が変わらないと思われますか? – user463035818

+1

'list = t;'これを有効にしたい場合は、ポインタを参照渡しする必要があります。 'node * list'ポインタは値によって渡されます。つまり、ポインタが指している値を変更することができますが、ポインタの変更は関数のローカルに残ります。 – user463035818

答えて

1

には2つの問題があります。

1)間違ったノードのdataが設定されています。新しいノードのdataを挿入する値に設定する代わりに、コードは既存のヘッドノードのdataを新しい値に設定します。新しいノードの値は未初期化のままです。

2)listパラメータは、値によってinsert()に渡されます。つまり、次のことを意味します。

list=t; 

は絶対に何も成立しません。 listが値渡しされているため、関数のlistを新しいリストの先頭に設定します。残念ながら、insert()が返された場合、新しいリストの先頭は破棄され、元listmain()は変更されません。

どちらのlistは、明示的にreturn新しいlist必要があります参照してinsert()に渡された、またはinsert()しなければなりません。

はさらに:

main()は、最初のヘッドノードを割り当て、それが完全に初期化されていないままに。このリンクリストには、常にdataが初期化されない余分なノードが1つあります。これはおそらく意図したものではありません。正しい方法は、空リストの先頭ポインタをNULL(空のリスト)に設定し、最初のinsert()はリンクリストの最初のノードを正しくインスタンス化する必要があります。

余分なノードのnextポインタも初期化されていない、追加の初期化されていないノードを作成する既存のコードに間違いがあります。結果のリンクリストを歩き回ると、動作が未定義となり、クラッシュする可能性があります。

2

insert()listを繰り返し呼び出すと、list->nextが新規nodeになります。

その新しいノードは初期化されていないため、show()にあるようにnextポインタを参照解除すると、未定義の動作が発生します。コードの動作が未定義になると、すべてのベットがオフになります。何かが起こる可能性があります。

insert()の振る舞いのために、show()は未定義の動作を示します。

listが値渡しされているため、に割り当てても効果はありません。その割り当てはmain()には表示されません。

list->nextが指す前のノードも失われます(解放されず、アクセスできない)。

main()もそれほど問題は、上記固定されている場合でも、未定義の動作を引き起こす(insert()又はshow()に)そのメンバーを使用して、初期化されていないlist残します。

関連する問題