一、栈的相关操作
main.c
#include <stdio.h>
#include "seqstack.h"
int main(int argc, char const *argv[])
{
//调用栈创建函数
StackPtr S=stack_create();
if(NULL == S)
{
return -1;
}
//调用入栈函数
stack_push(S,2);
stack_push(S,1);
stack_push(S,7);
stack_push(S,9);
//调用栈遍历函数
stack_show(S);
//调用销毁栈函数
stack_destroy(S);
return 0;
}
seqstack.c
#include "seqstack.h"
StackPtr stack_create()
{
StackPtr S=(StackPtr)malloc(sizeof(Stack));
if(NULL == S)
{
printf("创建失败\n");
return NULL;
}
//程序执行至此,表明栈申请出来了,但是存储栈的空间还没申请出来。
S->data=(datatype *)malloc(sizeof(datatype) *MAX);
if(NULL == S->data)
{
printf("创建失败\n");
return NULL;
}
//给空间内容初始化
//meset(S->data,0,sizeof(datatype) *MAX)
bzero(S->data,sizeof(datatype) *MAX);
S->top=-1;
printf("创建成功\n");
return S;
}
//判空
int stack_empty(StackPtr S)
{
return S->top==-1;
}
//判满
int stack_full(StackPtr S)
{
return S->top==MAX-1;
}
//入栈函数
void stack_push(StackPtr S,datatype e)
{
if(NULL == S||stack_full(S))
{
printf("入栈失败\n");
return ;
}
S->top++;
S->data[S->top]=e;
printf("入栈成功\n");
}
//出栈
void stack_pop(StackPtr S)
{
if(NULL == S||stack_empty(S))
{
printf("出栈失败\n");
return ;
}
printf("%d出栈成功\n",S->data[S->top]);
S->top--;
}
//遍历栈
void stack_show(StackPtr S)
{
if(NULL ==S ||stack_empty(S))
{
printf("遍历失败\n");
return ;
}
printf("从栈顶到栈底的元素分别是:");
for(int i=S->top;i>=0;i--)
{
printf("%d\t",S->data[i]);
}
printf("\n");
}
//获取栈顶元素
datatype stack_get_top(StackPtr S)
{
if(NULL == S||stack_empty(S))
{
printf("获取失败\n");
return NULL;
}
return &S->data[S->top];
}
//求栈的大小
int stack_size(StackPtr S)
{
if(NULL == S)
{
printf("操作失败\n");
return -1;
}
return S->top+1;
}
//销毁栈
void stack_destroy(StackPtr S)
{
if(S != NULL)
{
//销毁栈的容器
free(S->data);
S->data=NULL;
//销毁栈
free(S);
S = NULL;
}
printf("销毁成功\n");
}
seqstack.h
#ifndef SEQSTACK_H
#define SEQSTACK_H
#include <stdio.h>
#define MAX 8
typedef int datatype;
typedef struct
{
datatype *data;
int top;
}Stack,*StackPtr;
StackPtr stack_create();
//判空函数
int stack_empty(StackPtr S);
//判满函数
int stack_full(StackPtr S);
//入栈函数
void stack_push(StackPtr S,datatype e);
//出栈函数
void stack_pop(StackPtr S);
//遍历栈函数
void stack_show(StackPtr S);
//获取栈顶元素
datatype stack_get_top(StackPtr S);
//求栈的大小
int stack_size(StackPtr S);
//销毁栈函数
void stack_destroy(StackPtr S);
#endif
二、用循环链表实现约瑟夫问题
main.c
#include "ysf.h"
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
int n, k;
printf("请输入总人数和出圈序号:\n");
scanf("%d %d", &n, &k);
NodePtr H = create(n);
printf("%d", caozuo(H,n,k));
return 0;
}
ysf.c
#include "ysf.h"
#include <stdio.h>
#include <stdlib.h>
NodePtr create()
{
NodePtr H=(NodePtr)malloc(sizeof(Node));
if(NULL == H)
{
printf("申请失败\n");
return NULL;
}
NodePtr p = H;
int n=0;
for(int i=0;i<=n;i++)
{
p->data=i;
if(i<n)
{
p->next=(NodePtr)malloc(sizeof(Node));
p=p->next;
}
else p->next = H;
}
return H;
}
int caozuo(NodePtr H,int n,int k)
{
while (H->next!=H)
{
NodePtr p=H;
for(int i=1;i<=k-2;i++)
{
p = p->next;
NodePtr q = p->next;
printf("本次要出圈的人编号为:%d ", q->data);
p = p->next;
free(q);
H = p->next;
}
return H->data;
}
}
ysf.h
#ifndef YSF_H
#define YSF_H
#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
int data;
struct node *next;
}Node,*NodePtr;
//在堆区申请空间
NodePtr create();
//操作函数
int caozuo(NodePtr H,int n,int k);
#endif