2024王道408数据结构 P39 T19
思考过程
- 首先我们明确题目的意思要找出循环链表中的最小值并且打印再删除,我们每一趟只能找出一个最小值,所以我们要执行n躺,每次都找最小值,所以我们需要p指针来帮我们遍历链表,r指针帮我们记录p的前一个值,min指针来记录最小的元素,最后还需要一个mp来记录min的前一个值。
- 循环之前要先把指针都恢复原位
p = L->next, r = L, mp = r, min = p;
都恢复到原位之后开始第一趟循环,判断min指向的值是否大于p指向的值,如果大于的话就证明p的值比min小,我们就把min = p 同时 mp = r;
如果小于的话就让r = p; p = p->next;
到这里我们经过第一趟遍历已经找到最小值。 - 找到最小值之后我们依照题目意思要打印并且删除值,这时候mp指针就派上用场了,
mp->next = min->next
,之后再把min给free掉,第一趟就结束了,接着第二趟循环找第二小的值。
最后完整代码附上
//
// Created by 黎圣 on 2023/7/26.
//
#include "iostream"
typedef struct node
{
int data;
struct node *next;
}*linklist;
//我举的例子
int a[6] = {5,4,6,8,1,3};
int n = 6;
//创建循环单链表
void CreateList(linklist &L)
{
struct node *s;
struct node *r = L;
for (int i = 0; i < n; i++)
{
s = (linklist)malloc(sizeof(struct node));
s->data = a[i];
r->next = s;
r = r->next;
}
r->next = L;
}
//打印出来方便观察
void display(linklist L)
{
struct node *s = L->next;
while (s != L)
{
printf("%d ", s->data);
s = s->next;
}
printf("\n");
}
//删除最小值
void delete_min(linklist &L)
{
struct node *p, *r, *mp, *min;
while (L->next != L)
{
p = L->next, r = L, mp = r, min = p;//初始化指针
while (p != L)
{
if (min->data > p->data)
{
min = p;
mp = r;
}
else
{
r = p;
p = p->next;
}
}
printf("%d ", min->data);
mp->next = min->next;
free(min);
}
free(L);
}
int main()
{
linklist L;
CreateList(L);
display(L);
delete_min(L);
return 0;
}