2017-08-27 86 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'FILE'流中調用'fflush'是*未定義行爲*。其次(也是無關的),永遠不會***使用'gets'。它已經過時了很長一段時間,已經從C和C++標準中刪除了,並且通常是*危險的!* –

+0

請編輯您的文章和調試會話的結果。 Turbo C++和Borland C++有很好的調試器。您可能還想在單步執行代碼時繪製(繪製)列表。 –

+1

至於你的問題,你*知道'std :: string'?因爲這會解決問題(再加上你需要使用比'gets'更安全,更好的功能)。想一會兒節點'name'指針指向的地方? ***節點'名稱'指針的所有*** ... –

回答

3

它因爲你讓所有節點指向相同的陣列nam。這就是爲什麼所有節點都與上次輸入名稱具有相同名稱的原因。您必須爲每個節點的name指針創建自己的內存(或將節點中的name設置爲自動陣列),然後將nam複製到節點name


變化

newnode->name = nam; 

newnode->name = new char [strlen(nam) + 1]; 
strcpy(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