约瑟夫环输出实际人名
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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)。