/*josephus_seq.c*/
/*Josephus问题: 顺序表实现*/
#include <stdio.h>
#include <stdlib.h>
#define FALSE 0
#define TRUE 1
typedef int DataType;
typedef struct SeqList
{
int MAXNUM;
int n;
int *element;
} PSeqList;
PSeqList *createNullList_seq(int m)
{
/* 创建新的顺序表 */
PSeqList *palist = (PSeqList *)malloc(sizeof(struct SeqList));
if (palist!=NULL)
{
palist->element = (int*)malloc(sizeof(int)*m);
if (palist->element){
palist->MAXNUM=m;
palist ->n = 0; /* 空表长度为0 */
return (palist);
}
else free(palist);
}
printf("Out of space!!\n"); /* 存储分配失败 */
return NULL;
}
int isNullList_seq( PSeqList *palist )
{
/*判别palist所指顺序表是否为空表。*/
return ( palist->n == 0 );
}
int locate_seq( PSeqList *palist,int x)
{
/*求x在palist所指顺序表中的下标 */
int q;
for ( q=0; q<palist->n; q++) if(palist->element[q] == x) return (q);
return (-1);
}
int insertPre_seq(PSeqList *palist,int p,int x)
/* 在palist所指顺序表中下标为p的元素之前插入元素x */
{
int q;
if ( palist->n >= palist-> MAXNUM )
{ /* 溢出 */
printf("Overflow!\n");
return ( 0 );
}
if (isNullList_seq(palist))
{ /*空顺序表插入 */
palist->element[0] = x; /* 插入元素x */
palist->n = 1; /* 元素个数为1 */
return ( 1 );
}
if (p<0 || p>palist->n )
{ /* 不存在下标为p的元素 */
printf("Not exist! \n"); return (0 );
}
for(q=palist->n - 1; q>=p; q--) /* 插入位置及之后的元素均后移一个位置 */
palist->element[q+1] = palist->element[q];
palist->element[p] = x; /* 插入元素x */
palist->n = palist->n + 1; /* 元素个数加1 */
return ( 1 );
}
int insertPost_seq(PSeqList *palist, int p, int x)
/* 在palist所指顺序表中下标为p的元素之前插入元素x */
{
int q;
if ( palist->n >= palist-> MAXNUM )
{ /* 溢出 */
printf("Overflow!\n");
return ( 0 );
}
if ( isNullList_seq(palist) )
{ /*空顺序表插入 */
palist->element[0] = x; /* 插入元素x */
palist->n = 1; /* 元素个数为1 */
return ( 1 );
}
if (p<0 || p>palist->n )
{ /* 不存在下标为p的元素 */
printf("Not exist! \n"); return (0 );
}
for(q=palist->n - 1; q>p; q--) /* 插入位置及之后的元素均后移一个位置 */
palist->element[q+1] = palist->element[q];
palist->element[p] = x; /* 插入元素x */
palist->n = palist->n + 1; /* 元素个数加1 */
return ( 1 );
}
int deleteP_seq( PSeqList *palist, int p )
/* 在palist所指顺序表中删除下标为p的元素 */
{
int q;
if ( p<0 || p>palist->n - 1 ) /* 不存在下标为p的元素 */
{
printf("Not exist!\n ");
return (0);
}
for(q=p; q<palist->n-1; q++) /* 被删除元素之后的元素均前移一个位置 */
palist->element[q] = palist->element[q+1];
palist->n = palist->n - 1; /* 元素个数减1 */
return ( 1 );
}
int deleteV_seq(PSeqList *palist,int q)
{
if(locate_seq(palist,q)!=-1);
if(deleteP_seq(palist,q)) return 1;
else return 0;
return 0;
}
void josephus_seq(PSeqList *palist,int s,int m)
{
int s1,i,w;
s1=s-1;
for(i=palist->n;i>0;i--) /* 找出列的元素 */
{
s1=(s1+m-1)%i;
w=palist->element[s1]; /* 求下标为s1的元素的值 */
printf("out element %d\n",w); /* 元素出列 */
deleteV_seq(palist,s1); /* 删除出列的元素 */
}
}
int main( ) /*主函数*/
{
PSeqList *jos_alist,*ppp;
int i,k;
int n=4,s=4,m=2;
/* printf("\n please input the values(<100) of n = ");
//scanf("%d",&n);
printf(" please input the values of s = ");
//scanf("%d",&s);
printf(" please input the values of m = ");
//scanf("%d",&m);
*/
jos_alist=createNullList_seq( n); /* 创建空顺序表 */
if (jos_alist!=NULL)
{
for( i = 0; i < n; i++ ) /* 线性表赋值 */
{
insertPost_seq( jos_alist, i, i+1 );
printf("###%d\n",locate_seq(jos_alist,i+1));
printf("###@@@%d\n",jos_alist->n);
}
josephus_seq(jos_alist,s,m);
free(jos_alist->element);
free(jos_alist);
}
return 0;
}
数据结构源码笔记(C语言描述)汇总: