2022.7.21 作业

博客介绍了如何使用单向循环链表解决约瑟夫问题,通过尾插法创建链表并删除节点来模拟过程。同时,展示了利用栈进行进制转换的方法,通过压栈和出栈操作将十进制数转换为任意进制表示。这两个算法都涉及到基础的数据结构操作和递归思想。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、用单向循环链表实现约瑟夫问题

main.c

#include <stdio.h>	
#include "looplink.h"

int Joseph(int n,int m)
{
	//创建链表头结点
	Looplink *h=list_create();
	if(NULL==h){
		return -1;
	}
	//尾插法插入数据
	for(int i=1;i<=n;i++){
		list_insert_tail(h,i);
	}
	//删除头结点
	Looplink *p=kill_head(h);
	Looplink *t=NULL;

	for(int j=1;j<n;j++){
		int i=m-1;
		while(i--){
			p=p->next;
		}
		//计数到时输出
		printf("%d ",p->data);

		//将下一个结点的值赋给当前结点
		//然后再把当前结点的下一个结点释放
		t=p->next;
		p->data=t->data;
		p->next=t->next;
		free(t);
		t=NULL;
	}
    //把最后一个数输出后释放
	printf("%d\n",p->data);
    free(p);
    p=NULL;
	return 0;
}

int main(int argc, const char *argv[])
{
	int n,m;
	printf("请输入总人数>>>");
	scanf("%d",&n);
	while(getchar()!='\n');
	printf("请输入要计数的数>>>");
	scanf("%d",&m);
	while(getchar()!='\n');

	Joseph(n,m);

	return 0;
}

looplink.c中使用到的有关循环单链表的函数

//创建头结点
Looplink *list_create()
{
	Looplink *h=(Looplink *)malloc(sizeof(Looplink));
	if(NULL==h)
		return NULL;
	h->next=h;
	return h;
}

//尾插
int list_insert_tail(Looplink *h,datatype value)
{
	if(NULL==h)
		return -1;
	Looplink *q=h;
	Looplink *p=(Looplink *)malloc(sizeof(Looplink));
	if(NULL==p)
		return -2;
	p->data=value;
	while(q->next!=h){
		q=q->next;
	}
	p->next=h;
	q->next=p;
	return 0;
}

//删除头结点
Looplink *kill_head(Looplink *h)
{
	if(NULL==h || list_empty(h))
		return NULL;
	Looplink *q=h;
	while(q->next!=h){
		q=q->next;
	}
	q->next=h->next;
	free(h);
	h=NULL;
	return q->next;
}

运行测试

 

2、使用栈实现进制转换

 main.c

#include <stdio.h>	
#include "seqstack.h"

int base_conversion(int value,int base)
{
	if(base<=0 || base>16)
		return -1;
	//创建顺序栈
	Seqstack *s=create();
	int num;
	while(value/base){
        //压栈
		push(s,value%base);
		value/=base;
	}
	push(s,value);
	while(!empty(s)){
        //出栈
		num=pop(s);
		if(num<10){
			printf("%d",num);
		}else{
			switch(num){
				case 10:
					printf("a");
					break;
				case 11:
					printf("b");
					break;
				case 12:
					printf("c");
					break;
				case 13:
					printf("d");
					break;
				case 14:
					printf("e");
					break;
				case 15:
					printf("f");
					break;
				default:
					break;
			}
		}
	}
	putchar(10);
	//销毁栈
	destroy(&s);
	return 0;
}

int main(int argc, const char *argv[])
{
	int value,base;
	printf("请输入想要转换的数>>>");
	scanf("%d",&value);
	while(getchar()!='\n');
	printf("请输入要转化的进制>>>");
	scanf("%d",&base);
	while(getchar()!='\n');
	
	base_conversion(value,base);

	return 0;
}

所涉及的顺序栈函数

//创建栈
Seqstack *create()
{
	Seqstack *s=(Seqstack *)malloc(sizeof(Seqstack));
	if(NULL==s)
		return NULL;
	s->top=-1;
	return s;
}

//判空
int empty(Seqstack *s)
{
	if(NULL==s)
		return -1;
	return s->top==-1 ? 1 : 0;
}

//判满
int full(Seqstack *s)
{
	if(NULL==s)
		return -1;
	return s->top==MAX-1 ? 1 : 0;
}

//压栈
int push(Seqstack *s,datatype value)
{
	if(NULL==s)
		return -1;
	if(full(s))
		return -2;
	s->top++;
	s->data[s->top]=value;
	return 0;
}

//出栈
int pop(Seqstack *s)
{
	if(NULL==s)
		return -1;
	if(empty(s))
		return -2;
	int value=s->data[s->top];
	s->top--;
	return value;
}

//销毁栈
void destroy(Seqstack **s)
{
	if(NULL==*s)
		return ;
	free(*s);
	*s=NULL;
	s=NULL;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值