我使用merge_lists函数合并两个列表(最终合并排序)。它被编译但是当我运行它时,它会冻结。请帮忙什么不对?
node* merge_lists(node* list1,node* list2){
node* t;
node* temp1;
if(list1==NULL){
return list2;
}
else if(list2==NULL){
return list1;
}
if(((list1->head)->word)<=((list2->head)->word)){
t->head=list1->head;
temp1->head=list1->head->next;
t->next=merge_lists(temp1,list2);
}
else{
t->head=list2->head;
temp1->head=list2->head->next;
t->next=merge_lists(list1,temp1);
}
return t;
}
请注意我的班级节点定义如下:
class node{
public:
string word;
node *next;
node *head;
};
答案 0 :(得分:2)
您的冻结/崩溃可能是因为您在没有首先初始化它的情况下取消引用t
指针。这会导致未定义的行为。 (当您使用未初始化的变量时,一个好的编译器会发出警告。)
在尝试取消引用之前,您需要为t
分配一个有效指针。
temp1
指针存在同样的问题。
答案 1 :(得分:0)
您正在使用指针t和temp1而不为它们赋值。冻结只是众多可能中的一种。
答案 2 :(得分:0)
以下是一些评论:
t
和temp1
。你应该在开始时node* t = new node();
。head
和word
?我会删除head
,只让每个节点都有word
和next
。列表的头部可以是t
,list1
或`list2。这是一个有效的例子:
节点:
class node{
public:
string* word;
node *next;
};
合并:
node* merge_lists(node* list1,node* list2) {
if(list1==NULL) {
return list2;
} else if (list2==NULL) {
return list1;
}
// Create a new list to hold the merged result.
node* t;
if (*(list1->word)<=*(list2->word)) {
t = list1;
list1 = list1->next;
} else {
// Use list2
t = list2;
list2 = list2->next;
}
// Merge the remainder of the lists.
t->next = merge_lists(list1, list2);
}
公用设施:
node* make_list(string strings[], int len, int pos=0) {
node *list = NULL;
if (pos < len) {
list = new node();
list->word = &(strings[pos]);
list->next = make_list(strings, len, pos+1);
}
return list;
}
void display_list(node* list) {
while (list != NULL) {
cout << *(list->word) << "->";
list = list->next;
}
cout << "." << endl;
}
int main(int argc, char* argv[]) {
string s1[] = {"b", "d"};
string s2[] = {"a", "c", "e"};
node* l1 = make_list(s1, 2);
node* l2 = make_list(s2, 3);
cout << "List 1: ";
display_list(l1);
cout << "List 2: ";
display_list(l2);
node* sorted = merge_lists(l1, l2);
cout << "Merged: ";
display_list(sorted);
}