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;
}
优化运行截图
可以发现节省了很多时间,现在链表节点数比较少,当链表长度很庞大时,节省的时间是非常可观的