c语言关于使用链表排序(选择排序、冒泡排序)

单链表的冒泡排序(C/C++实现) 前言 大家在做需要排名的项目的时候,需要把各种数据从高到低排序,如果用的冒泡排序的话,处理数组是十分简单的,因为数组的存储空间的连续的,可以通过下标就可以简单的实现,但如果是链表的话,是随机分配的,不能像数组那样通过下标就直接实现。所以在这里给大家介绍一个简单一点的冒泡排序 冒泡排序 冒泡排序的是交换排序其中的一种,主要思想是每一个元素与后一个元素比较,若这个元素大于后一个元素,则交换这两个元素的位置(这里采用从小到大排序),第一次排序后最后一个数已经变成了最大数,再进行n-2次排序即可完成(假设有n个数据 阅读详情
AI摘要

本文介绍两种链表排序方法:冒泡排序与选择排序,并提供源代码实现。通过两两比较或选择最小值的方式,实现链表中学生分数的升序排列。

链表冒泡排序

比较两个相邻的元素大小,每一趟会把较大(或较小)的数放在往后移。链表冒泡排序思想:设置两个指针,一个是当前指针,一个是尾指针,当前的指针指向头节点,将尾指针赋为空,当当前的指针不等于尾指针是一次循环,第一次将当前一个节点的值与下一个节点的值相比较,直到下一个节点和尾指针相等(即为空),结束本次循环,最后当前的指针赋给尾指针,当前指针重新指向头结点,再两两相比较,把最大(或最小)的数放在最后

//冒泡排序的主要思想两两相性比较,每比较一次会把一轮最大或最小的数放在最后 
void BubbleSort(struct student *head){
	struct student *cur,*tail;
	cur=head;
	tail=NULL; 
	if(cur==NULL||cur->next==NULL){
		return;
	}
	while(cur!=tail){
		while(cur->next!=tail){
			if(cur->score>cur->next->score){
				int temp=cur->score;
				cur->score=cur->next->score;
				cur->next->score=temp;
				long temp1=cur->num;
				cur->num=cur->next->num;
				cur->next->num=temp1;
			}
			cur=cur->next;
		}
		tail=cur;
		cur=head;
	}
	
}

选择排序:

选择排序的思想将当前的元素和后面的元素相比较,每循环一次把最大或最小的元素赋值给当前的元素。

//选择排序
void SelectedSort(struct student *head){
	struct student *cur,*p=NULL,*q=NULL;
	cur=head;
	int score=0,cscore=0;
	if(cur==NULL||cur->next==NULL){
		return;
	}
	while(cur!=NULL){
		p=cur->next; 
		q=cur->next;
		score=cur->score;
		cscore=score;
		while(p!=NULL){
			if(cscore>p->score){
				cscore=p->score;
				q=p;
			}
			p=p->next;
		}
		if(score!=cscore){
			q->score=score;
			cur->score=cscore;
			long temp=cur->num;
			cur->num=q->num;
			q->num=temp;
		}
		cur=cur->next;	
	}
} 
链表排序的源代码(可测):
#include <stdio.h> 
#include <malloc.h>
#define LEN sizeof(struct student)

struct student{
	long num;
	int score;
	struct student *next;
}; 

int main(){
	struct student *create();
	void print(struct student *head);
	void BubbleSort(struct student *head);
	void SelectedSort(struct student *head);
	struct student *head;
	head=create();
	print(head);
	//BubbleSort(head);
	SelectedSort(head);
	print(head);
	
}
int n; 
struct student *create(){
	n=0;
	struct student *head,*p1,*p2;
	p1=p2=(struct student *)malloc(LEN);
	scanf("%ld,%d",&p1->num,&p1->score);
	head=NULL;
	while(p1->num!=0){
		n=n+1;
		if(n==1){
			head=p1;
		}else{
			p2->next=p1;
		}
		p2=p1;
		p1=(struct student *)malloc(LEN);
		scanf("%ld,%d",&p1->num,&p1->score);
	}
	p2->next=NULL;
	return(head);
}
void print(struct student *head){
	struct student *p;
	p=head;
	printf("%d名学生的成绩分别是:\n",n);
	if(head!=NULL){
		do{
			printf("%ld,%d\n",p->num,p->score);
			p=p->next;
		}while(p!=NULL);
	}else{
		printf("链表为空"); 
	}  
}
//冒泡排序的主要思想将前后两两相比较,每比较一次会把一轮最大或最小的数放在最后 
void BubbleSort(struct student *head){
	struct student *cur,*tail;
	cur=head;
	tail=NULL; 
	if(cur==NULL||cur->next==NULL){
		return;
	}
	while(cur!=tail){
		while(cur->next!=tail){
			if(cur->score>cur->next->score){
				int temp=cur->score;
				cur->score=cur->next->score;
				cur->next->score=temp;
				long temp1=cur->num;
				cur->num=cur->next->num;
				cur->next->num=temp1;
			}
			cur=cur->next;
		}
		tail=cur;
		cur=head;
	}
	
}
//选择排序
void SelectedSort(struct student *head){
	struct student *cur,*p=NULL,*q=NULL;
	cur=head;
	int score=0,cscore=0;
	if(cur==NULL||cur->next==NULL){
		return;
	}
	while(cur!=NULL){
		p=cur->next; 
		q=cur->next;
		score=cur->score;
		cscore=score;
		while(p!=NULL){
			if(cscore>p->score){
				cscore=p->score;
				q=p;
			}
			p=p->next;
		}
		if(score!=cscore){
			q->score=score;
			cur->score=cscore;
			long temp=cur->num;
			cur->num=q->num;
			q->num=temp;
		}
		cur=cur->next;	
	}
} 


C语言——链表排序 单链表排序 前言: 最近总结了一下针对只有头结点的单链表进行排序的几个简单的方法。 交换节点:插入排序,冒泡排序,简单选择排序 交换数据:快速排序 初始化: #include <stdio.h> #include <stdlib.h> #include <stdbool.h> //节点结构 struct node { int val;... 阅读详情

相关推荐

EC20模块实战:5步搞定MQTT连接阿里云IoT(附常见错误排查)

本文详细介绍了使用EC20 4G模块通过AT指令连接阿里云IoT平台的完整实战流程。文章以智能农业项目为背景,从硬件接线、网络注册、PDP激活,到MQTT连接配置、一型一密动态注册及数据收发,提供了清晰的5步操作指南,并重点附上了常见错误排查方法,帮助开发者快速实现稳定可靠的物联网设备上云。

weixin_29209801的博客 196

链表冒泡排序总结(C语言 两种解决方案)

在大一上学期,我们学了冒泡排序,选择排序,插入排序等等,而今天主要详解一下链表的冒泡排序的问题。(边看代码,边讲解) 首先,回顾一下,什么叫做冒泡排序。冒泡排序是一种时间复杂度在n的平方下的排序;每次循环都是比较前后两项,要么以从小到大排序,要么从大到小排序。 第一种: struct node *bubblesort(struct node *headptr)//接受头指针,链表的开端,首节点不...

计算机科学与技术专业学生的成长之路 1万+

Box2D-Lite源码阅读笔记(2)

0.初始化函数 static void InitDemo(int index) { world.Clear(); numBodies = 0; numJoints = 0; bomb = NULL; demoIndex = index; demos[index](bodies, joints); } 在这个初始化函数中,一般会默认执行index=0的函数,这个函数就是一个示例,因为示例比较简单,所以也便于研究,示例效果如下。 就是一个方块。 进入第一个示例函数。(忽略我加的注释)

ARTELE的博客 976

C语言单链表冒泡排序

前言 大家在做学生成绩管理系统的时候,其中一个功能是要实现对学生的成绩从高到低排名,如果数据是存储在数组中的话,会很容易实现,但是这时成绩信息作为结构体成员被保存在单链表中,所以在每一轮交换排序的时候,地址不像数组那样可以简单通过下标转换而改变 所以在这里给大家分享下单链表的冒泡排序 。 冒泡排序 先说说冒泡排序的中心思想:通过对无序序列的相邻元素两两比较交换,每次把最大(小)的数据放在最后...

莫影 is Joker 1万+

浅谈迪杰斯特拉(Dijkstra)算法和A*算法原理及实现

迪杰斯特拉(Dijkstra)算法和A*算法的原理及实现。

Guo_Zhanyu 9599

探索Vortex开源GPGPU:RISC-V SIMT架构(2),指令Decode

本文分析了Vortex RISC-V内核的Decode模块设计。文章详细介绍了指令译码过程,包括操作码、功能码和寄存器字段的提取,以及不同类型指令(R/I/S/B/U/UJ)的立即数处理。重点阐述了基于操作码和功能码的分层译码逻辑,包括ALU运算、分支跳转、系统调用等指令的译码规则。此外,还描述了定制指令的处理机制以及与调度器的握手协议。Decode模块通过组合逻辑实现快速译码,并将结果传递给下级Issue模块,同时协调指令流控制。

weixin_55313207的博客 1792

万字长文,链表排序算法——冒泡排序、选择排序、插入排序、归并排序、快速排序、计数排序、桶排序、基数排序精讲及python实现

在数组排序中,常见的排序算法有:冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序等。而对于链表排序而言,因为链表不支持随机访问,访问链表后面的节点只能依靠next指针从头部顺序遍历,所以相对于数组排序问题来说,链表排序问题会更加复杂一点。下面先来总结一下适合链表排序与不适合链表排序的算法:冒泡排序选择排序插入排序归并排序快速排序计数排序桶排序基数排序。希尔排序。堆排序。希尔排序为什么不适合链表排序?希尔排序:希尔排序中经常涉及到对序列中第。

白话机器学习 4819

SAR成像系列:【3】合成孔径雷达(SAR)的二维回波信号与简单距离多普勒(RD)算法 (附matlab代码)

二维回波信号分析

zr2006_7的专栏 2万+

c语言实现链表的冒泡排序

最近学了链表,晚上想要写一个链表的冒泡排序,一开始没有大的头绪,在网上查找了一翻也差强人意,大多写得十分复杂,可读性很差,于是自己写了一个,如果有后来者碰到类似的疑惑,或许可以提供一点帮助,代码的讲解就在注释里面了,因为是自己写着玩,所以也没有封装函数,如果有兴趣,可以自己改改。

m0_66423624的博客 799

【WRF理论第十五期】WPS中输入geogrid二进制格式

WPS中输入geogrid二进制格式

WW、forever的博客 1079

【异常】Cursor报错We‘re having trouble connecting to the model provider. This might be temporary

在使用Cursor编辑器进行AI交互操作时,界面弹出如下报错提示,导致无法正常调用模型服务,影响使用流程:We’re having trouble connecting to the model provider. This might be temporary - please try again in a moment. 该报错核心含义为Cursor编辑器无法正常连接至背后的AI模型服务提供商(如OpenAI、Anthropic等),属于连接类异常,并非编辑器本身运行故障。经排查,该报错不具备破坏性,仅

奶爸的编程之路,也就一周冷个三天 1691

C语言 链表数据的排序

C语言使用链表时,有些时候会对链表中的数据进行排序。下边介绍使用链表时可用的排序方法,冒泡排序和选择排序。 此链表排序仅对链表中的数据进行排序,如果想进行对整个结构体的排序,也就是利用数据顺序来调整节点中的信息,需要对节点进行交换,但与此方法不同,望读者周知。 测试排序代码请先参考下边完整的测试代码。 编程环境:Visual C++ 6.0. 冒泡排序 NODE* bubblesort(NODE* Head) { NODE *pfirst=NULL,*psecond=NULL,*pend=NULL

Code_peasant的博客 1万+

华为OD机试 - 项目规划 - 深度优先搜索dfs(Java 2024 C卷 100分)

每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天优快云在线答疑。

学Java,找哪吒 1153

【C语言】单链表的排序

void BubbleList(PLinkList *pplist) {            PLinkList prev,next,end ;           end= NULL;            while(end!=(*pplist )->next)           {                    prev=* pplist;

ZDF0414的专栏 5826

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

基于c语言链表上的两种排序操作

这是我在用c语言写学生管理系统时,想将录入的学生信息进行总分排序,所想出的两种排序方法。冒泡排序的大体思路就是先遍历记录结点总数n,然后做n次循环,每次找出链表中总分最高的学生结点,然后将他们依次尾插于新结点,然后再将原结点总分清零,这样就不会再次影响后续的寻找过程。这是一种基于新链表操作的排序方式。时间复杂度n²,空间复杂度n。 //冒泡排序(新建链表实现) Student* sort(Stud...

baldicoot_的博客 435

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

c语言使用链表对字符串排序,求解C语言中建立一个对链表按照学号进行排序的问题...

==========================功能:选择排序(由小到大)返回:指向链表表头的指针==========================*//*选择排序的基本思想就是反复从还未排好序的那些节点中,选出键值(就是用它排序的字段,我们取学号num为键值)最小的节点,依次重新组合成一个链表。我认为写链表这类程序,关键是理解:head存储的是第一个节点的地址,head->next存...

weixin_30452659的博客 1320

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

链表的选择排序

用c简单实现了一下链表的选择排序~ #include<stdio.h> #include<malloc.h> typedef struct list{ int data; list* next; }*listd; void pr(listd head){ //选择排序 listd q,p,r; int s; for(p=head->next;p!=NULL;p=p->next){ r=p; for(q=p->next;q!=NULL;q=q-&g

xszdbc的博客 631

按学号的顺序大小排序c语言,求解C语言中建立一个对链表按照学号进行排序的问题...

==========================功能:选择排序(由小到大)返回:指向链表表头的指针==========================*//*选择排序的基本思想就是反复从还未排好序的那些节点中,选出键值(就是用它排序的字段,我们取学号num为键值)最小的节点,依次重新组合成一个链表。我认为写链表这类程序,关键是理解:head存储的是第一个节点的地址,head->next存...

weixin_34255938的博客 2360

考研数据结构(九):单链表排序(直接插入排序、冒泡排序、选择排序)

单链表的排序与顺序表的思想类似,如果对顺序表排序的思想及实现还不懂的小伙伴,戳我带你了解八大排序算法的实现。 #include <stdio.h> #include <stdlib.h> typedef struct LNode { int data; struct LNode *next; }LNode,*ListLink; // 初始化带头节点的单链表 void initListLink(ListLink &L) { L = (LNode *)mall.

潘小蓝的博客 1609

对链表中的数据进行排序

选择排序就是遍历链表,将最小值的前驱结点存放到min_pre中,最后验证min_pre有没有进行改变,若进行了改变,首先要将含有最小值的节点进行删除,然后将含有最小值的结点插入到原本的结点的前方,最后将pre_p指向插入的含有最小值的结点。

m0_74691333的博客 288

C语言实现单向链表及其各种排序(含快排,选择,插入,冒泡)

 #include #include #define LEN sizeof(struct Student) struct Student                //结构体声明 {  long num;  int score;  struct Student* next; }; int n; struct Student* creat() {  struct S

zpcdcsdn的专栏 2230

C语言-创建链表及排序

1 #include <stdio.h> 2 #define NEWNODE (Node *)malloc(sizeof(Node)) 3 4 typedef struct mynode{ 5 int num; 6 struct mynode *next; 7 }Node; 8 9 Node* creat()...

weixin_30235225的博客 170

c语言结构体 按成绩排序降序,C语言结构体排序问题

2011-11-23求解C语言中建立一个对链表按照学==========================功能:选择排序(由小到大)返回:指向链表表头的指针==========================*//*选择排序的基本思想就是反复从还未排好序的那些节点中,选出键值(就是用它排序的字段,我们取学号num为键值)最小的节点,依次重新组合成一个链表。 我认为写链表这类程序,关键是理解:hea...

weixin_39699670的博客 1023

单链表的简单排序算法

单链表 排序

pandahong的博客 217

单链表增删改查及冒泡排序选择排序,双链表创建

【代码】单链表增删改查及冒泡排序选择排序,双链表创建。

2301_81022805的博客 171
上一篇: 在linux系统安装redis和基本命令
下一篇: IntelliJ IDEA报错Internal HTTP server disabled: Cannot start internal HTTP server.
Vectory0213
博客等级 码龄9年 18粉丝 14原创
评论 17
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值