猴王问题

首先用一个数组来存放猴子的编号,从1到m,然后按题目要求,用循环来实现猴子大王的选举

#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;   //定义数据元素类型
typedef struct CNode
{
	ElemType data;
	struct CNode *next;
}CNode;
CNode *monkey;          //定义一个全局变量
Status Create_clist(CNode *clist,int n)    //创建一个有n个节点的环形链表
{
	CNode *p,*q,*head;
	int i;
	clist =NULL;
	for (i=n;i>=1;i--)
	{
		p=(CNode *)malloc(sizeof(CNode));
		p->data=n;
		p->next=NULL;
		head=p;
		if (p==NULL)
			return OVERFLOW;     //存储分配失败
		p->data=i;
		p->next=clist;
		clist=p;
		if (i==n)
			q=p;              //用q指向链表的最后一个结点
	}
	q->next=clist;          //把链表的最后一个节点的链域指向链表的第一个结点,构成循环链表
	monkey=clist;           //把创建好的循环链表头指针赋给全局变量
	return OK;
}
Status Monkey(CNode *clist,int n)
{
	int i;
	int m;
	CNode *p,*q;
	if (!Create_clist(clist,n))
		return ERROR;             //起始位置错
	p=monkey;                     //p指向创建好的循环链表
	for (m=13;n>1;m--,n--)
	{
		if (m==1)
		{
			m=13;
		}
		for (i=0;i<m-1;i++)       //找出第m-1个结点
			p=p->next;            //删除p->next结点
		q=p->next;
		p->next=q->next;
		p=p->next;
		free(q);
	}
	printf("%d ",p->data);         //输出应出列的结点
	clist=NULL;                    //删除最后一个结点
	return OK;
}
int main()
{
	int n;
	CNode *clist;
	clist=NULL;                      //初始化clist
	printf("\n请输入猴的个数n:\n");
	scanf("%d",&n);
	Create_clist(clist,n);            //创建一个有n个结点的循环链表clist
	printf("\n猴王是:\n");
	Monkey(clist,n);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/markin2333/article/details/81205588