约瑟夫环实现
main.c
#include<stdio.h>
#include<stdlib.h>
#include"looplink.h"
int main(int argc, const char *argv[])
{
int n,m,count=1;
printf("输入总人数:");
scanf("%d",&n);
printf("输入限制数m:");
scanf("%d",&m);
Looplink *L=list_creat();
fun1(L,n,m);
return 0;
}
looplink.c
创建链表
Looplink *list_creat()
{
Looplink *L = (Looplink*)malloc(sizeof(Looplink));
if(NULL==L)
{
printf("创建失败\n");
}
L->len =0;
L->next = L;
printf("创建成功\n");
return L;
}
判空
int list_empty(Looplink *L)
{
return L->next==L?1:0;
}
尾插
int list_insert_tail(Looplink *L,datatype e)
{
if(NULL==L)
{
printf("链表不合法\n");
}
Looplink*p=(Looplink*)malloc(sizeof(Looplink));
if(NULL==p)
{
printf("节点申请失败\n");
return -2;
}
p->data = e;
p->next =NULL;
Looplink *q=L;
while(q->next!=L)
{
q=q->next;
}
p->next = L;
q->next = p;
L->len++;
}
带头结点遍历
void list_show(Looplink *L)
{
if(NULL==L || list_empty(L))
{
printf("遍历失败\n");
return ;
}
Looplink *q= L->next;
while(q!=L)
{
printf("%d\t",q->data);
q=q->next;
}
printf("\n");
}
尾删
int list_del_tail(Looplink *L)
{
if(NULL==L|| list_empty(L))
{
printf("删除失败\n");
return -1;
}
Looplink *q = L;
while(q->next->next!=L)
{
q=q->next;
}
free(q->next);
q->next = L;
L->len--;
printf("删除成功\n");
return 0 ;
}
删头
Looplink *kill_head(Looplink *L)
{
if(NULL==L || list_empty(L))
{
printf("删除失败\n");
return NULL;
}
Looplink *q=L;
while(q->next!=L)
{
q=q->next;
}
q->next = L->next;
free(L);
L=NULL;
return q->next;
}
删除头结点后的遍历
void list_show2(Looplink *L)
{
if(NULL==L)
{
printf("遍历失败\n");
return;
}
Looplink *q=L;
do
{
printf("%d\t",q->data);
q=q->next;
}while(q!=L);
printf("\n");
}
实现约瑟夫环
void fun1(Looplink*L,int n,int m)
{
int count=1;
for(int i=1;i<=n;i++)
{
list_insert_tail(L,i);
}
Looplink *p=kill_head(L);
L=NULL;
list_show2(p);
Looplink *q=p;
while(p->next!=p)
{
if(count%m==0)
{
printf("%d\t",q->data);
p=kill_head(q);
count=1;
q=p;
}
q=q->next;
count++;
}
printf("%d\t",p->data);
}
looplink.h
#ifndef __looplink_h_
#define __looplink_h_
typedef int datatype;
typedef struct Node
{
union{
datatype data;
int len;
};
struct Node *next;
}Looplink;
Looplink *list_creat();
int list_empty(Looplink *L);
int list_insert_tail(Looplink *L,datatype e);
void list_show(Looplink *L);
int list_del_tail(Looplink *L);
Looplink *kill_head(Looplink *L);
void list_show2(Looplink *L);
void fun1(Looplink*L,int n,int m);
#endif
编译运行实现
实现进制转换
main.c
#include<stdio.h>
#include<stdlib.h>
#include"seqstack.h"
int main(int argc, const char *argv[])
{
int num,n,m;
seqStack *S=create();
if(NULL==S)
{
return -1;
}
system_change(S,num,m);
return 0;
seqstack.c
创建顺序栈
seqStack *create()
{
seqStack *S=(seqStack *)malloc(sizeof(seqStack));
if(NULL==S)
{
printf("创建失败\n");
return NULL;
}
S->top = -1;
printf("创建成功\n");
return S;
}
判空 判满
int empty(seqStack *S)
{
return S->top==-1?1:0;
}
int full(seqStack *S)
{
return S->top==MAX-1?1:0;
}
入栈、进栈、压栈
int push(seqStack *S,datatype e)
{
if(NULL==S || full(S))
{
printf("入栈失败\n");
return -1;
}
S->top++;
S->data[S->top] = e;
printf("%d入栈成功\n",e);
return 0;
}
出栈、弹栈
int pop(seqStack *S)
{
if(NULL==S || empty(S))
{
printf("出栈失败\n");
return -1;
}
S->top--;
return 0;
}
遍历栈
void show(seqStack *S)
{
if(NULL==S ||empty(S))
{
printf("遍历失败");
return;
}
printf("从栈底到栈顶元素分别是:");
for(int i=0;i<=S->top;i++)
{
if(S->data[i]<10)
{
printf("%d",S->data[i]);
}
else
{
printf("%x",S->data[i]);
}
}
printf("\n");
}
实现进制转换
int system_change(seqStack *S,int num,int m)
{
int n;
seqStack *S1=create();
if(NULL==S1)
{
return -1;
}
printf("输入一个十进制数:");
scanf("%d",&num);
printf("输入想转化成几进制:");
scanf("%d",&m);
while(num!=0)
{
n=num%m;
num=num/m;
push(S,n);
}
while(S->top!=-1)
{
push(S1,S->data[S->top]);
S->top--;
}
printf("\n转换成的进制输出结果为:\n");
show(S1);
}
销毁栈
void destory(seqStack *S);
{
if(NULL==S)
{
printf("释放失败\n");
return;
}
free(S);
S = NULL;
printf("释放成功\n");
}
代码编译实现