王道数据结构2022-线性表的链式表示-综合题(p41)-19设有一个带头结点的循环单链表,其结点值均为正整数,设计一个算法,反复找出单链表中结点值最小的结点并输出,然后将该结点从中删除,直到单链表空

设有一个带头结点的循环单链表,其结点值均为正整数,设计一个算法,反复找出单链表中结点值最小的结点并输出,然后将该结点从中删除,直到单链表空为止,再删除表头结点

#include<stdio.h>
#include<stdlib.h>

typedef int ElemType;

typedef struct LNode { //定义单链表结点类型
	ElemType data;//数据域
	struct LNode *next;//指针域
} LNode, *LinkList;

/*设有一个带头结点的循环单链表,其结点值均为正整数,设计一个算法,
反复找出单链表中结点值最小的结点并输出,然后将该结点从中删除,
直到单链表空为止,再删除表头结点*/

/*算法思想:
利用*p从第一个结点开始遍历循环单链表,*pre记录当前最小结点的前驱
当*p指向头结点时删除pre的后继结点*/

/*算法思想:
对于循环单链表L,在不空时循环:每循环一次查找一个最小值
由minp指向最小值结点,minpre指向其前驱结点,并删除它,最后释放头结点*/
void RepeatDelMin(LinkList &L) {
	//本算法实现每次删除循环单链表中的最小元素,直到链表空为止
	LNode *p,*pre,*minp,*minpre;
	while(L->next!=L) {//表不空,循环
		p=L->next,pre=L;//p为工作指针,pre指向其前驱
		minp=p,minpre=pre;//minp指向最小值结点
		while(p!=L) {
			if(p->data<minp->data){
				minp = p;//找到值更小的结点
				minpre=pre; 
			}
			pre=p;
			p=p->next;
		}
		printf("%d ",minp->data);//输出最小值结点元素
		minpre->next=minp->next;//minp结点从表中"断开"
		free(minp); 
	}
	free(L);//释放头结点 
}

//创建循环单链表(尾插法)
void CreateLinklist(LinkList &L) { /* 创建尾指针表示的循环链表 */
	LNode *r,*q;
	L = new LNode;
	L->next=NULL;
	r=L;//尾结点初始化指向L的头结点
	int x;
	printf("请输入循环链表的元素(以9999结束):\n");
	scanf("%d",&x);
	while(x!=9999) {
		q=new LNode;
		q->data=x;
		r->next=q;
		r=q;
		scanf("%d",&x);
	}
	r->next=L;//尾结点指向头结点
}

//打印循环单链表
void print(LinkList L) {
	LNode *p;
	p=L->next;
	while(p!=L) {
		printf("%d ",p->data);
		p=p->next;
	}
	printf("\n");
}

int main() {
	LinkList L;
	CreateLinklist(L);
	print(L);
	RepeatDelMin(L);
}

运行结果

在这里插入图片描述

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值