merge_lists函数用于两个链表的merge_sort

时间:2013-08-22 17:37:58

标签: c++ linked-list mergesort

我使用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;
};

3 个答案:

答案 0 :(得分:2)

您的冻结/崩溃可能是因为您在没有首先初始化它的情况下取消引用t指针。这会导致未定义的行为。 (当您使用未初始化的变量时,一个好的编译器会发出警告。)

在尝试取消引用之前,您需要为t分配一个有效指针。

temp1指针存在同样的问题。

答案 1 :(得分:0)

您正在使用指针t和temp1而不为它们赋值。冻结只是众多可能中的一种。

答案 2 :(得分:0)

以下是一些评论:

  • 您在分配之前使用ttemp1。你应该在开始时node* t = new node();
  • 为什么您的节点同时拥有headword?我会删除head,只让每个节点都有wordnext。列表的头部可以是tlist1或`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);
}