c语言之猴子选大王

辛苦的仔细研究了一通C语言的链表,终于把猴子选大王的改编版做出来了。
题目是: 将m个猴子围成一圈,每一个猴子还带一个密码,从第一个猴子开始,猴子的密码就是从这个猴子开始数的第n个点到被删除的数,被删除的猴子的密码又成为下一个n值。通过链表将考虑如果第一个猴子密码为1时,第一个猴子密码不为1 时,和第一次被删除后,按照这个猴子的密码数数找到下一个目标的情况。
我用了留下头结点和尾指针的单项的循环链表的方式将所有猴子围成一个圈。
下面是编写好的程序(有bug的话请指正,初学C的妹纸请求见谅)
#include <stdio.h>
#include<malloc.h>

typedef struct LNode
{
	int  num;//猴子序号
	int  code;//密码
	struct LNode *next;
}List,*LinkList;//定义结点

LinkList head,tail;

LinkList InitList(LinkList L,int n)  //初始化循环链表
{
	LinkList p,q;
    int i,icode;
	L=q=head=(LinkList)malloc(sizeof(List)) ;//头结点 
    tail = (LinkList)malloc(sizeof(List));
	q->num=1;
	printf("请输入第1个猴子的密码:");
	scanf("%d",&icode);
	q->code=icode;
	for(i = 2; i <= n; i++)  
	{      
        p = (LinkList)malloc(sizeof(List));      
        p->num = i;
		printf("请输入第%d个猴子的密码:",i);
		scanf("%d",&icode);
		p->code=icode;
		q->next=p;
		q=p;
    }
	tail=q;
	q->next=L;
    return L;
}

void DisplayList(LinkList L,int n)
{
	//输出循环链表
	int i;
	LinkList p;
	p=L;
	printf("head: %d--%d\n",head->num,head->code);
	printf("tail: %d--%d\n",tail->num,tail->code);
	for(i=0;i<n;i++)
	{
		printf("第%d个猴子---密码:%d\n",p->num,p->code);
		p=p->next;
		
	}
	
}

void DeleteList(LinkList L)
{
	LinkList p,q;
    int j=0,n=1;    //j为计数器,n为密码
    p=L;
	printf("猴子出列的顺序如下: \n");
	if(p==L)//从第一位猴子开始
		{
			p=tail;//p指针后移一位
			if(p->next->code==1){
			}else{
			while(j!=p->next->code){
					p=p->next;
					j++;
			}
			}
			q=p->next;  //q即为被点到的猴子
			n=q->code;//n即为下一次的密码
			p->next=p->next->next;//删除q结点
			printf("出列 %d 号\n",q->num); 
			free(q);//释放
			j=0;//计数器清零
		}
	
	while(p->next!=p)   //p->next=p时是只剩一个结点
	{
		while(j!=n-1) //将该结点的下一个结点删除
		{
			p=p->next;
			j++;
		}
		q=p->next;  //q即为被点到的猴子
		n=q->code;//n即为下一次的密码
		p->next=p->next->next;  //删除q结点
		printf("出列 %d 号\n",q->num); 
		free(q);//释放
		j=0;     //计数器清零,重新开始计数
	}

	printf("\n猴子大王是 %d 号",p->num);//此时的结点就是大王
	free(p);
	}

int main()
{
	LinkList L=NULL;
	int m=0;
	printf("**********************************************************\n"
		"-----welcome!-------------<猴子选大王>--------------------\n");
	printf("\n请输入猴子的个数: ");
	scanf("%d",&m);
	if(m<3){
		printf("您输入的猴子个数为必须大于2的整数!");
	}else{
	L=InitList(L,m);//建立循环链表
	//DisplayList(L,m);//显示链表
	DeleteList(L);//选出大王
	}
	printf("\n-------------------------------Thanks!--------------------\n"
		"-------------------------------------------author:XXX--\n"
		"-----------------------------------------version无穷次方--\n"
		"-----------------------------------------------2013.9.21--\n"
		"**********************************************************\n");
	return 0;
}

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值