我刚刚开始学习链接列表,我正在尝试从文件中提取某些信息,并使用推送功能将其插入到链接列表中。当我尝试查看信息以查看它是否正确插入时,它只是一遍又一遍地显示信息的最后一行。我究竟做错了什么?这是我的代码:
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;
}
}
答案 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);
}
我希望这可以帮助你走上正轨。