2022.07.21循环链表及顺序栈练习

约瑟夫环实现

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);//已将以下注释部分封装成独立函数
/*	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);*/
	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;
	//printf("头结点删除成功\n");
	//返回第一个节点的地址
	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);//下方功能已封装成
/*  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);*/
    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;
	}
		//printf("%d出栈成功\n",S->data[S->top]);
		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");
}

代码编译实现

在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值