2017-06-15 8 views
0

私はC++でデータ構造を学習しています。これは、リンクとノードを使用した の簡単な挿入プログラムです。挿入はノードの先頭で行われます。 コードの一部がわかりません。C++でのデータ構造。リンクリストのノードの先頭に挿入

display()のポインタnpは、挿入された情報をポイントし、次のノードを使用して以前の情報の値をとります。次のポインタは、insert_beginning()関数を使用して前の情報を指しています。 表示はwhileループを使用して行われます。次のポインタは各ループの間にどのように値を変更しますか?

PS:プログラムはうまく動作します。

#include<iostream> 
#include<process.h> 
#include<cstdlib> 
using namespace std; 

struct node 
{ 
    int info; 
    node *next; 
}*start,*newptr,*save,*ptr; 

node *create_new_node(int); 
void insert_beg(node*); 
void display(node*); 

/*---------------------------------------------------------------------------------------------------------------------------- 

The pointer 'start' points to the beginning of the list. 

Function 'create_new_node()' takes one integer argument , allocates memory to create new node and returns 
the pointer to the new node.(return type: node*) 

Function 'insert_beg()' takes node* type pointer as an argument and inserts this node in the beginning of the list. 

Function display takes node* type pointer as an argument and displays the list from this pointer till the end of the list 

------------------------------------------------------------------------------------------------------------------------------ 
*/ 

int main() 
{ 
    start=NULL; 
    int inf; 
    char ch='y'; 
    while(ch=='y'||ch=='Y') 
    { 
     system("cls"); 

     cout<<"enter information for the new node "; 
     cin>>inf; 
     cout<<"\ncreating new node. Press enter to continue "; 
     system("pause"); 

     newptr = create_new_node(inf); 

     if(newptr!=NULL) 
     { 
      cout<<"\nnew node created successfully. Press enter to 
continue. "; 
      system("pause"); 

     } 

     else 
     { 

      cout<<"\nCannot create new node. ABORTING!! "; 
      exit(1); 

     } 

     cout<<"\nnow inserting this node in the beginning of the list. 
Press enter to continue "; 
     system("pause"); 
     insert_beg(newptr); 
     cout<<"\nNow the list is \n"; 
     display(start); 
     cout<<"\nPress 'Y' to enter more nodes, 'N' to exit\n"; 
     cin>>ch; 

    } 

    return 0; 
} 

node *create_new_node(int n) 
{ 
    ptr=new node; 
    ptr->info=n; 
    ptr->next=NULL; 

} 

void insert_beg(node *np) 
{ 

     if(start==NULL) 
     start=np; 
     else 
    { 
     save=start; 
     start=np; 
     np->next=save; 
    } 

} 

void display(node *np) 
{ 

    while(np!=NULL) 
    { 
     cout<<np->info<<" ->"; 
     np=np->next; 

    } 
    cout<<"!!!\n"; 
} 
+0

ノードを挿入すると、関数表示はどのように関連していますか? –

+0

リンクリストのすべてのノードには次のノードのアドレスが含まれているので、 'np-> next'は' np'np-> next'に 'np'に割り当てられている次のノードを指します。次のノードに移動します。 –

答えて

0

短い長い話をカットする - 私の理解あたりに、あなたの基本的な質問です: -

表示は、whileループを使用して行われます。次のポインタはどのように変化するのですか? 各ループ中の値はどうなりますか?

これは、この行に正確に起こる: -

np=np->next;

あなたは基本的にそのアドレスが第1のノード構造のnextメンバーである別のnode構造にnode構造体へのポインタを進めています。これはテキストブックのもので、基本的なアルゴ本はこれを完全にカバーするべきです。

HTH!

+0

は、前のノードのアドレスを保持します。 npはそのアドレスから値を取得します。次に他のノードをどのように指し示すのか。 –

+0

は、次のノードのアドレスを保持します。 – Zakir

+0

各ループの次の情報をどのように指していますか? –

0

あなたの質問は多少不明です。特に次のように述べています。

PS:プログラムは正常に動作します。

ではなく、です。単にこのプログラムがうまくいかないことを意味するバグがあります。

問題は、グローバルポインタ変数を使用するためには本当に悪い考えであることのほかにcreate_new_nodeは、ポインタ値

node *create_new_node(int n) 
{ 
    ptr=new node; 
    ptr->info=n; 
    ptr->next=NULL; 
    return ptr;  // This line is missing 
} 

を返していないということです!ここで

struct node 
{ 
    int info; 
    node *next; 
}*start,*newptr,*save,*ptr; 

あなたはstruct nodeを定義しますが、あなたはまた、ノードに4つの変数、すなわち4つのポインタを定義します。これらの変数はグローバルになります。つまり、すべてのコードで使用できます。何かをしなければならない決してする。

必要に応じて代わりにローカル変数を作る - 例えば:

node *create_new_node(int n) 
{ 
    node *ptr; // Local variable instead of global 
    ptr=new node; 
    ptr->info=n; 
    ptr->next=NULL; 
    return ptr; 
} 

その後insert_beg変更のためにそれを、それが新たなスタートポインタを返すように - のような:

node* insert_beg(node* start, node *np) 
{ 
    np->next=start; 
    return np; 
} 

をしてmainでそれを使用しますlike:

node* start = NULL; 
... 
... 
start = insert_beg(start, newptr); 

BTW - 現代のC++では、あなたは自分のリストを書くことは決してありません。生ポインタの代わりにスマートポインタを使用してください。自分で書くのではなく、標準のコンテナを使用してください。

+0

実際には、プログラムは示唆された編集なしで実行されます。私はcreate_new_node()からポインタを返すと思ったが、コンパイルと出力は正常です。 btw ... wud uはスマートポインタについて精巧? –

+0

@SohitGore 1)プログラムは 'return ptr'なしで正しく実行できません2)スマートポインタ...まあ、生ポインタの問題は多くのプログラマがそれらを処理できないということです。彼らは多くの問題(メモリリークと呼ばれる)を引き起こしたメモリを解放/削除するのを忘れていました。したがって、スマートポインタは、その責任を特別なクラス、つまり一意のポインタまたは共有ポインタに委譲する方法です。スマートポインタは、一種のガベージコレクションのようにメモリの解放を自動的に処理します。現代のC++をしたいのなら、それらについて読むべきです。 – 4386427

+0

@SohitGore - BTW:常に警告をエラー(コンパイラオプション)にすることを忘れないでください。あなたのコンパイラは、その関数に戻りません:-) – 4386427

関連する問題