数据结构作业(0721-林雪阵)

1,利用栈完成10进制数转任意进制

功能函数:

//m的n进制
void jinzhi(seqStack *S,int m,int n)
{
	int a=m;
	while(m!=0)
	{
		int temp=m%n;
		push(S,temp);
		m=m/n;
	}
	printf("%d的%d进制为:",a,n);
	for(int i=S->top;i>=0;i--)
	{
		printf("%d",S->data[i]);
	}
	puts("");
}

main函数

int main(int argc, const char *argv[])
{
	//创建栈
	seqStack *S=create();
	int m,n;
	printf("请输入一个整数:");
	scanf("%d",&m);
	printf("请输入进制数:");
	scanf("%d",&n);
	jinzhi(S,m,n);


	return 0;
}

执行结果

2,使用循环链表实现约瑟夫环

 1,无头结点,功能函数

//无头结点约瑟夫问题
void noHead_joseph(Loop_link *L,int n,int m)
{	
	//将数字1-n,尾插进循环链表中
	for(int i=1;i<=n;i++)
	{
		insert_tail(L,i);
	}
	Loop_link *q=kill_head(L);

	//定义遍历双指针
	Loop_link *p=q;
	int index=1;
	int size=n;
	while(size !=0)
	{
		if(index ==m)
		{
			while(p->next!=q)
			{
				p=p->next;
			}
			printf("%d\t",q->data);
			p->next=q->next;
			free(q);
			q=p->next;
			index=1;
			size--;
			continue;
		}
		q=q->next;
		index++;
	}
	puts("");
}

2,有头结点功能函数

//约瑟夫问题
void joseph(Loop_link *L,int n,int m)
{
	//将数字1-n,尾插进循环链表中
	for(int i=1;i<=n;i++)
	{
		insert_tail(L,i);
	}
	//定义遍历指针
	Loop_link *p=L;
	int index=0;

	//当链表为空时结束循环
	printf("约瑟夫:1-%d以%d为出圈的顺序为:\n",n,m);
	while(L->next!=L)
	{
	
		if(index+1 ==m && p->next!= L) //当index的下一个是目标数据,并且不是头结点时
		{
			printf("%d\t",p->next->data); //先输出目标数字,再将此节点删除
			Loop_link *q=p->next;
			p->next=p->next->next;
			free(q);
			index=0;    //index重新从0开始
			continue;   //直接进入下次循环
		}else if(index+1 ==m && p->next ==L) //当下一个是头结点时
		{
			printf("%d\t",L->next->data);
			Loop_link *q=L->next;
			L->next=L->next->next;
			free(q);
			index=0;
			p=L;        //p指向头结点
		}

		p=p->next;     //循环步长,每次指向下一个节点
		index++;       //循环步长,index每次自增1
		if(p==L)
		{
			p=p->next;
			continue;
		}
	}
	puts("");

}

main函数

int main(int argc, const char *argv[])
{
	//创建循环链表
	Loop_link *L=list_create();
	if(NULL ==L) return -1;

	int m,n;
	printf("请输入人数:");
	scanf("%d",&n);
	printf("请输入出队数字:");
	scanf("%d",&m);
	
	joseph(L,n,m);

	return 0;
}

执行结果:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林某某..

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值