没有合适的资源?快使用搜索试试~ 我知道了~
数据结构课程设计(joseph环,拓扑排序,纸牌游戏)
3星 · 超过75%的资源 需积分: 10 31 下载量 182 浏览量
2010-03-12
16:04:01
上传
评论
收藏 200KB DOC 举报
温馨提示
试读
21页
内有问题的提出,概要设计,流程图,源代码,结果与分析,共20页。有效帮助大家学习,规范课程设计的格式。
资源推荐
资源详情
资源评论
目 录
课题一 joseph 环 2
1.1 问题的提出 1.1.问题的提出 2
1.2 概要设计 2.1 算法思想 2
1.3 流程图 根据算法思想,画程序流程图如下: 3
3
1.4 源代码 1.3.详细设计 4
1.5 结果与分析.4 测试及性能分析 6
课题二 拓扑排序 7
2.1 问题的提出 2.1 问题的提出 7
2. 2 概要设计 8
2.3 流程图 2.根据算法思想,画流程图如下: 8
10
2.4 源代码 11
2.5 结果与分析 2.4 测试及性能分析 14
课题三 纸牌游戏 16
3.1 问题的提出.1 问题的提出 16
3. 2 概要设计 16
1.当每个号码每次遇到是某个数的倍数时,都会相应的翻一次,这样,每张牌会翻的
次数就各不一样,可能很多次,也可能只有一两次,结果就只是要输出在经过各个不
同次数的翻牌后,正面向上的牌都有哪几个。举例说明一下,比如 24,第一次它是 2
的倍数时要从正面翻到背面,当进行到 3 时,就又要从背面翻回来,而到 4 时还要在
翻,同理呢,到 6.8.12…它都要来回的翻。如果它在多次的翻牌后,正面还向上了,
那么它就是要输出的结果之一。 16
3.3 流程图 根据算法思想,画流程图如下: 17
3.4 源代码 18
3.5 结果与分析 19
课题一 joseph 环
1.1 问题的提出 1.1.问题的提出
1.任务:编号是 1,2,……,n 的 n 个人按照顺时针方向围坐一圈,每
个人只有一个密码(正整数)。一开始任选一个正整数作为报数上限值 m,从
第一个仍开始顺时针方向自 1 开始顺序报数,报到 m 时停止报数。报 m 的人
出列,将他的密码作为新的 m 值,从他在顺时针方向的下一个人开始重新从
1 报数,如此下去,直到所有人全部出列为止。设计一个程序来求出出列顺序。
2.测试数据:输入(范围:整型数据)
总成员数:7
各成员密码:3 1 7 2 4 7 4
初始值 m:6
输出(范围:大于等于 1,小于等于 n 的整型数据)
出列成员序号:6 7 4 1 5 3 2
1.2 概要设计 2.1 算法思想
利用单向循环链表存储结构模拟此过程,因为循环链表最后一个结点的指
针域指向头结点,整个链表形成一人环,刚好和题中的“n 个人按照顺时针方向
围坐一圈,每个人只有一个密码(正整数)”内容要求一致,而且,循环链表中
任一结点出发均可找到表中其他结点,利用这一优点可较容易地找出报数的人
及下一个报数的人,最后按照出列的顺序用一个 for 语句实现。
joseph 环的组成成员由密码(password)和序号(No)组成,循环链表的存储
结构如下:
typedef struct LNode
{
int password; //密码
int No; //序号
struct LNode *next; //下一成员指针
}member; //组成成员结构体
1.3 流程图 根据算法思想,画程序流程图如下:
输入 m 、
n
m>0 且 n>0 的整
数
建立含 n 个结点的链表且用 head 指
向第一个元素,结点数据域包含
password 、No 、以及指向下一结点的
指针
head=>p
n≥2
(m%n)==0?n:m
%n=>m
1=>i
i<m
p→next=>p
i++
输出 p→No
p→password=>m
删 除 p 所 指 向 结
点
n--
输出 p→No
结束
开始
1.4 源代码 1.3.详细设计
typedef struct LNode
{
int password; //密码
int No; //序号
struct LNode *next; //下一成员指针
}member; //组成成员结构体
typedef int status;
#de'ne OVERFLOW -2
#de'ne OK 1
#de'ne ERROR 0
#include <stdio.h>
#include <stdlib.h>
status CreateList_Circle(member **,int);
status DeleteNode(member **);
status main()
{
int n,m;
member *head=NULL,*p=NULL; //头指针即首成员地址,遍历指针 p
printf ("Please enter number of people:\n");
scanf ("%d",&n); //总成员数
while (n<=0)
{
printf ("n must be positive, please enter again:\n");
scanf ("%d",&n);
}
if(!CreateList_Circle(&head,n)) //创建循环链表,返回头指针 head
return OVERFLOW;
printf ("Please enter initial m:\n");
scanf ("%d",&m); //初始值 m
while (m<=0)
{
printf ("m must be positive, please enter again:\n");
scanf ("%d",&m);
}
printf ("\nThe order is:\n");
p=head;
while (n>=2) //寻找出列成员
{
int i;
m=(m%n==0)?n:m%n; //化简 m 值
for (i=1;i<m;i++)
p=p->next; //p 指向出列成员
printf ("%d\n",p->No); //输出出列成员序号
m=p->password; //修改 m
DeleteNode(&p); //删除链表中的出列成员
n--; //成员数自减
}
printf ("%d\n",p->No); //输出最后一个成员序号
return OK;
}
status CreateList_Circle(member **p_head,int n)
{
//此算法创建一个无头结点的循环链表,结点数 n,*p_head 返回链表头指针即
首结点地址
int i;
member *tail,*p;
*p_head=(member *)malloc(sizeof(member));
if (!(*p_head)) return OVERFLOW;
(*p_head)->No=1; //储存成员一序号
printf ("Please enter password of No. 1:\n");
scanf ("%d",&(*p_head)->password); //储存成员一密码
tail=*p_head;
tail->next=NULL;
for (i=2;i<n+1;i++)
{
p=(member *)malloc(sizeof(member));
if (!p) return OVERFLOW;
p->No=i; //储存成员序号
printf ("Please enter password of No. %d:\n",i);
scanf("%d",&(p->password)); //储存成员密码
tail->next=p;
tail=p;
}
tail->next=*p_head;
return OK;
}
status DeleteNode(member **pp)
{
剩余20页未读,继续阅读
资源评论
- s6191169552012-06-28不错, 不错 原程序挺好的。
meng8908
- 粉丝: 0
- 资源: 5
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功