数据结构day3

1 依靠单向循环链表 完成约瑟夫环

主要函数

//约瑟夫环
void jose(int n,int m)     //n为人数,m为重复数
{
	//创建约瑟夫环
	Looplink *L=list_create();       //list_create()为创建链表函数
	for(int i=1;i<=n;i++)
	{
		list_inisert_tail(L,i);
	}
	
	//删头结点
	Looplink *S=kill_head(L);    //kill_head(L)为删除头结点函数
	
	//循环开始
	Looplink *q=S;
	Looplink *p=NULL;
	printf("约瑟夫环结果为\n");
	while(1)
	{
		//找到选中数字的结点
		for(int i=1;i<m;i++)
		{
			p=q;    //选中结点的前驱
			q=q->next;
		}
		printf("\t%d",q->data);
		
		//删除选中的结点
		p->next=q->next;  //孤立目标
		free(q);         //释放目标
				
		if(q->next==q && n==1) //释放最后一个结点
		{
			q=NULL;
			break;
		}
		q=p->next;
		n--;
	}
	printf("\n");

}

辅助函数

创建单向循环链表函数

//创建
Looplink *list_create()
{
	Looplink *L=(Looplink *)malloc(sizeof(Looplink));
	if(NULL==L)
	{
		printf("创建失败\n");
		return NULL;
	}

	//初始化
	L->len=0;
	L->next=L;   //初始化是头指针指向自己

	printf("创建成功\n");
	return L;
}

判断链表是否为空函数

//判空
int list_empty(Looplink *L)
{
	if(NULL==L)
	{
		printf("所给链表不合法\n");
		return -1;
	}
	return L->next==L ?1:0;   //1为空,0为非空
	
}

删除头结点函数

//删头
Looplink *kill_head(Looplink *L)
{
	//判断逻辑
	if(NULL==L || list_empty(L))
	{
		printf("删除失败\n");
		return NULL;
	}

	//定义遍历指针定位到最后一个结点
	Looplink *q=L->next;
	while(q->next!=L)
	{
		q=q->next;
	}
	
	//孤立头结点
	q->next=L->next;
	
	//删除头结点
	free(L);
	L=NULL;
	printf("头结点删除成功\n");
	
	//返回第一个结点的地址
	return q->next;
}

单向循环链表结构体

typedef int datatype;
typedef struct Node
{
	union 
	{
		int len;           //头结点数据
		datatype data;    //普通结点数据

	};
	struct Node *next;  //指针域
}Looplink;

使用栈的特点完成 十转八的进制转换

主要函数

//进制转换
void d_to_o(int x)
{
	int y=x;
	//创建栈
	seqStack *S=create();
	while(x)
	{
		//入栈、进栈、压栈
		push(S ,x%8);
		x/=8;
	}
	printf("%d由十进制转换为八进制,结果为:",y);
	while(S->top!=-1)
	{
		printf("%d",S->data[S->top]);
		//出栈、弹栈
		 pop(S);
	}
	printf("\n");

	//销毁栈
	destroy(S);
	
}

辅助函数

创建栈函数

//创建
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)
{   
	//判断逻辑
	if(NULL==S )
	{
		printf("输入的顺序栈不合法\n");
		return -1;
	}
	//判空
	return S->top==-1 ?1:0;   //1为空 ,0为非空
}

判断满函数

//判满
int full(seqStack *S)
{
	//判断逻辑
	if(NULL==S )
	{
		printf("输入的顺序栈不合法\n");
		return -1;
	}

	//判满 
	return S->top==MAX-1 ?1:0;   //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("入栈成功\n");
	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 destroy(seqStack *S)
{
	//销毁栈
	if(NULL!=S)
	{
		free(S);
		S=NULL;
		printf("栈释放成功\n");
	}
}

栈的结构体

#define MAX 30
typedef int datatype;

typedef struct
{
	datatype data[MAX];
	int top;
}seqStack;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值