7.22课后作业

一、栈的相关操作

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值