| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> #数据结构:在带头结点的单链表上编写一个实现int类型数据的冒泡排序算法 -> 正文阅读 |
|
[数据结构与算法]#数据结构:在带头结点的单链表上编写一个实现int类型数据的冒泡排序算法 |
在带头结点的单链表上,要求:编写一个实现int类型数据的冒泡排序算法。 一、问题描述 编写一个实现int类型的冒泡排序算法 二、基本要求 1) 建立一个带头节点的链表 2) 实现int类型数据 3) 冒泡排序算法 三、算法思想 冒泡排序的基本思想 冒泡排序是交换排序中一种简单的排序方法。它的基本思想是对所有相邻记录的关键字值进行比效,如果是逆顺(a[j]>a[j+1]),则将其交换,最终达到有序化; 其处理过程为: (1)将整个待排序的记录序列划分成有序区和无序区,初始状态有序区为空,无序区包括所有待排序的记录。 (2)对无序区从前向后依次将相邻记录的关键字进行比较,若逆序将其交换,从而使得关键字值小的记录向上”飘浮”(左移),关键字值大的记录好像石块,向下“堕落”(右移)。 每经过一趟冒泡排序,都使无序区中关键字值最大的记录进入有序区,对于由n个记录组成的记录序列,最多经过n-1趟冒泡排序,就可以将这n个记录重新按关键字顺序排列。 2.原始的冒泡排序算法 对由n个记录组成的记录序列,最多经过(n-1)趟冒泡排序,就可以使记录序列成为有序序列,第一趟定位第n个记录,此时有序区只有一个记录;第二趟定位第n-1个记录,此时有序区有两个记录;以此类推,算法框架为: for(i=n;i>1;i--){定位第i个记录} 四、数据结构 typedef int ElemType; typedef struct Node { ??? ElemType data; ??? struct Node *next; }SLNode; 五、模块划分 (1) typedef struct Node定义结构体并新命名SLNode (2) SLNode * CreateList(int *arr,int length) 利用尾插法创建带头结点的单链表并通过数组来传递数据 (3) void BubbleSort(SLNode *head)冒泡排序法的具体结构和详细思路 (4) void Display(SLNode *L)将冒泡排序法得到的排序结果打印出来 (5) int main()主函数,实现多个函数的调用并实现功能 六、源程序 #include<stdio.h> #include<stdlib.h> typedef int ElemType;// ElemType的含义就是“数据元素的类型”,是一个抽象的概念,是表示我们所要使用的数据元素应有的类型, 一种结构中元素的类型不一定是整型、字符型、浮点型或者用户自定义类型,为了不重复说明,使用过程中用“elemtype”代表所有可能的数据类型,简单明了的概括了整体。 typedef struct Node { ??? ElemType data; ??? struct Node *next; }SLNode; //创建带头结点的单链表(尾插法) SLNode * CreateList(int *arr,int length)? //通过数组来传递数据 { ??? SLNode *p,*head=NULL,*tail=NULL; ??? head=( SLNode *)malloc(sizeof(SLNode)); ??? head->next=NULL; ??? tail=head; ??? for(int i=0;i<length;i++) ??????? { ??????????? p=( SLNode *)malloc(sizeof(SLNode)); ??????????? tail->next=p; ??????????? p->data=arr[i]; ??????????? p->next=NULL; ??????????? tail=p; ??????? } ??? return head;? //返回头指针 } //冒泡排序算法 { ??? SLNode *p, *q, *tail;??? //tail作为每趟比较的截止标志 ??? tail = NULL; ??? while((head->next->next)!=tail) ??? { ??????? p = head;????????????? //p指向要进行比较的结点的前一个结点,对其初始化,是比较从头开始进行 ??????? q = head->next;??????? //q指向要进行比较的结点,对其初始化,是比较从头开始进行 ??????? while(q->next != tail) ??????? { ??????????? if((q->data) > (q->next->data))????? //将两个指针结点位置进行交换 ??????????? { ??????????????? p->next = q->next; ??????????????? q->next = q->next->next; ??????????????? p->next->next = q; ??????????????? q = p->next; ????? ??????} ??????????? q = q->next; ??????????? p = p->next; ??????? } ??????? tail = q; ??? } } //打印结果 void Display(SLNode *L) { ??? SLNode *p; ??? p=L->next; ??? while(p) ??? { ??????? printf("%d\t",p->data); ??????? p=p->next; ??? } } int main() { ??? int arr[]={7,45,20,84,37}; ??? SLNode *L; ??? L=CreateList(arr,sizeof(arr)/sizeof(arr[0])); ??? printf("\n排序前序列为:\n"); ??? Display(L); ??? printf("\n"); ??? BubbleSort(L); ??? printf("\n排序后的序列为:\n"); ??? Display(L); ??? printf("\n\n"); ??? return 0; } 七、测试数据 (1)7, 45, 20, 84, 37 (2)35,88,20,49,31 八、运行及测试情况 (1) (2) ? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 1:25:24- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |