单链表排序之冒泡排序

***单链表排序之冒泡排序***



/*
前段时间刚学会几种排序方法,最近学习了单链表,就用来试试,本篇链表的排序方法<一>讲述的是
单链表的冒泡排序;(注意:请仔细看准节点结构体的包装和头指针的包装再阅读以下代码);

冒泡排序的思想和冒泡排序数组的方法以及冒泡排序的优化,我都已经在冒泡排序的文章中介绍了;


以下着重介绍冒泡排序在单链表中的复用;

// 先来说个挺搞笑的事,我第一次写冒泡排序单链表居然写成了选择排序,我都给蒙圈了;然后一直在想为什么会这样,钻牛角尖了,然后再重新写冒泡排序的时候一直写不出来,陷入了一个误区,一直不能确定内层循环跳出的件,冒泡排序依次后将最后一个抛弃,内层循环一次抛弃一个,知道结束;最后还是参考了同学的代码才将我自己跳出来!

//思路解析: 根据冒泡排序的基本思想,那我们先设置两个节点cur 和 teil来控制内外循环; 都初始化为NULL;第一次的时候内层循环肯定得从表头走到表尾;那么我们来比较一次内循环并进行交换;内层循环通过cur来控制,一次向后挪动一个,有同学就说了,cur变了,外层循环怎么控制? 先别急,耐心往下看;

一次内循环之后,按照前面说的是不是该抛弃(注意不是删除,是不去管它)最后一个结点了,那么下次内循环时就不必比较最后一个,那么就得将teil = cur; 而cur现在指向的就是最后一个结点,下一次内循环时 cur->next!=teil 不久不去管最后一个节点了;以此类推;

那最后就是将cur的问题处理了, 那不是很简单,只需要将 cur = pList->pHead;就行了,每次外层循环都是从第一个开始,并且!=teil,而teil每次都会向前挪动一个(因为每次内层循环结束都会抛弃一个,而teil指向上一个节点);外层循环次数每次减少一个;并且外层循环的总次数是总结点-1次;

这不就是冒泡排序了!

下面看代码如何实现;

*/

#include<stdio.h>
#include<assert.h>

typedef int DataType;

typedef struct LinkNode
{
	DataType data;
	struct LinkNode* next;
}LinkNode,*pLinkNode;//结点结构体

typedef struct LinkList
{
	LinkNode* pHead;//头结点指针
}LinkList ,*pLinkList;//链表


算法实现
void BubbleSort (pLinkList pList)
{
	pLinkNode cur = NULL;
	pLinkNode teil = NULL;

	assert(pList);

	cur = pList->pHead ;

	while(cur != teil)
	{
		while(cur->next != teil)
		{
			if(cur->data > cur->next ->data )
			{
				DataType tmp = cur->data ;
				cur->data = cur->next ->data ;
				cur->next ->data = tmp;
			}
			cur = cur->next ;
		}
		teil = cur;
		cur = pList->pHead ;
	}
	return ;
}

解释的不好,但还是希望可以帮助到你!


  • 23
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
好的,以下是C语言单链表结构冒泡排序的示例代码: ```c #include <stdio.h> #include <stdlib.h> /* 定义单链表节点结构体 */ typedef struct node { int data; struct node *next; } Node; /* 创建单链表 */ Node *createList(int n) { Node *head = NULL, *p = NULL, *tail = NULL; int i, num; for (i = 0; i < n; i++) { printf("请输入第%d个节点的值:", i + 1); scanf("%d", &num); p = (Node*)malloc(sizeof(Node)); p->data = num; p->next = NULL; if (head == NULL) { head = p; tail = p; } else { tail->next = p; tail = p; } } return head; } /* 输出单链表 */ void printList(Node *head) { Node *p = head; while (p != NULL) { printf("%d ", p->data); p = p->next; } printf("\n"); } /* 单链表冒泡排序 */ void bubbleSort(Node *head) { Node *p = NULL, *q = NULL; int temp; for (p = head; p != NULL; p = p->next) { for (q = p->next; q != NULL; q = q->next) { if (p->data > q->data) { temp = p->data; p->data = q->data; q->data = temp; } } } } int main() { int n; printf("请输入单链表的节点数:"); scanf("%d", &n); Node *head = createList(n); printf("排序前的单链表:"); printList(head); bubbleSort(head); printf("排序后的单链表:"); printList(head); return 0; } ``` 这段代码中,我们首先定义了一个单链表结构体 `Node`,然后实现了创建单链表、输出单链表、以及单链表冒泡排序的函数。在 `bubbleSort` 函数中,我们使用两个指针 `p` 和 `q` 分别遍历单链表,如果 `p` 节点的数据大于 `q` 节点的数据,就交换它们的数据。最后输出排序后的单链表

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值