个人代码如下,欢迎大佬指正
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode
{
int data;
struct LNode* next;
}Node,*Link;
void Func(Link& link)
{
Node* p, *pre,*q;
//循环每次找到一个最小的结点,然后删掉,故这里只要判断是不是空表
while (link->next != link)
{
p = link->next;
pre = link;
//找到链表中最小的结点,最小结点是pre->next结点
while (p->next != link)
{
if (pre->next->data > p->next->data)
pre = p;
p = p->next;
}
//将最小结点暂存在q中,并把链表连上。
q = pre->next;
pre->next = q->next;
//打印并删除最小结点
printf("此次删除的是:%d\n", q->data);
free(q);
}
//最后释放头结点
free(link);
}
//输出循环单链表
void PrintLink(Link link)
{
Node* p = link;
while (p->next != link)
{
printf("%d ", p->next->data);
p = p->next;
}
}
int main()
{
//循环单链表初始化
Link link = (Link)malloc(sizeof(Node));
link->next = link;
//创建一个循环单链表
int x;
scanf("%d", &x);
Node* p = link,*s;
while (x<9999)//输入的值大于等于9999时便停止
{
s = (Node*)malloc(sizeof(Node));
s->data = x;
p->next = s;
p = s;
scanf("%d", &x);
}
p->next = link;
printf("删除之前:\n");
PrintLink(link);
printf("\n删除中……\n");
Func(link);
return 0;
}