Chinaunix首页 | 论坛 | 博客
  • 博客访问: 68619
  • 博文数量: 17
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 154
  • 用 户 组: 普通用户
  • 注册时间: 2014-05-12 22:56
个人简介

不卑不亢

文章分类

全部博文(17)

文章存档

2016年(1)

2015年(13)

2014年(3)

分类: C/C++

2015-03-21 14:18:19


点击(此处)折叠或打开

  1. /* 约瑟夫问题(单循环链表) */

  2. #include <stdio.h>
  3. #include <stdlib.h>

  4. typedef struct _node_ {
  5.     int data;
  6.     struct _node_ *next;
  7. }linknode;

  8. linknode *list_init(int n);
  9. void list_show(linknode *H);
  10. void jose(linknode *H, int k, int m);

  11. int main(void)
  12. {
  13.     int n, k, m;
  14.     linknode *H = NULL;

  15.     n = 8, k = 1, m = 3;        /* n为人数,k代表从第几个人开始,m代表数的次数 */
  16.     if ((H = list_init(n)) == NULL)
  17.         return 0;
  18.     list_show(H);
  19.     jose(H, k, m);

  20.     return 0;
  21. }

  22. linknode *list_init(int n)
  23. {
  24.     linknode *p = NULL,
  25.              *H = NULL,
  26.              *q = NULL;
  27.     int i = 2;

  28.     if (NULL == (H = malloc(sizeof(linknode)))) {
  29.         printf("fail to malloc\n");
  30.         return NULL;
  31.     }
  32.     H->next = H;
  33.     H->data = 1;
  34.     q = H;
  35.     
  36.     while (i <= n) {
  37.         if (NULL == (p = malloc(sizeof(linknode)))) {
  38.             printf("fail to malloc\n");
  39.             return NULL;
  40.         }
  41.         p->data = i++;
  42.         q->next = p;
  43.         p->next = H;
  44.         q = p;
  45.     }

  46.     return H;
  47. }

  48. void list_show(linknode *H)
  49. {
  50.     linknode *p = H;

  51.     while (p->next != H) {
  52.         printf("%d->", p->data);
  53.         p = p->next;
  54.     }
  55.     printf("%d\n", p->data);
  56. }

  57. void jose(linknode *H, int k, int m)
  58. {
  59.     linknode *p = H,
  60.              *q = NULL;
  61.     int i;

  62.     while (p->next->data != k)
  63.         p = p->next;

  64.     while (p->next != p) {
  65.         for (i = 0; i < m - 1; i++)
  66.             p = p->next;
  67.         q = p->next;
  68.         p->next = q->next;
  69.         printf("%d->", q->data);
  70.         free(q);
  71.         q = NULL;
  72.     }
  73.     printf("%d\n", p->data);
  74. }

阅读(1094) | 评论(0) | 转发(0) |
0

上一篇:双链表的操作

下一篇:多项式问题

给主人留下些什么吧!~~