C语言—单链表的冒泡排序

C语言—单链表实现冒泡排序

昨天在做学生成绩管理系统的时候,其中一个功能是要实现对学生的成绩从高到低排名,如果数据是存储在数组中的话,会很容易实现,但是这时成绩信息作为结构体成员被保存在单链表中,所以在每一轮交换排序的时候,地址不像数组那样可以简单通过下标转换而改变 所以查了资料时候掌握了单链表的冒泡排序 分享给大家。


先说说冒泡排序的中心思想:通过对无序序列的相邻元素两两比较交换,每次把最大(小)的数据放在最后,这个过程就像是冒泡一样,所以叫他冒泡排序。


在数组中冒泡排序之所以容易实现的原因在于

* 数组中数据在内存中的存储是连续的,并且通过下标的改变就可以轻松改变指针所指的地址

但在链表中,每个节点在内存中的位置是不确定的,所以不容易改变指针所指地址,来重复对链表内相邻节点的数据进行比较。


  • 所以为了解决这个问题,我们定义pFirst和pEnd两个结构体指针变量,用来表示,每一轮比较中的第一个节点和最后一个节点。我们要清楚,假设有n个数据,外层要进行n-1次循环,内层第一次比较n-1次,之后每次都少比较一次(上一次已经把最小数放在了最后)。所以pFirst和pEnd每次内循环之后都要更新。

一下是代码实现:

#include<stdio.h>
#include<stdlib.h>
struct NODE{
    int date;
    struct NODE *next;
};
typedef struct NODE *node;
int count = 0;

node creat(){
    node pHead=NULL,pNew,pEnd;
    printf("输入数据,当输入-1时停止\n");
    pNew=(node)malloc(sizeof(struct NODE));
    scanf("%d",&pNew->date);
    while(pNew->date != -1){
        count++;
        if(count == 1){
            pNew->next = NULL;
            pEnd = pNew;
            pHead = pNew;
        }
        else{
            pNew->next=NULL;
            pEnd->next=pNew;
            pEnd=pNew;
        }
            pNew=(node)malloc(sizeof(struct NODE));
            scanf("%d",&pNew->date);
    }
        free(pNew);
    return pHead;
}

void print(node pHead){
    int index=1;
    node pTemp=pHead;
    while(pTemp!=NULL){
        printf("第%d个数据:",index++);
        printf("%d\n",pTemp->date);
        pTemp=pTemp->next;
    }
}

node sort(node pHead){
    node pfirst=NULL,pend=NULL;
    pfirst=pHead;
    while(pfirst != pend){
        while(pfirst->next != pend){
            if(pfirst->date<pfirst->next->date){
                int temp=pfirst->date;
                pfirst->date=pfirst->next->date;
                pfirst->next->date=temp;
            }
               pfirst=pfirst->next;
        }
        pend=pfirst;
        pfirst=pHead;
    }
    return pHead;
}

int main(){
    node pHead=NULL;
    pHead=creat();
    printf("排序前:\n");
    print(pHead);
    pHead=sort(pHead);
    printf("排序后:\n");
    print(pHead);
    return 0;
}

单链表类型是没有头节点的链表,理解过程之后你可以试着用头节点类型的单链表实现以下,举一反三

  • 15
    点赞
  • 82
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值