北邮2019计导下 链表一 B. 实验11_10_链表排序

本文介绍了在单链表中使用冒泡排序进行排序的思路和过程,详细解析了冒泡排序中相邻节点交换的操作,以及如何通过改变节点指针域实现排序。文章以北邮计导实验为背景,探讨了选择冒泡排序的原因,并提供了排序链表的实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单链表确实是不好操作,只能顺着毛摸的感觉很不爽。
提示是用选择排序、插入排序或冒泡排序,其实这仨时间复杂度都是O(n^2),选哪个对效率影响不大。
我所以选择冒泡排序,是因为选择排序和插入排序都涉及到不相邻节点的对换问题,从D题可以看出,不相邻节点的对换涉及到四个节点的指针域的更改,而且相邻时反而要特别考虑,比较麻烦,
而冒泡排序一趟在中只涉及到相邻两个节点的比较和更改,相对而言比较方便。

冒泡排序中可能涉及到的节点交换

灵魂画师上线
在这里插入图片描述
画图想一想,只是多,不难
1、第一个节点和第二个节点
用prevPtr=NULL来标志第一个节点,此时!prevPtr为true
1)需要交换时:
isChanged标志位为1
头结点入口更改
a的节点域改成b的节点域
b的节点域改成a
2)不需要交换时
isChanged标志位仍然为0,啥也不干
根据isChanged标志位,指针迭代的方式也不同
更换过:b的节点域改成a的后继节点
标志位重置为0
没更换过:a和b各自向后平移一位
此时第一次的BUFF结束,prev被设置为头节点(头结点必须用*sPtr获取,因为头结点的位置可能会更改,用headPtr保存的话可能实际上变成了第二个节点)
2、一般情况
1)需要交换时:
isChanged设置为1
a的节点域改成b的节点域
prev的节点域改成b
b的节点域改成a
2)不需要交换时:
isChanged标志位仍然为0,啥也不干
根据isChanged标志位,指针迭代的方式也不同
更换过:isChanged重置为0
prev向后迭代
b成为a的后继
a成为prev的后继
没有更改:prev、a、b各自向后迭代

#include <stdio.h>
#include <stdlib.h>
typedef struct _node
{
   
   
	int data;
	struct _node* nextPtr;
} Node;

Node* createList();
void destoryList(Node** sPtr);
int lenList(Node **sPtr);//用于计算链表内的节点数
void bubbleSortList(Node **sPtr);
void printList(Node **sPtr);

int main(int argc, char const *argv[])
{
   
   
	Node *headPtr=createList();
	bubbleSortList(&headPtr);
	printf("The new list is:");
	prin
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值