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;
}