目题程设计《数据结构》课)C语言程序实现采用():3选王(学时目题1:猴子一堆猴子都有编号,编号是1,2,3...m,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。要求:m及n要求从键盘输入,存储方式采用向量及链表两种方式实现该问题求解。//链表#include<stdio.h>#include<stdlib.h>//链表节点typedefstruct_RingNode{intpos;struct_RingNode*next;}RingNode,*RingNodePtr;//创建约瑟夫环,pHead:链表头指针,count:链表元素个数voidCreateRing(RingNodePtrpHead,intcount){RingNodePtrpCurr=NULL,pPrev=NULL;inti=1;pPrev=pHead;while(--count>0){pCurr=(RingNodePtr)malloc(sizeof(RingNode));i++;pCurr->pos=i;pPrev->next=pCurr;pPrev=pCurr;}pCurr->next=pHead;//构成环状链表}voidKickFromRing(RingNodePtrpHead,intn){RingNodePtrpCurr,pPrev;inti=1;//计数pCurr=pPrev=pHead;while(pCurr!=NULL){if(i==n){//踢出环printf(\%d,pCurr->pos);//显示出圈循序pPrev->next=pCurr->next;free(pCurr);pCurr=pPrev->next;i=1;}pPrev=pCurr;pCurr=pCurr->next;if(pPrev==pCurr){//最后一个printf(\Kingis%d,pCurr->pos);//显示出圈循序free(pCurr);break;}i++;}}intmain(){intn=0,m=0;RingNodePtrpHead=NULL;printf(M(personcount)=);scanf(%d,m);printf(N(outnumber)=);scanf(%d,n);if(m<=0||n<=0){printf(InputError\n);return0;}建立链表//pHead=(RingNodePtr)malloc(sizeof(RingNode));pHead->pos=1;pHead->next=NULL;CreateRing(pHead,m);//开始出圈printf(\KickOrder:);KickFromRing(pHead,n);printf(\);system(pause);return0;}//数组做:#include<stdio.h>#include<stdlib.h>#include<string.h>voidSelectKing(intMonkeyNum,intCallNum);voidmain(){intMonkeyNum;intCallNum;/*输入猴子的个数*/printf(MonkeyNum=);scanf(%d,MonkeyNum);/*输入M的值*/printf(CallNum=);scanf(%d,CallNum);SelectKing(MonkeyNum,CallNum);}voidSelectKing(intMonkeyNum,intCallNum){int*Monkeys;//申请一个数组,表示所有的猴子;intcounter=0;//计数,当计数为猴子个数时表示选到最后一个猴子了;intposition=0;//位置,数组的下标,轮流遍历数组进行报数;inttoken=0;//令牌,将报数时数到M的猴子砍掉;//申请猴子个数大小的数组,把桌子摆上。Monkeys=(int*)malloc(sizeof(int)*MonkeyNum);if(NULL==Monkeys){printf(Somanymonkeys,systemerror.\n);return;}//将数组的所有内容初始化为0,被砍掉的猴子设置为1memset(Monkeys,0,sizeof(int)*MonkeyNum);//循环,直到选中大王while(counter!=MonkeyNum){//如果这个位置的猴子之前没有砍掉,那么报数有效if(Monkeys[position]==0){token++;//成功报数一个,令牌+1,继续报数直到等于M//如果报数到M,那么将这个猴子砍去if(token==CallNum){,表示砍去1设置为Monkeys[position]=1;//counter++;//计数增加token=0;//设置为0,下次重新报数//如果是最后一个猴子,把它的位置打印,这个就是大王了if(counter==MonkeyNum){printf(Thekingisthe%dmonkey.\n,position+1);}}}//下一个猴子报数position=(position+1)%MonkeyNum;}//释放内存,开头为所有猴子创建的桌子free(Monkeys);return;})3:时学(转逆符字:2目题.,并1个字符)从键盘读入一个字符串,把它存入一个链表(每个结点存储按相反的次序将字符串输出到显示屏。#include<stdio.h>#include<stdlib.h>structnode{structnode*prev;charc;structnode*next;};structnode*input(structnode*top);intmain(void){structnodeT,*top=T,*bottom=T,*p=NULL;T.prev=NULL;T.next=NULL;T.c='\0';bottom=input(top);p=bottom->prev;while(p!=NULL){printf(%c,p->c);p=p->prev;}return0;}structnode*input(structnode*top){structnode*t;charx;while((x=getchar())!='\n'){top->c=x;t=(structnode*)malloc(sizeof(structnode));top->next=t;t->prev=top;t->next=NULL;t->c='\0';top=top->next;}ret...