2017-08-27 10 views
-2

私は自分でリンクリストプログラムを作成しようとしました。プログラムはエラーなしでコンパイルされましたが、正しい結果が得られません。
GCCとTURBO C++で試してみました。C++リンクリストプログラム最後のデータ項目をn回印刷

#include<iostream> 
#include<cstdio> 

using namespace std; 

struct node 
{ 
    char *name; 
    node *link; 
}; 

int main() 
{ 
    int n, i; 
    node *start = NULL, *newnode, *temp; 
    char nam[10]; 
    cout<<"Enter number of people:"; 
    cin>>n; 
    for(i=0;i<n;i++) 
    { 
     cout<<"Enter name:"; 
     fflush(stdin); 
     gets(nam); 
     if(start==NULL) 
      newnode = start = new node; 
     else 
      newnode = newnode->link = new node; 
     newnode->link = NULL; 
     newnode->name = nam; 
    } 
    cout<<"\n\tNames:"; 
    temp = start; 
    while(temp!=NULL) 
    { 
     cout<<"\n"<<temp->name; 
     temp = temp->link; 
    } 
    delete newnode; 
    delete start; 
    delete temp; 
    return 0; 
} 

出力は次のようになります。
Output ScreenShot

Enter number of people:4 
Enter name:qwerty 
Enter name:uiop 
Enter name:asdf 
Enter name:zxcv 

     Names: 
zxcv 
zxcv 
zxcv 
zxcv 
-------------------------------- 
Process exited after 15.85 seconds with return value 0 

任意のキーを押して続行し。 。 。

+1

(これはあなたの問題とは無関係です)が、技術的に呼び出す '入力専用Cでfflush'' FILE'ストリームは、* *未定義の動作です。第二に(そして無関係に)、決して決して***決して使用しないでください。これは長い間古くなってきており、CおよびC++標準の両方から削除されており、一般的に危険です!* –

+0

あなたのデバッグセッションの結果であなたの投稿を編集してください。 Turbo C++とBorland C++には、優れたデバッガがあります。また、コードを一歩一歩進んでいくうちに、リストをダイアグラム(描画)することもできます。 –

+1

問題については、 'std :: string'について知っていますか?これは問題を解決するためです(さらに、 'gets'よりも安全で機能的なものを使う必要があります)。ノード '名前'ポインタが指しているところを少し考えてみてください。 ***ノード 'name'のすべての***ポインタ... –

答えて

3

そのため、すべてのノードが同じ配列namを指すようにします。それは、すべてのノードが最後に入力された名前と同じ名前を持つ理由です。各ノードのnameポインター(またはノード内にnameを自動配列として設定)ごとに独自のメモリーを作成してから、namをノードnameにコピーする必要があります。

newnode->name = new char [strlen(nam) + 1]; 
strcpy(newnode->name, nam); 


変更

newnode->name = nam; 

はまたdelete[]割り当てられたメモリに忘れてgets & fflushを使用いけないし、あなたの記事の下のコメントを読んではいけません。


ヒント:代わりチャーアレイの

std::stringを使用します。その方法は使いやすく、エラーを起こしにくい。

struct node 
{ 
    std::string name; 
    node *link; 
}; 

std::string nam; 

std::cin >> nam; 

node->name = std::move(nam); 
まず
+1

ありがとうございます。出来た – Akshaylal

関連する問題