C ++:将链表传递给静态函数

时间:2014-04-07 05:42:39

标签: c++ pointers linked-list runtime

我编写了一组函数,它们一起构建.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) ,我得到一个分段错误。

我做错了什么? (如果我需要发布更多代码,请告诉我......)

1 个答案:

答案 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提供适当的构造函数,将snameslocation作为构造参数并将节点next成员初始化为NULL,则会更加直接。如果您编码,则添加变为简单:

void HubNode::AddHub(const string& sname, const string& slocation, HubNode **head)
{
  while (*head)
      head = &(*head)->next;
  *head = new HubNode(sname, slocation);
}