2017-08-27 42 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