用顺序表解决josephus问题的算法
来源:互联网 发布:3d2012年所有开奖数据 编辑:程序博客网 时间:2024/06/03 23:07
/* 用顺序表解决josephus问题的算法*/
#include<stdio.h>
#include<stdlib.h>
#define MAXNUM 100
#define FALSE 0
#define TRUE 1
typedef int DataType;
struct SeqList {
int n; /* 存放线性表中元素的个数 n < MAXNUM */
DataType element[MAXNUM]; /* 存放线性表中的元素 */
};
typedef struct SeqList *PSeqList;
PSeqList createNullList_seq( void ) {
PSeqList palist = (PSeqList)malloc(sizeof(struct SeqList));
if (palist != NULL)
palist ->n = 0; /* 空表长度为0 */
else
printf("Out of space!!\n"); /* 存储分配失败 */
return palist;
}
/* 在palist所指顺序表中下标为p的元素之前插入元素x */
int insert_seq( PSeqList palist, int p, DataType x) {
int q;
if ( palist->n == MAXNUM ) { /* 溢出 */
printf("Seq-list overflow!\n");
return FALSE;
}
if ( p < 0 || p > palist->n ) { /* 不存在下标p */
printf("Index out of range! \n");
return FALSE;
}
for (q = palist->n - 1; q >= p; q--) /* 插入位置及之后的元素均后移一个位置 */
palist->element[q+1] = palist->element[q];
palist->element[p] = x; /* 插入元素x */
palist->n++; /* 元素个数加1 */
return TRUE;
}
/* 在palist所指顺序表中删除下标为p的元素 */
int delete_seq( PSeqList palist, int p ) {
int q;
if ( p < 0 || p > palist->n ) { /* 不存在下标p */
printf("Index out of range! \n");
return FALSE;
}
for (q = p; q < palist->n-1; q++) /* 被删除元素之后的元素均前移一个位置 */
palist->element[q] = palist->element[q+1];
palist->n--; /* 元素个数减1 */
return TRUE;
}
/* 求palist所指顺序表中下标为p的元素值 */
DataType retrieve_seq( PSeqList palist, int p ) {
if ( p >= 0 && p < palist->n ) /* 存在下标为p的元素 */
return palist->element[p];
printf("Index out of range! \n ");
return -1; /* 返回一个顺序表中没有的特殊值 */
}
void josephus_seq(PSeqList jlist, int n, int s, int m) {
int s1, i, w;
s1 = s - 1;
/* 找出列的元素 */
for (i = jlist->n; i > 0; i--) {
s1 = ( s1 + m - 1 ) % i ;
w = retrieve_seq(jlist, s1); /* 求下标为s1的元素的值 */
printf("Out element %d \n", w); /* 元素出列 */
delete_seq(jlist, s1); /* 删除出列的元素 */
}
free(jlist);
}
/* ====================== */
void inputnsm(int* np, int* sp, int* mp) {
printf("\n please input the values(<100) of n = ");
scanf("%d", np);
printf("\n please input the values of s = ");
scanf("%d", sp);
printf("\n please input the values of m = ");
scanf("%d", mp);
}
int init_jlist(PSeqList slist, int n) {
int i,k;
if (slist == NULL) return FALSE;
if (n < 1 || n > MAXNUM) {
printf("Number of elements is out of range!\n");
return FALSE;
}
for ( i = 0; i < n; i++ )
k = insert_seq( slist, i, i+1);
}
int main( ){
PSeqList jos_alist;
int n,s,m;
inputnsm(&n, &s, &m);
jos_alist = createNullList_seq(); /* 创建空顺序表 */
if (jos_alist == NULL) return;
if (init_jlist(jos_alist, n) == FALSE) return;
josephus_seq(jos_alist, n, s, m);
free(jos_alist->element);
free(jos_alist);
getchar(); getchar();
return 0;
}
- 用顺序表解决josephus问题的算法
- 利用数组模拟的链表解决Josephus问题
- 用链表解决约瑟夫(Josephus)问题
- <C>Josephus问题——用循环链表解决
- 不使用链表解决Josephus问题
- 循环链表解决Josephus环问题
- 双链表解决Josephus问题
- josephus链表解决
- 用带头结点的循环单链表解决Josephus问题(默认点名位置为1)
- 循环链表解josephus问题
- 双向循环链表解决Josephus(约瑟夫)问题
- 约瑟夫问题(Josephus)java链表解决
- 循环链表解决Josephus环轮流报数问题
- 循环链表解决JOSEPHUS环问题[C语言实现]
- C语言通过双向循环链表解决Josephus(约瑟夫)问题
- 0010用顺序表实现约瑟夫环(Josephus)问题
- josephus问题的解法
- Josephus问题的解决方案
- CSS 定位属性position用法
- 为什么基类的析构函数是虚函数
- android和iOS平台的崩溃捕获和收集
- 最新版Eclipse IDE for C/C++以及MinGW的安装与配置详解
- Leetcode: Pascal's Triangle
- 用顺序表解决josephus问题的算法
- sigsetjmp用法
- Tcpdump的详细用法
- jQuery检测页面当中id为a的元素是否添加了click事件
- 用eclipse+svn插件,上传新项目到svn服务器
- 25 Open Source and Free Business Intelligence Solutions
- Windows API
- 使用Libgdx开发的FlappyBird(像素鸟、疯狂的小鸟)游戏源码
- 循环-23. 找完数(20)