【发布时间】:2015-02-10 06:51:41
【问题描述】:
我正在编写一个合并两个已经排序的链表的方法。但是,由于某种原因,列表的最后一个节点不会打印出来。有什么想法吗?
#include <iostream>
using namespace std;
struct node {
int number;
node *next;
node *prev;
};
void mergeSort(node*& head, node*& head1);
int main(int argc, const char * argv[])
{
//Linked List #1
node *head;
node *tail;
node *curr;
//1st node
curr = new node;
curr-> number = 1;
curr-> prev = NULL;
head = curr;
tail = curr;
//2nd node
curr = new node;
curr-> number = 3;
curr -> prev = tail;
tail -> next = curr;
tail = curr;
//3rd node
curr = new node;
curr-> number = 5;
curr -> prev = tail;
tail -> next = curr;
tail = curr;
//4th node (tail)
curr = new node;
curr-> number = 7;
curr -> prev = tail;
tail -> next = curr;
tail = curr;
tail->next = NULL;
//Print Linked List #1
cout<< "Linked List #1: " << endl;
curr = head;
while (curr != NULL){
cout << curr-> number;
curr = curr->next;
}
cout << endl;
//Linked List #2
node *head1;
node *tail1;
node *curr1;
//1st node
curr1 = new node;
curr1-> number = 2;
curr1-> prev = NULL;
head1 = curr1;
tail1 = curr1;
//2nd node
curr1 = new node;
curr1-> number = 4;
curr1 -> prev = tail1;
tail1 -> next = curr1;
tail1 = curr1;
//3rd node
curr1 = new node;
curr1-> number = 6;
curr1 -> prev = tail1;
tail1 -> next = curr1;
tail1 = curr1;
//4th node (tail)
curr1 = new node;
curr1-> number = 8;
curr1 -> prev = tail1;
tail1 -> next = curr1;
tail1 = curr1;
tail1->next = NULL;
//Print Linked List #2
cout<< "Linked List #2: " << endl;
curr1 = head1;
while (curr1 != NULL){
cout << curr1-> number;
curr1 = curr1->next;
}
cout << endl;
//Call MergeSort function
mergeSort(head, head1);
return 0;
}
这里是链表的归并排序方法。
void mergeSort(node*& head, node*& head1){
//Set up the Merge Sorted Linked List
node *head2;
node *tail2;
node *curr2;
node *curr = head;
node *curr1 = head1;
node* next = curr->next;
node* next1 = curr1->next;
node* next2 = curr2->next;
//1st NODE
curr2 = new node;
if (curr->number > curr1->number){
curr2->number = curr1->number;
curr1 = curr1->next;
curr1 = next1;
}
else if (curr1->number > curr->number){
curr2->number = curr->number;
curr = curr->next;
curr = next;
}
//Set prev of head to Null
curr2 -> prev = NULL;
//Set head
head2 = curr2;
//Set tail
tail2 = curr2;
//BODY NODES
while (curr != NULL && curr1 != NULL ){
curr2 = new node;
//compare the data between the two nodes
//compare the data between the two nodes
if (curr1->number >= curr -> number){
//set the new node's data to the smallest of the previous
//node's datas
//from the other two Linked Lists
curr2 -> number = curr -> number;
//link the new node to the previous
curr2 -> prev = tail2;
//attach the predecessor node's next pointer to the current
//node
tail2 -> next = curr2;
//set the new node as the tail
tail2 = curr2;
//iterate through the selected Linked List
curr = curr -> next;
}
else if (curr->number >= curr1-> number){
//set the new node's data to the smallest of the previous node's
//datas
//from the other two Linked Lists
curr2 -> number = curr1 -> number;
//link the new node to the previous
curr2 -> prev = tail2;
//attach the predecessor node's next pointer to the current node
tail2 -> next = curr2;
//set the new node as the tail
tail2 = curr2;
//iterate through the selected Linked List
curr1 = curr1 -> next;
}
} tail2 -> next = NULL;
//Print Linked List #3
cout<< "Linked List #3: " << endl;
curr2 = head2;
while (curr2){
cout << curr2-> number;
curr2 = curr2->next;
}
cout << endl;
}
【问题讨论】:
-
为什么需要上一个链接来合并两个排序的链表?
-
学习使用调试器,逐行查看代码,看看实际发生了什么。
-
std::list是一个双链表,就像你的一样,std::merge是你正在实现的算法。如果您不是出于教育目的这样做,请考虑使用它们。 -
这是一个合并,而不是合并排序。该函数应该返回一个指向列表开头的指针:node * merge(node * head1, node * head2);
-
列表是否需要是双链表(下一个和上一个指针)?
标签: c++ linked-list nodes mergesort