题目1189:还是约瑟夫环
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:810
解决:513
-
题目描述:
-
生成一个长度为21的数组,依次存入1到21;
建立一个长度为21的单向链表,将上述数组中的数字依次存入链表每个结点中;
将上述链表变为单向封闭(循环)链表;从头结点开始数,将第17个结点删除,将它的下一个结点作为新的头结点;
重复上述过程,直到该链表中只剩一个结点,显示该结点中存入的数字。
-
输入:
-
没有任何输入数据。
-
输出:
-
输出上面题目描述中最后剩下的节点中存入的数字。
-
样例输入:
-
样例输出:
-
提示:
-
请不要直接输出数据水过去,这样达不到提升自己的目的,
请按照题目要求来做题,这样到真正考试时才能应对自如。
-
来源:
- 2003-2005年华中科技大学计算机研究生机试真题
-
#include<iostream> #include<string.h> #include<stdlib.h> using namespace std; typedef struct cirnode { int data; struct cirnode *link; }cirnode; int main() { int a[22]; for(int i=1;i<=21;i++) { a[i]=i; } cirnode *first; first =(cirnode*)malloc(sizeof(cirnode)); first->link=NULL; cirnode *newnode,*last;last=first; for(int i=1;i<=21;i++) { newnode=(cirnode*)malloc(sizeof(cirnode)); newnode->data=a[i]; last->link=newnode; last=last->link; } last->link=first->link; int k=21,cnt=1; last= first->link; cirnode *q;q=first; while(k>1) { if(cnt==17) { last=last->link; q->link=last; k--; cnt=1; } else { cnt++; last=last->link; q=q->link; } } cout<<last->data<<endl; }