题目1189:还是约瑟夫环
/*********************************
* 日期:2013-2-20
* 作者:SJF0115
* 题号: 九度OJ 题目1189:还是约瑟夫环
* 来源:http://ac.jobdu.com/problem.php?pid=1189
* 结果:AC
* 来源:2003-2005年华中科技大学计算机研究生机试真题
* 总结:
**********************************/
#include<stdio.h>
#include<malloc.h>
typedef struct Node
{
int data;
struct Node *next;
}LinkList;
int main()
{
int i,count = 1;
int n = 21;
LinkList *head,*p,*newNode,*q;
head = (LinkList*)malloc(sizeof(LinkList));
head->data = 1;
p = head;
for(i = 2;i <= n;i++){
//创建节点
newNode = (LinkList*)malloc(sizeof(LinkList));
newNode->data = i;
//插入新节点
newNode->next = p->next;
p->next = newNode;
p = newNode;
}
//使链表首尾相连,形成循环链表
p->next = head;
//从头结点开始数,将第17个结点删除,将它的下一个结点作为新的头结点;
//重复上述过程,直到该链表中只剩一个结点,显示该结点中存入的数字。
p = head;
while(p->next != p){
//找出第17个节点的前驱节点
if(count == 16){
count = 0;
q = p->next;
p->next = q->next;
free(q);
}
p = p->next;
count++;
}
printf("%d\n",p->data);
return 0;
}