Seqstack.h
#ifndef __SEQSTACK_H__
#define __SEQSTACK_H__
#define MAX 100
typedef int datatype;
typedef struct
{
datatype data[MAX];
int top;
}Seqstack;
//创建
Seqstack *create();
//判空
int empty(Seqstack *S);
//判满
int full(Seqstack *S);
//入栈、进栈、压榨
int push(Seqstack *S, datatype e);
//出栈、弹栈
int pop(Seqstack *S);
//遍历栈
void show(Seqstack *S);
Looplink.h
#ifndef __LOOPLINK__
#define __LOOPLINK__
#include"Seqstack.h"
typedef int datatype;
typedef struct Node
{
union
{
datatype data;//数据域
int len;
};
struct Node *next;//指针域
}Looplink;
//创建
Looplink *list_create();
//判空
int list_empty(Looplink *L);
//申请节点
Looplink *node_buy(datatype e);
//尾插
int list_insert_tail(Looplink *L, datatype e);
//尾删
int list_delete_tail(Looplink *L);
//删除头结点
Looplink *kill_head(Looplink *L);
//删头后节点的遍历
void list_show2(Looplink *L);
//插入n个数据并删除头结点
Looplink *data_len(Looplink *L,int len);
//按位置查找节点
Looplink *list_search_pos(Looplink *L, int pos);
//输出约瑟夫单向链表
int joseph(Looplink *L,int n, int m, Seqstack *J);
//进制转换
int transform(int n , int m, Seqstack *H);
#endif
Seqstack.c
#include<stdio.h>
#include<stdlib.h>
#include"Seqstack.h"
//创建
Seqstack *create()
{
Seqstack *S=(Seqstack *)malloc(sizeof(Seqstack));
if(S==NULL){
printf("创建失败\n");return NULL;}
S->top=-1;//将栈顶置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");
}
//入栈操作
S->top++;
S->data[S->top]=e;
printf("入栈成功\n");
return 0;
}
//出栈、弹栈
int pop(Seqstack *S)
{
if(NULL==S||empty(S))
{
printf("出栈失败\n");
}
printf("%d出栈成功\n",S->data[S->top]);
S->top--;
return 0;
}
//遍历栈
void show(Seqstack *S)
{
if(NULL==S||empty(S))
{
printf("遍历失败\n");return;
}
printf("从栈顶到栈底元素依次为:");
int i=S->top;
while(i!=-1)
{
printf("%d\t",S->data[i]);
i--;
}
printf("\n");
printf("从栈底到栈顶元素依次为:");
i=S->top;
while(i!=-1)
{
printf("%d\t",S->data[S->top-i]);
i--;
}
printf("\n");return;
}
Looplink.c
#include<stdio.h>
#include<stdlib.h>
#include"Looplink.h"
#include"Seqstack.h"
//创建
Looplink *list_create()
{
Looplink *L = (Looplink *)malloc(sizeof(Looplink));
if(L==NULL)
{
printf("创建失败\n");
return NULL;
}
//初始化
L->len=0;
L->next=L;
printf("创建成功\n");
return L;
}
//判空
int list_empty(Looplink *L)
{
return L->next==L?1:0;//1表示空,0表示非空
}
//申请带数据的节点
Looplink *node_buy(datatype e)
{
Looplink *L =(Looplink *)malloc(sizeof(Looplink));
if(L==NULL)
{
printf("创建失败\n");
return NULL;}
L->data=e;
L->next=NULL;
return L;
}
//尾插(相当于在节点头部插入)
int list_insert_tail(Looplink *L,datatype e)
{
if(NULL==L)
{printf("链表不存在\n");return -1;}
Looplink *p=node_buy(e);
Looplink *q=L;
if(list_empty(L))
{
L->next=p;
p->next=L;
}
else
{
while(q->next!=L)
{
q=q->next;
}
//插入逻辑
p->next=L;
q->next=p;
}
//表的变化
L->len++;
printf("插入成功\n");
}
//插入n个数据并删除头结点(尾插)
Looplink *data_len(Looplink *L,int len)
{
for(int i=1;i<len+1;i++)
{
list_insert_tail(L,i);
}
Looplink *S=kill_head(L);
printf("数据创建完成,循环链表中有%d个数据\n", len);
return S;
}
//按位置查找节点(pos为数据的位置pos>0)
Looplink *list_search_pos(Looplink *L, int pos)
{
if(L==NULL||pos<1)
{printf("链表不存在\n");return NULL;}
Looplink *q=L;
for(int i=1;i<pos;i++)
{
q=q->next;
}
return q;
}
//输出约瑟夫栈
int joseph(Looplink *L,int n, int m, Seqstack *J)
{
if(L==NULL||J==NULL)
{printf("输入错误\n");return -1;}
Looplink *k=L;
Looplink *p=NULL;
Looplink *q=NULL;
printf("%d\n",n);
for(int i=n;i>0;i--)
{
p=list_search_pos(k,m);
printf("%d\n",p->data);
q=list_search_pos(p,i);
q->next=p->next;
J->top++;
J->data[J->top]=p->data;
k=p->next;//指向下一个节点作为首节点
free(p);//释放第m个空间
}
return 0;
}
//十进制转换//
int transform(int n , int m, Seqstack *H)
{
if(n<0||m>10&&m<0||H==NULL)
{printf("输入错误\n");return -1;}
int tem=n;int res=0;int i=1;
do
{
if(full(H)){printf("位数超过%d,栈溢出\n",MAX);return -1;}
res=tem%m;
push(H,res);
tem=tem/m;
printf("%d\t",tem);
}while(tem!=0);
printf("转换成功\n");
return 0;
}
main.c
#include<stdio.h>
#include<stdlib.h>
#include"Looplink.h"
#include"Seqstack.h"
int main(int argc, const char *argv[])
{
Looplink *L=list_create();
if(L==NULL){printf("创建循环链表失败\n");return -1;}
Seqstack *J=create();
if(J==NULL){printf("创建栈失败\n");return -1;}
int n=8;int m=3;
Looplink *S=data_len(L,n);//创建约瑟夫数据环
//测试查找数据函数正确性
Looplink *TTT=list_search_pos(S,n);
printf("%d\n",TTT->data);
list_show2(S);
//约瑟夫拆环求解
joseph(S,n,m,J);
show(J);
//------进制转换---------
Seqstack *H=create();
if(H==NULL){printf("创建栈失败\n");return -1;}
int nn=15;//需要转换的数
int mm=2;//转换进制--小于10;
//进制转换
transform(nn,mm,H);
show(H);
return 0;
}
result
约瑟夫参数:n=8;m=3;
进制转化:15转为2进制;
约瑟夫参数:n=10;m=6;
进制转化:23转为8进制;