#include<iostream>

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

双向链表的双向冒泡排序 c++的更多相关文章

  1. PHP实现冒泡排序、双向冒泡排序算法

    冒泡排序(Bubble Sort),是一种较简单的.稳定的排序算法.冒泡排序算法步骤:比较相邻的元素,如果第一个比第二个大,就交换他们两个的位置:对每对相邻的元素执行同样的操作,这样一趟下来,最后的元 ...

  2. Problem D: 双向冒泡排序

    Problem D: 双向冒泡排序 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 447  Solved: 197[Submit][Status][We ...

  3. python 排序冒泡排序与双向冒泡排序

    冒泡排序: 冒泡排序就是每次找出最大(最小)元素,放在集合最前或最后,这是最简单的排序算法 def bubble_sort(collection): #升序排列 length=len(collecti ...

  4. 双向链表、双向循环链表的JS实现

    关于链表简介.单链表.单向循环链表.JS中的使用以及扩充方法:  单链表.循环链表的JS实现 关于四种链表的完整封装: https://github.com/zhuwq585/Data-Structu ...

  5. [6] 算法路 - 双向冒泡排序的Shaker

    Shaker序列 –算法 1. 气泡排序的双向进行,先让气泡排序由左向右进行.再来让气泡排序由右往左进行,如此完毕一次排序的动作 2. 使用left与right两个旗标来记录左右两端已排序的元素位置. ...

  6. 鸡尾酒排序Cocktail Sort (双向冒泡排序)

    鸡尾酒排序 鸡尾酒排序思路,先从左边开始进行冒泡排序,第一趟冒泡排序完,最大值在的数组的最右端,然后进行第二趟排序,第二趟排序从右边开始排序,第二趟结束时,最小值在数组最左端,以此类推,每一趟排序完都 ...

  7. Java实现双向冒泡排序

    public class BubbleSort_Two { public static void bubbleSort_Two(int[] list){ //j在最外层定义 boolean needN ...

  8. 1.Go语言copy函数、sort排序、双向链表、list操作和双向循环链表

    1.1.copy函数 通过copy函数可以把一个切片内容复制到另一个切片中 (1)把长切片拷贝到短切片中 package main import "fmt" func main() ...

  9. 1.Go-copy函数、sort排序、双向链表、list操作和双向循环链表

    1.1.copy函数 通过copy函数可以把一个切片内容复制到另一个切片中 (1)把长切片拷贝到短切片中 ? 1 2 3 4 5 6 7 8 9 10 11 12 package main   imp ...

随机推荐

  1. 十五、React:简单点餐实例:知识点,html解析写法

    一.功能 从首页列表点进去,转到详情页 列表.详情从Api获取 Api列表:http://a.itying.com/api/productlist 详情:http://a.itying.com/api ...

  2. LeetCode1046 最后一块石头的重量(贪心—Java优先队列简单应用)

    题目: 有一堆石头,每块石头的重量都是正整数. 每一回合,从中选出两块最重的石头,然后将它们一起粉碎.假设石头的重量分别为 x 和 y,且 x <= y.那么粉碎的可能结果如下: 如果 x == ...

  3. mysql 免安装版密码操作

    登录MySQL:mysql -u root -p 1.修改用户密码: mysql> GRANT ALL ON . TO ‘root’@’localhost’ IDENTIFIED BY ‘123 ...

  4. cf 757C. Felicity is Coming!

    这个题还是比较劲的(题意太神了),才知道vector还可以==和排序,扒题解大法好!! #include<bits/stdc++.h> #define lowbit(x) x&(- ...

  5. 联系我们地图坐标展示js

    <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=6d88 ...

  6. bmp

    function GetNumberBuffer(cZi: string; cwidth, cheight: Integer; FontName: string; bold, italic: Bool ...

  7. Bean 注解(Annotation)配置(1)- 通过注解加载Bean

    Spring 系列教程 Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of ...

  8. canvas背景粒子动态变化动画

    var canvas = document.getElementById("cas"); var ctx = canvas.getContext("2d"); ...

  9. JavaScript——装饰者模式

    今天打算开始系统的学习设计模式,虽然之前有看过<大话设计模式>但是没能够静下心来写学习笔记导致很多内容都只是有一个概念而不会去应用.这次要记下学习的过程.接下来进入主题. 何为设计模式?设 ...

  10. C++ #if 1

    当注释掉大块代码时,使用"#if 0"比使用"/**/"要好,因为用"/**/"做大段的注释要防止被注释掉的代码中有嵌套的"/** ...