1、用单向循环链表实现约瑟夫问题
main.c
#include#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 next; } //计数到时输出 printf("%d ",p->data); //将下一个结点的值赋给当前结点 //然后再把当前结点的下一个结点释放 t=p->next; p->data=t->data; p->next=t->next; free(t); t=NULL; } //把最后一个数输出后释放 printf("%dn",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#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;
}



