C语言约瑟夫环单链实验报告,《数据结构C语言》魏刘宏11054126约瑟夫环实验报告.doc...

杭州电子科技大学

计算机学院

数据结构课程设计

设计题目:约瑟夫环问题

专 业 网络工程

班 级

学 号

姓 名 魏刘宏

指导教师 王立波

2012年12月28日

需求分析

1、问题描述 设编号为1,2,…,n(n>0)个人按顺时针方向围坐一圈,每人持有一个正整数密码。开始时任意给出一个报数上限m,从第一个人开始顺时针方向自1起顺序报数,报到m时停止报数,报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人起重新自1报数;如此下去直到所有人全部出列为止。

2基本要求 设计一个程序模拟此过程,给出出列人的编号序列。3、实现提示: 可考虑不带头结点的单链表结构4、测试数据: N=7,七个人的密码依次为3,1,7,2,4,8,4 初始报数上限值m=20。 ( 正确出列顺序为6,1,4,7,2,3,5 )

概要设计

链表存储结构的定义:

typedef struct Lnode

{} LNode, * LinkList;

LinkList CreatCycleList(int n)

创建无头节点的单向循环链表;

void print(LinkList L)

输出链表;

详细设计

#include

#include

typedef int ElemType;

typedef struct LNode{

ElemType data;

ElemType seq;

struct LNode *next;

} LNode, * LinkList;

LinkList CreatCycleList(int n){

//单向循环链表 ,无头节点;

LinkList La = (LinkList)malloc(sizeof(LNode));

ElemType a;

scanf("%d",&a);

La->data = a;

La->seq = 1;

LinkList q = La ;

for(int i=1; i < n; i++){

LinkList p = (LinkList)malloc(sizeof(LNode));

q->next = p;

scanf("%d",&a);

p->data = a;

p->seq = i+1;

p->next = La;

q=p;

}

return q; //指向尾节点,避免对第一个结点的操作失败;

}

void print(LinkList L)

{

LinkList p = L->next;

printf("%d ", p->data);

p = p->next;

while (p != L->next) //适应链表指针指向尾节点的情况

{

printf("%d ", p->data);

p = p->next;

}

printf("\n");

}

int main(){

printf("约瑟夫环 单向循环链表 \n\n");

int m,n,i,j;

printf("请输入人数: ");

scanf("%d",&n);

printf("请输入每个人的密码(%d个正整数):\n",n);

LinkList L = CreatCycleList(n);

LinkList pre = L;

//printf("初始站队为:\n");

//print(L);

printf("请输入初始报数上限值:\n");

scanf("%d",&m);

printf("\n出列顺序为:\n");

j = n;

while(j > 0){

for(i = 1; i < m; i++){

pre = pre->next;

}

m = pre->next->data;

printf("%d ",pre->next->seq);

pre->next = pre->next->next;

j--;

}

printf("\n\n");

return 0;

}

调试分析

这是我上数据结构课程设计这门课后做的第一个实验,所以开始时

开始时,我将代表链

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值