/*josephus_clist.c*/
/*Josephus问题:循环链接表实现*/
#include <stdio.h>
#include <stdlib.h>
#define FALSE 0
#define TRUE 1
typedef int DataType; /* 定义元素类型为整型,也可定义为其他类型 */
struct Node; /* 单链表结点类型 */
typedef struct Node *PNode; /* 结点指针类型 */
struct Node /* 单链表结点结构 */
{ DataType info;
PNode link;
};
typedef struct Node *LinkList;
typedef LinkList *PLinkList;
int init_clist( PLinkList pclist, int n )
/* 用1,2,……,n为*pclist所示的循环表初始化 */
{ PNode p,q;
int i;
q = (PNode)malloc( sizeof( struct Node ) );
if ( q == NULL ) return ( FALSE );
*pclist=q;
q->info = 1;
q->link = q;
if (n==1) return (TRUE);
for(i=2;i<n+1;i++)
{ p=(PNode)malloc(sizeof(struct Node));
if (p==NULL) return(FALSE);
p->info=i;
p->link=q->link;
q->link=p;
q=p;
}
return (TRUE);
}
void josephus_clist( PLinkList pclist, int s,int m )
{PNode p,pre;
int i;
p=*pclist;
/* 找第s个元素 */
if (s==1)
{pre =p;
p=p->link;
while (p!=*pclist)
{
pre =p;
p=p->link;
}
}
else for(i=1;i<s;i++)
{
pre =p;
p=p->link;
}
while (p!=p->link) /* 当链表中结点个数大于1时 */
{ for (i=1;i<m;i++) /* 找第m个结点 */
{ pre = p;
p = p->link;
}
printf(" out element: %d \n",p->info); /* 输出该结点 */
if (*pclist ==p) /* 该结点是第一个结点时,删除时需特殊处理一下 */
*pclist =p->link;
pre->link = p->link; /* 删除该结点 */
free(p);
p = pre->link;
}
printf(" out element: %d \n",p->info); /* 输出最后一个结点 */
*pclist=NULL;
free(p);
}
int main( )
{LinkList jos_clist;
int n,s,m;
/* 输入所需各参数的值 */
do{
printf("\n please input the values of n = ");
scanf("%d",&n);
}while (n<1);
do{
printf(" please input the values of s = ");
scanf("%d",&s);
}while (s<1);
do{
printf(" please input the values of m = ");
scanf("%d",&m);
}while (m<1);
if (init_clist(&jos_clist,n))
josephus_clist(&jos_clist,s,m);
else
printf("Out of space!\n");
return 0;
}
数据结构源码笔记(C语言描述)汇总: