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;
}
执行结果: