约瑟夫环输出实际人名

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验一:约瑟夫环输出实际人名

姓名:汪思雨学号:201006030102

问题[1]:试将本章介绍的两种JOSEPHUS问题求解过程在计算机中完成,实现输出人名

问题求解

A. 数据结构定义

问题求解采用循环链表结构,集合元素类型为int类型。数据结构定义如下:struct Node;

typedef struct Node * PNode;

Struct Node /*定义结构体*/ {int info;

PNode link;

};

typedef struct Node * LinkList;

typedef LinkList * PLinkList;

B.程序结构

int init_clist(PLinkList pclist,int n)

/*建立个数为n的循环链表。成功返回1 失败返回0*/

void josephus_clist(PLinkList pclist,int s,int m)

/*按顺序输出人名。*/

void main(void)

功能:主函数。

接收:总个数n

起始数s

间隔数m

函数调用序列(结构图)

C.源代码:

#include

#define FALSE 0

#define TRUE 1

struct Node;

typedef struct Node * PNode;

struct Node /*定义结构体*/ {int info;

PNode link;

};

typedef struct Node * LinkList;

typedef LinkList * PLinkList;

char Name[][26]={"A","BB","CCC","DDDD","EEEEE","FFFFFF","GGGGGGG"}; /*名字初始化*/

int init_clist(PLinkList pclist,int n) /*建立循环链表*/ {PNode p,q;

int i;

q=(PNode)malloc(sizeof(struct Node));

if(q==NULL) return FALSE;

*pclist=q; /*把新建的q作为pclist的首地址*/ q->info=1;q->link=q;

if(n==1) return TRUE;

for(i=2;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,q;

int i;

p=*pclist;

if(s==1) /*找第s个元素*/ {q=p;

p=p->link;

while(p!=*pclist)

{q=p;

p=p->link;

}

}

else for(i=1;i

{q=p;

p=p->link;

}

while(p!=p->link) /*当链表中结点个数大于1时*/ {for(i=1;i

p=p->link;

}

printf("out element:%s\n",Name[p->info-1]); /*输出名字*/

if(*pclist==p) *pclist=p->link; /*特殊情况——该节点是第一个结点*/

q->link=p->link; /*删除该结点*/

free(p);

p=q->link;

}

printf("out element:%s\n",Name[p->info-1]); /*输出最后一个名字*/

*pclist =NULL;

free(p);

}

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("\n please input the values of s =");

scanf("%d",&s);

}while(s<1);

do{printf("\n 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");

getch();

}

B.程序运行截图

C.分析说明

创建循环链表,所花费的时间为O(n)。找循环链表中的第s个结点,所花费的时间为O(s)。求第m个应出列的元素所对应的名字,所花费的时间为O(m),每次输出一个名字,查找个数不超过n x m个,所花费的时间为O(n x m)。

相关文档
最新文档