在链表中添加数据

时间:2016-04-21 01:10:35

标签: c++ struct linked-list

我刚刚开始学习链接列表,我正在尝试从文件中提取某些信息,并使用推送功能将其插入到链接列表中。当我尝试查看信息以查看它是否正确插入时,它只是一遍又一遍地显示信息的最后一行。我究竟做错了什么?这是我的代码:

struct Country
 {
  string  name;
  double  population;
 };

struct Node 
 {
  Country ctry;
  Node *next;
 };
Node *world;

void push(Node *&world);

int main ()
{
    push(world);
    return 0;
}

void push(Node *&world)
{

    ifstream inFile("file.csv");

    if (!inFile.fail())
    {
        cout << "File has opened successfully." << endl;
    }

    if (inFile.fail())
    {
        cout << "File has failed to open." << endl;
        exit(1);
    }

   double temp, temp1, temp2, temp3, population;
   string countryName;
   Node *top = new Node;

   for (int i = 0; i < 300; i++)
    {
        if (inFile.eof())
        {
            top->next = NULL;
            break;
        }

        inFile >> temp >> temp1 >> temp2 >> temp3 >> population;
        getline (inFile,countryName);

        top -> ctry.population = population;
        top -> next = world;
        world = top;

        top -> ctry.name = countryName;
        top -> next = world;
        world = top;
    }

    for (int j = 0; j < 5; j++)
    {
        cout << top -> ctry.name << endl;
        top -> next;
    }
}

3 个答案:

答案 0 :(得分:1)

&#34;世界&#34;是链表的开头。

dcast()

您在此处创建了一个新节点。我将跳过您填充其内容的部分。

library(reshape2)

dcast(df,CustID + Account + Open_Bal + Current_Bal~ Account,value.var = 'Current_Bal')

&#34;世界&#34;是我提到的当前指向列表开头的指针。您现在已将其保存在热门Node *top = new Node; 中。然后将 top -> next = world; world = top; 设置为指向新节点。这成了你名单的新起点。这很好。

next

您不小心复制了几行代码。因为&#34; top&#34;此时,与&#34; world&#34;相同的指针,您只需将列表顶部的节点设置为指向自身。这是你的无限循环。

答案 1 :(得分:0)

您只为一个Node top分配内存,并一直使用它。在for循环中放入以下行解决问题:

   Node *top = new Node;

答案 2 :(得分:0)

嗯,我看到你的代码存在一些问题。

首先,这条线没有做任何事情:

top -> next;

如果您正在遍历链接列表来读取存储的值,那么您可能希望按以下方式执行以下操作:

for (;;)
{
    cout << world -> ctry.name << endl;
    if (world->next == null) break;
       else world = world -> next;
}

您的创建循环中有几个重复的行和循环链接:

    top -> next = world;
    world = top;

    top -> ctry.name = countryName;
    top -> next = world;
    world = top;

我认为这就是你的意思:

world = top;
for (int i = 0; i < 300; i++)
{
    if (inFile.eof())
    {
        top->next = NULL;
        break;
    } else top = top -> next;

    inFile >> temp >> temp1 >> temp2 >> temp3 >> population;
    getline (inFile,countryName);

    top -> ctry.population = population;
    top -> ctry.name = countryName;
    top -> next = new Node;

}

最后,保存一个函数调用并使用else:

if (!inFile.fail())
{
    cout << "File has opened successfully." << endl;
} else {
    cout << "File has failed to open." << endl;
    exit(1);
}

我希望这可以帮助你走上正轨。