数据结构设计——约瑟夫环问题
本篇文章中所有数据结构都是后期整理的,如有问题欢迎指正,转载请注明出处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; }