C语言 使带头结点的单链表递增有序实现与原理

C语言 使带头结点的单链表递增有序

实现原理

利用一个中间变量,使两个相邻的数值进行比较,如果前面一个数大于后面的一个数,进行交换,如图:
在这里插入图片描述
如果A>B,首先利用Value变量把A的值存储下来,然后把B的值估值给A最后把Value存储的数值给B,完成数据交换,说白了这就是冒泡排序
在这里插入图片描述
此图很形象的说明了冒泡排序的原理,大的泡泡向上冒,小的则留在下面

实现代码

结构体

typedef struct SqNode {
	int data;
	struct SqNode * Next;

}SqNode,*SqList;

递增有序函数实现

SqList IncreaseElement(SqNode* L)
{
	SqList q=L->Next;
	int Value;
	int i = 0;
	int Length = LengthList(L);
	while (i < Length)
	{
		SqList q = L->Next;//使链表重头开始遍历
		while (q->Next != NULL)
		{
			if (q->data > q->Next->data)//如果当前数据大于后一个数据
			{
				Value = q->data;
				q->data = q->Next->data;//交换数据
				q->Next->data = Value;
			}
			q = q->Next;
		}
		printf("第%d趟:",i);
		PrintfList(L);
		printf("\n");
		i++;
	}
	return L;
}

运行截图

在这里插入图片描述
如图可以发现当在第三趟的时候链表就已经使有序的链表了,咱们可以对其优化一下,添加一个标记,如果有交换则做标记,如果正趟下来都没有交换则视为链表优序

递增优序函数优化

SqList IncreaseElement(SqNode* L)
{
	SqList q=L->Next;
	int Value;
	int i = 0;
	int j = 1;//标记变量
	int Length = LengthList(L);
	while (i < Length)
	{
		SqList q = L->Next;
		j = 1;
		while (q->Next != NULL)
		{
			if (q->data > q->Next->data)
			{
				Value = q->data;
				q->data = q->Next->data;
				q->Next->data = Value;
				j = 0;//如果又交换发生,则标记变为0
			}
			q = q->Next;
		}
		printf("第%d趟:",i);
		PrintfList(L);
		printf("\n");
		i++;
		if(j==1)//若正趟下来都没有标记发生,则视为链表优序
			return L;//返回结果
	}
	return L;
}

优化运行截图

在这里插入图片描述
可以发现节省了很多时间,现在链表节点数比较少,当链表长度很庞大时,节省的时间是非常可观的

欢迎大家在评论区赐教,谢谢

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

~搬~运~工~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值