c语言随机生成封闭环路,Joesphu环问题C程序实验报告

数据结构课程实验报告

——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");

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值