基于双向链表的双向冒泡排序法
#include<iostream>
using namespace std;
typedef struct DbNode {
int data;
DbNode* lLink;
DbNode* rLink;
DbNode():data(0),lLink(nullptr),rLink(nullptr){}
DbNode(int x) :data(x), lLink(nullptr), rLink(nullptr) {}
}DbNode,*DbLinkList;
//双向链表
DbLinkList TailInsert(int n) {
DbNode* head = new DbNode;
DbNode* r = head;
int x;
for (int i = 0; i < n; i++) {
cin >> x;
DbNode* p = new DbNode(x);
r->rLink = p;
p->lLink = r;
r = p;
}
r->rLink = nullptr;
return head;
}
void db_bubble_sort(DbLinkList L) {
DbNode* p = L->rLink;
DbNode* r = p;
int len = 0;
while (r != nullptr) {
len++;
r = r->rLink;
}
int f = 0;
len = len - 1;
while (f < len) {
//正向冒泡
while (p->rLink) {
DbNode* q = p->rLink;
if (q->data < p->data) {
p->rLink = q->rLink;
if (q->rLink != nullptr) {
q->rLink->lLink = p;
}
q->lLink = p->lLink;
p->lLink->rLink = q;
q->rLink = p;
p->lLink = q;
}
else {
p = p->rLink;
}
}
len--;
//反向冒泡
while (p->lLink!=L) {
DbNode* q = p->lLink;
if (q->data > p->data) {
q->rLink = p->rLink;
if (p->rLink != nullptr) {
p->rLink->lLink = q;
}
p->lLink = q->lLink;
q->lLink->rLink = p;
p->rLink = q;
q->lLink = p;
}
else {
p = p->lLink;
}
}
f++;
}
}
void print(DbLinkList L) {
DbNode* p = L->rLink;
while (p) {
cout << p->data;
if (p->rLink != nullptr) {
cout << " ";
}
p = p->rLink;
}
cout << endl;
}
int main() {
int n;
while (cin >> n && n != 0) {
DbLinkList L = TailInsert(n);
db_bubble_sort(L);
print(L);
}
return 0;
}