数据结构课程实验报告
——Joesphu环问题
班级:信计二班
姓名:汤博文
学号:2006062050
一、需求分析
1. 程序的功能
解决Joesphu环的问题。设有n个人围成一圈,每个人的编号依次为1,2,...,n。现从编号为
k的人开始报数,数到m的人出列,以此类推,直到所有人都出列为止。现要求该n个人的出列顺序。
2. 输入输出的要求
输出的是总人数n,编号k和数到m的人出列的m,其值均为正整数。
输出:从屏幕显示n个人的出列顺序。
3. 测试数据
总人数n=5,编号k=1,m=3。
二、设计内容
1. 算法思想;
Josephu()函数是实现问题要求的主要函数,其算法思想是:从1到m对带头结点的单循环链表循环计数,到m时,输出该结点的编号值,并将该结点从链表中删除,再从该结点的下一个结点起重新自1起循环计数。如此下去,直到单循环链表空时循环结束。即利用带头结点的单循环链表模拟Josephu环,“出列”由链表的删除操作来模拟,即Josephu函数是链表的一个删除操作。
2. 数据结构
建立带头结点的单循环列表,存储n个数据从1到m对带头节点的单循环列表循环计数到
m时,输出该结点的编号值并从列表删除,直至列表为空。
3.模块划分及主要算法的伪代码
主要算法:typed struct node
{ET data;
struct node *next;
}LNode;
void HCLLInit(LNode **head)
int HCLLInsend(LNode *head, ET x)
int HCLLDelete(LNode *head, ET x)
void HCLLPrint(LNode *head)/*打印*/
void joesphu(LNode *head,int k,int m)
伪代码:
LNode 单循环列表
定义b t
b p赋值
while(链表非空)
{while(b不等于m)
{b加1;使p的指针域内容指向结点p;
If(p不等于head)
跳过头结点}
输出编号;
删除节点;
b值重复}
return;
三、调试分析
程序的编写和调试基本正常。本实验采用数据抽象的与模块化程序设计方法。思路清晰,实现时调试顺利,各模块具有很好的可重用性,得到了一次良好的程序设计训练。
四、使用说明和测试结果
说明:输入时的格式为5 1 3,其中数字之间为两个空格,5即为总人数n,1为编号k,3为m。
输出结果:3 1 5 4 2
结果完整严格。
五、源程序(带注释)
#include
#include
typedef int ET;
typedef struct lnode
#include
{
ET data;
struct lnode *next;
}LNode;
void HCLLInit(LNode **head)
{*head=(LNode *)malloc(sizeof(LNode));
(*head)->next=*head;
}
int HLLInsend(LNode *head, ET x)
{LNode *p, *q;
p=head;
while(p->next!=head)
{p=p->next; }
q=(LNode
*)malloc(sizeof(LNode));
q->data=x;
q->next=p->next;
p->next=q;
return 1;
}
int HCLLDelete(LNode *head, ET x)
{LNode *p, *q;
q=head; p=head->next;
while(p!=head
&& p->data!=x)
{q=p;p=p->next; }
if(p==head){printf("not found the
node");return 0;}
q->next=p->next;
free(p);
return 1;
}
void HCLLPrint(LNode *head)
{
printf("%d ",head->data);
}
void Joesphu(LNode *head,int k,int m)
{
LNode *p;
int b,t;
b=k;
p=head->next;
while(head->next!=head)
{
while(b!=m)
{
b++;p=p->next;
if(p==head)
p=p->next;
}
HCLLPrint(p);
t=p->data;
p=p->next;
HCLLDelete(head,t);
b=k;
}
return;
}
void main()
{
LNode *head;
int i,n,k,m;
printf("get in n k m\n");
scanf("%2d %2d
%2d",&n,&k,&m);
HCLLInit(&head);
for(i=1;i<=n;i++)
HLLInsend(head,i);
Joesphu(head,k,m);
printf("\n");
}