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;
}
单链表类型是没有头节点的链表,理解过程之后你可以试着用头节点类型的单链表实现以下,举一反三