数据结构设计——约瑟夫环问题

Posted 醉风晨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构设计——约瑟夫环问题相关的知识,希望对你有一定的参考价值。

本篇文章中所有数据结构都是后期整理的,如有问题欢迎指正,转载请注明出处http://www.cnblogs.com/a1982467767/p/8893553.html

约瑟夫环问题实现

实验程序:

  1 //cir_linklist.h
  2 //线性表链式结构——循环链表
  3 #ifndef   _LINKLIST_H_      //如果没有定义这个宏   
  4 #define   _LINKLIST_H_       //定义这个宏   
  5 //#define _CRT_SECURE_NO_WARNINGS//消除scanf在Vs中不兼容的问题
  6 #include <stdlib.h>
  7 #include <string.h>
  8  
  9 //主要申明区间
 10 LinkList Create_Linklist(void);//创建链表函数申明
 11 LinkList Output_Linklist(LinkList head);//链表的遍历,数据输出
 12 int CountNumber_Linklist(LinkList head);//计算链表数据的长度
 13 void Distory(LinkList *h);//线性表的销毁
 14  
 15 /*创建一个以data为元素链表,按data升序排列,以-1输入为建立结束*/
 16 LinkList Create_Linklist(void)
 17 {
 18          int x;
 19          LinkList head, s, r;
 20          head = (ListNode*)malloc(sizeof(ListNode)); /*为头结点head申请空间*/
 21          if (!head)//内存分配判断
 22          {
 23                   printf("内存申请失败,程序退出......\\n");
 24                   exit(-1);
 25          }
 26          r = head;
 27          r->next = head;
 28          printf("请按data升序输入,以-1输入为结束\\n");
 29          printf("请输入一个data:");
 30          scanf("%d", &x);
 31          while (x != -1)
 32          {
 33                   if (r == head)
 34                           r->data = x;
 35                   else
 36                   {
 37                           s = (ListNode*)malloc(sizeof(ListNode));/*为添入结点申请空间*/
 38                           if (!s)//内存分配判断
 39                           {
 40                                    printf("内存申请失败,程序退出......\\n");
 41                                    exit(-1);
 42                           }
 43                           s->data = x;
 44                           s->next = r->next;
 45                           r->next = s;/*这两句表示将新创建的s结点连接到r结点的后面,r初次对应的head并没有数据,所以head是含有空头的链表,画图可以更方便理解*/
 46                           r = s;/*用r将新定义的结点s取代,这样可以使用s进行反复连接*/
 47                           
 48                   }
 49                   printf("请输入下一个data:");
 50                   scanf("%d", &x); /*输入下一个data*/
 51          }
 52          return head;
 53 }
 54  
 55 /*输出链表head中的所有数据元素*/
 56 LinkList Output_Linklist(LinkList head)
 57 {
 58          ListNode *p;
 59          int i = 0;
 60          if (!head)
 61          {
 62                   printf("表元素为空\\n");
 63                   return 0;
 64          }
 65          p = head;
 66          if (head->next == head)//链表为空判断
 67          {
 68                   printf("链表中没有数据......\\n");
 69                   return head;
 70          }
 71          while (p->next != p)
 72          {
 73                   printf("%d  ", p->data);
 74                   p = p->next;/*p指向p的下一个结点*/
 75  
 76          }
 77          printf("\\n");
 78          return head;
 79 }
 80  
 81 int CountNumber_Linklist(LinkList head)//显示链表的长度
 82 {
 83          int count = 0;
 84          LinkList s;
 85          s = head;
 86          while (s->next != s)
 87          {
 88                   count++;
 89                   s = s->next;
 90          }
 91          return count;
 92 }
 93  
 94 //销毁线性表
 95 void Distory(LinkList *h)
 96 {
 97          LinkList p, q;
 98          p = *h;
 99          while (p->next != p)
100          {
101                   q = p;
102                   p = p->next;
103                   free(q);
104          }
105          *h = NULL;
106          printf("销毁链表成功......\\n");
107 }
108 #endif   

 

 1 //josephus.h
 2 nt josephus_LinkList(LinkList josephus_Link, int s, int m)
 3 {
 4          //s表示报数的数,m表示长度?
 5          LinkList p, pre;
 6          int count;
 7          if (!josephus_Link)
 8          {       
 9                   printf("表元素为空\\n");
10                   return 0;
11          }
12          /*找第S个元素*/
13          p = josephus_Link;
14          for (count = 1; count < s; count++)
15          {
16                   p = p->next;
17          }
18          printf("输出约瑟夫序列:");
19          while (p != p->next)
20          {
21                   pre = p->next;
22                   while (pre->next != p)   pre = pre->next;
23                   for (count = 1; count < m; count++)
24                   {
25                           pre = p;
26                           p = p->next;
27                   }
28                   printf("%d\\t", p->data);
29                   pre->next = p->next;
30                   free(p);
31                   p = pre->next;
32          }
33          printf("%d\\t", p->data);
34          free(p);
35          return 1;
36 }

 

//main.c
#include<stdio.h>
#include <windows.h>//插入此头文件的目的是调用Sleep(1000)函数,中间1000正常情况下表示一秒钟
 
typedef struct node {
         int  data;
         struct node *next;
}ListNode, *LinkList;
 
#include "linklist.h"
#include "josephus.h"
 
int main(void)
{
         LinkList head;
         int m;
         system("color 02");//颜色背景函数System("color 100")可以查看该函数后面的两个字符的说明
         head = Create_Linklist();
         m = CountNumber_Linklist(head);
         josephus_LinkList(head, m, 4);
         system("PAUSE");
         return 0;
}

以上是关于数据结构设计——约瑟夫环问题的主要内容,如果未能解决你的问题,请参考以下文章

数据结构线性表循环链表之约瑟夫环

数据结构—约瑟夫环问题(循环单链表)

数据结构(线性表——链表2)(约瑟夫环和发牌问题)

约瑟夫环问题,一道经典的数据结构题目

数据结构 —— 约瑟夫环

数据结构 —— 约瑟夫环