用链表做报数问题

记得以前学长叫我们做过这样一题有n个人围成一圈,顺序排号。从第一个人开始报数(从1到x报数),凡报到x的人退出圈子,问最后留下的是原来第几号的那个人。之前是用动态数组做的,今天突然来了兴趣 想用循环链表试试 顺便巩固下链表

以下附上代码

#include<stdio.h>
#include<malloc.h>
typedef struct Circle
{
 int date;
 Circle *next;
};
void CreatCircle(Circle *head, int n)//创建链表
{
 Circle *p,*q;
 p = head;
 for (int i = 1; i < n; i++)//开始存入号数
 {
  q = (Circle *)malloc(sizeof(Circle));
  q->date = i + 1;
  p->next = q;
  p = q;
  q = q->next;
 }
 p->next = head;//尾指针指向表头,围成一圈 循环链表
}
void Delete(Circle *p)//删除报到倒霉数的节点(指针的下一个节点)
{
 Circle *q;
 q = p->next;
 p->next = p->next->next;
 free(q);
}
Circle *GameBegin(int n,int j)//开始游戏
{
 Circle *p,*head;
 head = (Circle *)malloc(sizeof(Circle));//创建表头,号数为一
 head->date = 1;
 CreatCircle(head, n);
 p = head;
 for (int i = 2; p->next != p;)//报到倒霉数的删除节点 知道剩最后一个节点
 {
  i++;//开始报数
  p = p->next;
  if (i%j == 0)
  { 
   //printf("%d", p->next->date);
   Delete(p);
   i++;
  }
 }
 return p;
}
void main()
{
 int people,num;
 printf("游戏人数为:");
 scanf_s("%d", &people);
 printf("设置倒霉数为:");
 scanf_s("%d", &num);
 printf("剩下的幸运者为:%d",GameBegin(people, num)->date);
 free(GameBegin(people, num));

}

以后也会把其他问题做下拓展用别的方法再做一遍。

posted @ 2016-04-04 20:00  醉梦无心  阅读(754)  评论(0编辑  收藏  举报