我正在创建一个状态对象的链接列表,每个状态对象都包含一个居住在该状态的驻留对象的链接列表。用户读入数据库文件,然后可以从少数命令中进行选择,例如找人,移动人或将两个状态合并为全新状态。当我尝试合并两个州的人时,我必须创建一个新状态,将所有人从第一个州的居民列表移动到新州的居民列表,并对第二个州的居民列表执行相同操作。然后人们应该出现在新州的居民名单中,但不会出现在原始州的居民名单中。我遇到了一堆错误:当我尝试合并时,我会得到重复的免费块警告;当用户尝试将新状态的常驻列表打印为命令时,不会列出任何人;此外,当用户试图打印原始状态的常驻列表中的任何一个时,前几个被打印但是然后出现设置错误,核心被转储,程序停止运行。任何帮助将不胜感激。
在我的列表对象中:
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;
}
}
答案 0 :(得分:0)
代码中的一些问题可能是导致问题的原因:
searchList()
的结果。如果您输入的状态不存在并返回NULL,该怎么办?同样适用于addLink()
,如果它可能失败。 people1
,people2
和newres_list
是原始列表的副本。根据这些类的实现方式,这可能是坏的或非常糟糕的。您可能希望在此处使用指针或引用,例如:
List <Person*>& people1 = s1->data->res_list;
List <Person*>& people2 = s2->data->res_list;
List <Person*>& newres_list = ns->res_list;
如果您希望将人员从原始状态移动到新状态,则需要在移动后重置人员列表的头部/尾部。可能类似于:
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;
更新 - 您似乎对链接列表指针以及从多个列表添加/删除节点感到有些困惑。如果我们看一个简单的例子:
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问题。