辛苦的仔细研究了一通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; }