栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

#数据结构:在带头结点的单链表上编写一个实现int类型数据的冒泡排序算法

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

#数据结构:在带头结点的单链表上编写一个实现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

#include

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

        {

            p=( SLNode *)malloc(sizeof(SLNode));

            tail->next=p;

            p->data=arr[i];

            p->next=NULL;

            tail=p;

        }

    return head;  //返回头指针

}

//冒泡排序算法

void BubbleSort(SLNode *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("%dt",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("nn");

    return 0;

}

七、测试数据

(1)7, 45, 20, 84, 37

(2)35,88,20,49,31

八、运行及测试情况

(1)

(2)

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/920583.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号