合并两个链接列表会产生seg错误等

时间:2015-04-24 15:53:06

标签: c++ pointers merge linked-list segmentation-fault

我正在创建一个状态对象的链接列表,每个状态对象都包含一个居住在该状态的驻留对象的链接列表。用户读入数据库文件,然后可以从少数命令中进行选择,例如找人,移动人或将两个状态合并为全新状态。当我尝试合并两个州的人时,我必须创建一个新状态,将所有人从第一个州的居民列表移动到新州的居民列表,并对第二个州的居民列表执行相同操作。然后人们应该出现在新州的居民名单中,但不会出现在原始州的居民名单中。我遇到了一堆错误:当我尝试合并时,我会得到重复的免费块警告;当用户尝试将新状态的常驻列表打印为命令时,不会列出任何人;此外,当用户试图打印原始状态的常驻列表中的任何一个时,前几个被打印但是然后出现设置错误,核心被转储,程序停止运行。任何帮助将不胜感激。

在我的列表对象中:

void addLink (Link <type> * data) {
    if (first == NULL) {
        first = data;
        last = data;
    }
    else {
        last->next = data;
        last = data;
    }
}

在我的主要内容中,如果键入的命令是“merge”......

else if (cmd == "merge") {
    string state1, state2, newstate;
    cin >> state1 >> state2 >> newstate;
    State * ns = state_ls->addLink(new State(newstate))->data;
    Link <State*> * s1 = searchList(state1, state_ls);
    Link <State*> * s2 = searchList(state2, state_ls);
    List <Person*> people1 = s1->data->res_list;
    List <Person*> people2 = s2->data->res_list;
    List <Person*> newres_list = ns->res_list;
    Link <Person*> * temp = people1.first;
    while (temp != NULL) {
        newres_list.addLink(temp);
        temp = temp->next;
        }
    temp = people2.first;
    while (temp != NULL) {
        newres_list.addLink(temp);
        temp = temp->next;
        }
}

1 个答案:

答案 0 :(得分:0)

代码中的一些问题可能是导致问题的原因:

  1. 您不会检查searchList()的结果。如果您输入的状态不存在并返回NULL,该怎么办?同样适用于addLink(),如果它可能失败。
  2. people1people2newres_list是原始列表的副本。根据这些类的实现方式,这可能是坏的或非常糟糕的。您可能希望在此处使用指针或引用,例如:

    List <Person*>& people1 = s1->data->res_list;
    List <Person*>& people2 = s2->data->res_list;
    List <Person*>& newres_list = ns->res_list;
    
  3. 如果您希望将人员从原始状态移动到新状态,则需要在移动后重置人员列表的头部/尾部。可能类似于:

    s1->person->data->res_list->first = NULL;
    s1->person->data->res_list->last = NULL;
    s2->person->data->res_list->first = NULL;
    s2->person->data->res_list->last = NULL;
    
  4. 更新 - 您似乎对链接列表指针以及从多个列表添加/删除节点感到有些困惑。如果我们看一个简单的例子:

    List<Person*>* Person1 = new List<Person*>;
    List<Person*>* Person2 = new List<Person*>;
    List<Person*> List1;
    List<Person*> List2;
    
    List1.addLink(Person1);
    List1.addLink(Person2);   //Ok: List1 has two persons
    
    List2.addLink(Person1);   //Error: Person1 can't belong to both lists
    

    在尝试将一个列表中已有的节点添加到另一个列表之前,一切都很好。这将导致&#34;陷入困境&#34;两个列表中的节点next指针。

    另一个困惑似乎是如何将所有元素从一个列表移动到另一个列表。您所要做的就是设置两个列表的头部/尾部,例如将所有节点从List1移动到List2只是这样做:

    List2.first = List1.first;
    List2.last  = List1.last;
    List1.first = NULL;
    List1.last  = NULL;
    

    您不需要触摸List1中的各个节点,因为您不会更改其指针位置。如果要将所有节点从List1复制到List2,则必须创建新节点,这有点不同。

    如果您仍然遇到纠正码的问题,我建议将其缩小为一个展示问题的小例子并发布另一个SO问题。