1. 使用循环链表实现约瑟夫环
![](https://i-blog.csdnimg.cn/blog_migrate/f4af5d92b33a298572548193cdaedbf3.png)
实现函数
//约瑟夫环
void circle(loopLink *L,int m)
{
loopLink *p=L; //p指向头结点
loopLink *q=L;
while(q->next!=L)
{
q=q->next; //q指向头结点L的前一个结点
}
int count=0; //计数
while(p!=q) //结点大于1个
{
count++;
if(count==m)
{
printf("%d ",p->data);
count=0;
q->next=p->next;
free(p);
p=q->next;
}
else
{
p=p->next;
q=q->next;
}
}
printf("%d \n",p->data);
free(p);
p=NULL;
q=NULL;
}
运行结果
人数为8,数到4出圈,所得到序列为4 8 5 2 1 3 7 6
人数为10,数到3出圈,所得到的序列为3 6 9 2 7 1 8 5 10 4
主函数代码
#include "looplink.h"
int main(int argc, const char *argv[])
{
int n;
int m;
printf("输入人数n:");
scanf("%d",&n);
printf("输入数m:");
scanf("%d",&m);
loopLink *L=list_create();
for(int i=1;i<=n;i++)
{
list_insert_tail(L,i);
}
loopLink *S=delete_head(L);
printf("新序列为:");
circle(S,m);
return 0;
}
2. 使用栈的特点完成进制转换
![](https://i-blog.csdnimg.cn/blog_migrate/c60178b11143d8a7726d458592856b99.png#pic_center)
函数代码
//进制转换
void conversion(int n,int m)
{
seqStack *S=creat();
while(n/m!=0)
{
int a=n%m;
push(S,a);
n/=m;
}
push(S,n);
int b=0;
printf("进制转换结果:");
while(!empty(S))
{
pop(S,&b);
if(b>-1&&b<10)
{
printf("%d",b);
}
else if(b>=10&&b<=15)
{
char c=b+55;
printf("%c",c);
}
else
{
printf("进制转换失败");
}
}
printf("\n");
}
运行结果
输入十进制数987,可以使用二进制,八进制,十六进制,可以使用十六进制以内的任意进制
二进制结果1111011011
八进制结果1733
十六进制结果3DB
六进制结果4323
主函数代码
#include "seqstack.h"
int main(int argc, const char *argv[])
{
int a;
int b;
printf("输入十进制数:");
scanf("%d",&a);
printf("输入进制:");
scanf("%d",&b);
conversion(a,b);
return 0;
}