数据结构实验报告(约瑟夫环)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基础成绩:82分《数据结构》课程实验
实验报告
题目:Joseph问题求解算法的设计与实现
专业:网络工程
班级:网络102
姓名:***
学号: ******
完成日期:2012/6/20
一、试验内容
-
约瑟夫(Joseph)问题的一种描述是:编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。试设计一个程序求出出列顺序。
二、试验目的
掌握链表的基本操作:插入、删除、查找等运算,能够灵活应用链表这种数据结构。
三、流程图
struct list
{
-
int num,code;
struct list *next;
};
void main()
{
printf("Joseph问题求解算法的设计与实现\n \n");
int i,j,m=1;
int key; // 密码.
int n; //人数.
list *p,*s,*head;
head=(list *)malloc(sizeof(list)); //为头结点分配空间.
p=head; //使指针指向头节点
printf("输入人的总个数:");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
printf("第%d个人的密码:\n",i);
scanf("%d",&key);
s=p;
p=(list *)malloc(sizeof(list)); //创建新的结点.
s->next=p;
p->num=i;
p->code=key;
}
p->next=head->next;
p=head;
head=head->next;
free(p); //释放头结点.
p=head;
printf("\n\n输入初始值:\n");
scanf("%d",&key);
printf("\n出列顺序为:\n");
do
{ j=1; p=head;
while(j { s=p; p=p->next;//使P指向下一结点 j++; } //报数过程. i=p->num; key=p->code; printf("%d\n",i); s->next=p->next; - head=p->next; //重新定义head,下次循环的开始结点. free(p);// 释放已出列的结点. n--; //人数减一. }while(n>0); int x; printf(“输入0退出:”); scanf(“%d”,&x); for(;;) { if(x==o) break; } } 五、调试过程 调试过程中,曾出现过缺少分号、括号之类的错误,还出现过运算顺序颠倒,致使运算出现了错误,在经过仔细的检查并且向人请教,终于得出了正确结果. 六、结果分析 输入人数:7 输入密码:3 1 7 2 4 8 4 初值:6 排序结果:6 1 4 7 2 3 5