双向链表排序 c++
#include <iostream>
using namespace std;
//节点类型的定义
class Node
{
public:
int data;
Node *pre;
Node *next;
Node(int _data) : data(_data), pre(NULL), next(NULL)
{
}
};
void TwoWayBubble(Node *&L);
void CreateList(Node *&L, int n);
void Traverse(Node *L);
void TwoWayBubble(Node *&L)
{
Node *head = L; //头
Node *tail = NULL; //尾
Node *p = L->next;
// Node *q;
bool exchange = true; //是否交换,并且最后根据是否发生交换来判断循环是否结束
while (exchange)
{
exchange = false;
//大数沉底
while (p->next != tail) //从左往右大数沉底
{
if (p->data > p->next->data)
{
exchange = true; //发生了交换
swap(p->data, p->next->data);
}
p = p->next; //后移
}
//小数起泡
while (p->pre != head) //从右往左小数冒泡
{
if (p->data < p->pre->data)
{
exchange = true; //发生了交换
swap(p->data, p->pre->data);
}
p = p->pre; //前移
}
}
}
void CreateList(Node *&L, int n)
{
Node *p = L; //p指向最后一个节点
int a;
for (int i = 0; i < n; i++)
{
cin >> a;
Node *pNew = new Node(a); //分配一个新的节点空间;
p->next = pNew; //连接上上一个节点
pNew->pre = p; //新节点的前驱节点
pNew->next = NULL; //新节点的后继节点
p = p->next; //p更新
}
}
void Traverse(Node *L)
{
Node *p = L->next;
while (p != NULL)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
int main()
{
int n; //数据元素个数
//头结点的创建
Node *L = new Node(-1); //分配一个节点的空间;
//前驱后继均为空
L->next = NULL;
L->pre = NULL;
cin >> n;
CreateList(L, n); //链表的构建
cout << "before sort: " << endl;
Traverse(L);
TwoWayBubble(L); //双向冒泡
cout << "after sort: " << endl;
Traverse(L); //遍历链表
return 0;
}