zoukankan      html  css  js  c++  java
  • 数据结构设计——约瑟夫环问题

    本篇文章中所有数据结构都是后期整理的,如有问题欢迎指正,转载请注明出处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("内存申请失败,程序退出......
    ");
     24                   exit(-1);
     25          }
     26          r = head;
     27          r->next = head;
     28          printf("请按data升序输入,以-1输入为结束
    ");
     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("内存申请失败,程序退出......
    ");
     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("表元素为空
    ");
     63                   return 0;
     64          }
     65          p = head;
     66          if (head->next == head)//链表为空判断
     67          {
     68                   printf("链表中没有数据......
    ");
     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("
    ");
     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("销毁链表成功......
    ");
    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("表元素为空
    ");
    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	", p->data);
    29                   pre->next = p->next;
    30                   free(p);
    31                   p = pre->next;
    32          }
    33          printf("%d	", 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;
    }

  • 相关阅读:
    2020.11.17
    2020.11.26
    2020.11.18
    2020.12.01
    2020.11.23
    Java编程规范
    20201003 千锤百炼软工人
    2020081920200825 千锤百炼软工人
    20201004 千锤百炼软工人
    20200929 动手动脑
  • 原文地址:https://www.cnblogs.com/a1982467767/p/8893553.html
Copyright © 2011-2022 走看看