使用循环链表实现约瑟夫问题及使用栈进行进制转换

1.使用循环链表实现约瑟夫问题

//循环删除输出指定数字节点
int loop_delete(loop_link *L, int n, int m)
{
	//判断逻辑
	if(L==NULL || n<1)
	{
		printf("不合法\n");
		return -1;
	}
	loop_link *q = L;
	loop_link *p = NULL;//用于标记节点,及时销毁节点
	//将最后一个节点指向第一个节点
	while(q->next != L)
	{
		q = q->next;
	}
	q->next = L->next;
	q = L;//重新指向头节点
	//循环输出指定数字m的人员编号
	while(L->len > 0)
	{
	for(int i=1; i<m; i++)
	{
		q = q->next;
	}
		p = q->next;//标记
		q->next = q->next->next;//孤立
		printf("%d\t",p->data);//输出目标
		free(p);//销毁节点
		//表长变化
		L->len--;
		p = NULL;
	}
	printf("\n循环输出完成\n");
	return 0;

}

结果:

创建成功
请输入总人数和指定数字
8 4
4	8	5	2	1	3	7	6	
循环输出完成
ubuntu@ubuntu:hw2$ ./a.out 
创建成功
请输入总人数和指定数字
8 3
3	6	1	5	2	8	4	7	
循环输出完成

 测试代码:

#include "./looplink.h"
#include <stdio.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{
	loop_link *L = creat();
	if(L==NULL)
	{
		return -1;//创建失败,结束主函数
	}
	int n,m;//n总人数,指定数字
	printf("请输入总人数和指定数字\n");
	scanf("%d %d", &n, &m);
	for(int i=1; i<=n; i++) //编号
	{
		tail_insert(L,i);
	}
	loop_delete(L,n,m);
	return 0;
}

相关函数 

//创建单向循环链表
loop_link *creat()
{
	//申请空间
	loop_link *L = (loop_link*)malloc(sizeof(loop_link));
	if(L == NULL)
	{
		printf("创建失败\n");
		return NULL;
	}
	//初始化
	L->len = 0;
	L->next = L;
	printf("创建成功\n");
	return L;
}

//在尾部添加节点
int tail_insert(loop_link *L, datatype value)
{
	//逻辑判断
	if(L==NULL)
	{
		printf("链表不合法,插入失败\n");
		return -1;
	}
	//申请一个新节点
	loop_link *p = (loop_link*)malloc(sizeof(loop_link));
	if(p == NULL)
	{
		printf("申请失败\n");
		return -2;
	}
	p->data = value; //给新节点赋值
	p->next = NULL;
	//找到原表中最后一个节点
	loop_link *q = L;
	while(q->next != L)
	{
		q = q->next;
	}
	//在表尾添加新节点
	q->next = p;
	p->next = L;
	//表长变化
	L->len++;
}

2.使用栈将一个十进制数转换成任意进制

//将任意数转换成任意进制
int trans(int num, int base)
{
	//创建栈
	stack *s = creat();
	if(s == NULL)
	{
		return -1; //创建失败
	}
	printf("%d转换为%d进制为:",num,base);
	do
	{
		push(s,num%base); //入栈
		num /= base;
	}while(num != 0);
	pop(s); //出栈
	putchar(10); //换行
	free_stack(s); //销毁栈
	return 0;
}

测试代码

#include <stdio.h>
#include "./stack.h"
int main(int argc, const char *argv[])
{
		int num,base;//num被转换的数,base进制
	printf("请输入被转化的数:");
	scanf("%d", &num);
	printf("请输入需要转换成几进制:");
	scanf("%d", &base);
	trans(num,base);	
	return 0;
}
结果:
请输入被转化的数:852
请输入需要转换成几进制:2
创建成功
852转换为2进制为:1101010100
销毁成功
ubuntu@ubuntu:homework$ ./a.out 
请输入被转化的数:852
请输入需要转换成几进制:8
创建成功
852转换为8进制为:1524
销毁成功

相关函数

#ifndef __STACK_H__
#define __STACK_H__

#define MAX 20
typedef struct
{
	int data[MAX];
	int top;
}stack;
#include <stdio.h>
#include <stdlib.h>
#include "./stack.h"

//创建栈
stack *creat()
{
	stack *s = (stack*)malloc(sizeof(stack));
	if(s == NULL)
	{
		printf("创建失败\n");
		return NULL;
	}
	s->top = -1;
	printf("创建成功\n");
	return s;
}
//入栈
int push(stack *s, int value)
{
	if(s == NULL)
	{
		printf("栈不合法,入栈失败\n");
		return -1;
	}
	s->top++;
	s->data[s->top] = value;
	return 0;
}
//出栈
int pop(stack *s)
{
	if(s == NULL)
	{
		printf("栈不合法,出栈失败\n");
		return -1;
	}
	while(s->top >= 0)
	{
		printf("%d",s->data[s->top]);
		s->top--;
	}
	return 0;
}
//销毁栈
void free_stack(stack *s)
{
	if(s != NULL)
	{
		free(s);
		s = NULL;
	}
	printf("销毁成功\n");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

傾语

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

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

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

打赏作者

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

抵扣说明:

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

余额充值