题目
有n个记录存储在带头结点的双向链表中,利用双向冒泡排序法对其按上升序进行排序,请写出这种排序的算法。(注:双向冒泡排序即相邻两趟排序向相反方向冒泡)。看这里
结构体的定义
typedef struct DNode {
int data;
struct DNode *prior, *next;
} DNode, *DLinklist;
主体思想
从头结点的下一个结点开始往后遍历,在第一轮选出最大的结点(过程中遇到“较大”的数也进行交换),同时确定尾结点。
在回溯的时候,就是上诉的逆过程。这样每次一个来回,就可以确定“头尾”两个最终结果。当然,如果某一轮遍历的时候没有发生数据交换,则说明遍历已经结束。
主题代码
链表的交换排序可以交换结点或交换值,此处选择的是交换值的方式
void BubbleSort(DLinklist &L) {
DNode *p, *head, *tail;
head = L;//指向头结点
tail = NULL;
int ex = 1;
int temp;
while (ex) {
ex = 0;
p = head->next;//指向此次遍历的第一个结点
while (p->next != tail) {
if (p->data > p->next->data) {
ex = 1;
temp = p->data;
p->data = p->next->data;
p->next->data = temp;
}
p = p->next;
}
tail = p;//将当前停止位置作为尾结点,每次往前进步一个
while (ex && p->prior != head) {
if (p->data < p->prior->data) {
ex = 1;
temp = p->data;
p->data = p->prior->data;
p->prior->data = temp;
}
p = p->prior;
}
head = p;//将当前停止位置作为“首部”结点,每次往后退步一个
/*//循环中打印
ErgodicDLinklist(L);
cout << endl;*/
}
}
结尾
总的来说,双向链表相当于两个单链表…