循环链表例题
/*n个人想玩残酷的死亡游戏,游戏规则如下: n个人进行编号,分别从1到n,排成一个圈, 顺时针从1开始数到m,数到m的人被杀,剩下的人继续游戏, 活到最后的一个人是胜利者。 请输出最后一个人的编号。 Input 输入n和m值。m>1。 Output 输出胜利者的编号。 Sample Input 5 3 Sample Output 4 */ #include <stdio.h> #include <stdlib.h> typedef struct lnode{ int data; struct lnode* next; } node,*linklist; void initlist(linklist &l){ linklist p=(linklist)malloc(sizeof(node)); p->data=1; p->next=p;//此处可以控制循环链表 l=p; } void InsertEnd(linklist &l,int e){//从末尾插入元素 linklist p,q; p=(linklist)malloc(sizeof(node)); p->data=e; q=l; while(q->next!=l){//此处判断扫到末尾的条件为!=l q=q->next; } p->next=q->next; q->next=p; } int main(){ int n,m; while(scanf("%d%d",&n,&m)!=EOF){ linklist l; int i,res; initlist(l); for(i=2; i<=n; i++){ InsertEnd(l,i); } linklist p,q;//q是p的前驱节点 p=l; q=l; int ans; while(1){ if(p->next==p) break; for(int i=1;i<m;i++){ q=p; p=p->next; } linklist tmp=p; // ans=p->data; // printf("---%d\n",ans); q->next=p->next; p=p->next; free(tmp); } printf("%d\n",p->data); // Print(l);//输出表的元素 } return 0; } /* 简洁代码 #include<stdio.h> #include<stdlib.h> struct node { int data; struct node *next; }; //删除操作 void Del(struct node *head, int m) { struct node *p, *q; int i = 1; //计数。 p = q = head; while(p != NULL) { if(i == m) { //删除链表中元素。 q->next = p->next; free(p); p = q->next; i = 1; } q = p; p = p->next; if(q == p) { //最后一个元素,按照题意应该输出。 printf("%d\n", p->data); break; } i++; } } int main(){ int n, m; while(scanf("%d %d", &n, &m) != EOF) { struct node *head = NULL; struct node *p, *q; //创建循环链表。head为表头指针。 p = (struct node *)malloc(sizeof(struct node)); p->data = 1; head = p; for(int i = 2; i <= n; i++) { q = (struct node *)malloc(sizeof(struct node)); q->data = i; p->next = q; p = q; } p->next = head; //创建完毕。 Del(head, m); } return 0; } */