C语言 反复寻找链表最小结点输出并删除,直到链表为空
算法思想
首先把第一个节点P
摘下来,依次与其他结点进行比较,若遇到比P
小的节点Q
摘下来,让P
进入链表替补Q
的位置如图
如果对你有所帮助,点个赞呗
实现代码
结构体
typedef struct SqNode
{
int data;
struct SqNode* Next;
}SqNode,*Sqlist;
功能函数
Sqlist DeleteSmallElement(Sqlist L)
{
/*
参数:链表的首地址
函数功能:利用递归方法反复打印出链表中最小值并删除(带头结点)
*/
if (LengthList(L)==0)//若链表长度为零则代表链表已删除完毕,还剩一个头节点
{
free(L);//释放头节点
return;//递归出口
}
Sqlist MinList;//记录最小节点
Sqlist p=L;
MinList = L->Next;//把第一个节点摘下来
L->Next = L->Next->Next;
while (p->Next!=L)
{
if (MinList->data > p->Next->data)//让第一个节点与其他节点相比较,若大于其中一个节点则交换
{
Sqlist s;//交换节点
s = MinList;
MinList = p->Next;
s->Next = p->Next->Next;
p->Next = s;
}
p = p->Next;
}
printf("a======%d\n", MinList->data);
free(MinList);//删除最小节点
DeleteSmallElement(L);//递归
}