C++ c++;链表程序打印最后数据项n次

C++ c++;链表程序打印最后数据项n次,c++,pointers,C++,Pointers,我试着自己创建链表程序。程序编译没有错误,但我没有得到正确的结果。 我曾尝试过GCC和Turbo C++。 #include<iostream> #include<cstdio> using namespace std; struct node { char *name; node *link; }; int main() { int n, i; node *start = NULL, *newnode, *temp; cha

我试着自己创建链表程序。程序编译没有错误,但我没有得到正确的结果。
我曾尝试过GCC和Turbo C++。
#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;
}

按任意键继续

这是因为您让所有节点指向同一个数组
nam
。这就是为什么所有节点的名称都与上次输入的名称相同的原因。您必须为每个节点的
name
指针创建自己的内存(或将节点中的
name
设置为自动数组),然后将
nam
复制到节点
name


改变

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);

首先(这与您的问题无关),但从技术上讲,在仅输入的C
文件
流中调用
fflush
是未定义的行为。其次(也是不相关的),永远不要使用
get
。它已经过时了很长时间,已经从C和C++标准中移除,而且一般是危险的!请用调试会话的结果编辑帖子。Turbo C++和Borland C++具有良好的调试器。您可能还希望在单步执行代码时绘制列表。至于您的问题,您确实了解
std::string
?因为这将解决问题(此外,您还需要使用比
得到的
更安全、更好的函数)。想一想节点
name
指针指向哪里?所有的节点
name
指针…更不用说像筛子一样漏掉了。为什么你有
newnode=start=newnode
newnode->name = new char [strlen(nam) + 1];
strcpy(newnode->name, nam);
struct node
{
    std::string name;
    node *link;
};

std::string nam;

std::cin >> nam;

node->name = std::move(nam);