单链表(有头节点)--冒泡排序

在学习C语言的过程中,通过图书管理系统的一些简单程序实现当中,需根据图书的热度进行倒序排行的功能实现,最开始想的时候是类似与数组的冒泡排序进行操作,发现链表的部分链接中断,最后通过画图想了好久才想出来。

对于链表的冒泡排序本质上与数组的冒泡排序其实本质上并无区别,无非就是对于链表而言需要更改相应next指针指向的位置。

冒泡排序

例如:降序排列,遍历元素,依次比较相邻两个元素,将较小元素的节点往后排,遍历一次后,最小元素的节点排到了最后,下一次遍历元素个数减一。遍历次数为(数据节点的个数)。

以下函数代码为实现冒泡排序(配合上图更容易懂):

对应的结构体:

typedef struct book
{
    int id;            //图书编号 
    int bookNum;    //图书数量 
    char bookName[30];    //图书名称 
    int hot;        //图书热度 
    
    struct book * next;
}BOOK;                            //BOOK -- 节点 : 数据域 + 指针域 

void sortRank(BOOK *h)
{
	//判断链表是否为空 
	if(h == NULL || h->next == NULL)
	{
		return;
	}
	//初始化 
	BOOK *p = h;
	BOOK *prev = h->next;
	BOOK *end = h;
	BOOK *temp;
	
	int count =0;
	
	while(prev != NULL) //计算遍历次数 
	{
		count++;
		prev = prev->next;
	}
	
	prev = h->next;
	
	int i,j;
	
	for(i = count;i>0;i--)//遍历循环 ,每遍历一次,就少比较一个数据 
	{
		//循环比较前初始化 
		end = h;
		p = h;
		prev = h->next;
		for(j= 0;j < i-1;j++)//开始依次比较,比较i-1次 
		{
			end = p;
			p = prev;
			prev = prev->next;
			
			if(p->hot < prev->hot)
			{
				p->next = prev->next;
				prev->next = p;
				end->next = prev;
				
				temp = p;
				p = prev;
				prev = temp;
			}
		}
	}
	
}

 如果有疑问和见解,欢迎大家提出来一起分享。(新手作文,写的不太明白,见谅见谅~)


版权声明:本文为Joyerx原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。