我编写了一组函数,它们一起构建.csv文件中的“集线器”列表。我希望在我的main函数中生成这些集线器的链表我有一个“head”指针,我可以传递给main中的其他函数。
主要代码:
HubNode *hh = NULL;
HubNode **head;
*head = hh;
Tools::loadHubs(head);
cout << hh->name; /* HubNodes have a string called "name" */
工具中的代码:
void Tools::loadHubs(HubNode **head)
{
string line, name, location;
// headFlights = currFlights = prevFlights = NULL;
ifstream myfile("Hub.csv");
if (myfile.is_open())
{
while (getline(myfile, line)) {// Omit the Caption Line.
while (getline(myfile, name, ','))//Get every value in order.
{
getline(myfile, location, '\n');
// cout << line << "\n";
// cout << name << "\n";
// cout << location << "\n";
HubNode::AddHub(name, location, head);
}
}
myfile.close();
}
else { cout << "\nUnable to open file\n"; }
}
HubNode中的代码:
void HubNode::AddHub(string sname, string slocation, HubNode **head)
{
HubNode* newNode = new HubNode;
HubNode *point;
newNode->next = NULL;
newNode->name = sname;
newNode->location = slocation;
if (*head != NULL)
{
HubNode *curr = *head;
while (curr->next != NULL)
{
curr = curr->next;
}
curr->next = newNode;
}
else
{
point = newNode;
*head = point;
}
}
我认为以这种方式使用指向列表头部的双指针会起作用,因此从main中的“hh”,我可以访问整个链表。
当我编译并开始调试时,我可以看到AddHubs在其范围内成功创建了HubNodes,但是当我尝试访问main中的任何元素时(例如,通过cout&lt;&lt; hh-&gt; name) ,我得到一个分段错误。
我做错了什么? (如果我需要发布更多代码,请告诉我......)
答案 0 :(得分:1)
你不会这样做:
int value = 10;
int *p;
*p = value;
那你为什么认为这个会起作用呢?
HubNode *hh = NULL;
HubNode **head;
*head = hh;
间接是相同的,只有类型已更改。两个片段都会调用未定义的行为。这段代码应该这样做:
HubNode *hh = NULL;
Tools::loadHubs(&hh);
cout << hh->name;
此外,您的添加功能应为:
void HubNode::AddHub(const string& sname, const string& slocation, HubNode **head)
{
HubNode* newNode = new HubNode;
newNode->next = NULL;
newNode->name = sname;
newNode->location = slocation;
while (*head)
head = &(*head)->next;
*head = newNode;
}
如果为HubNode
提供适当的构造函数,将sname
和slocation
作为构造参数并将节点next
成员初始化为NULL,则会更加直接。如果您编码,则添加变为简单:
void HubNode::AddHub(const string& sname, const string& slocation, HubNode **head)
{
while (*head)
head = &(*head)->next;
*head = new HubNode(sname, slocation);
}