北理工数据结构实验1.docx

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
北理工数据结构实验1

《数据结构与算法设计》实验报告 ——实验一 学院: 班级: 学号: 姓名: 一、实验目的1、熟悉VC环境,学习使用C语言实现链表的存储结构。2、通过编程、上机调试,进一步理解线性表、链表、环表的基本概念。3、锻炼动手编程,独立思考的能力。?二、实验内容采用单向环表实现约瑟夫环。?请按以下要求编程实现:?从键盘输入整数m,通过create函数生成一个具有m个结点的单向环表。环表中的结点编号依次为1,2,…m。??从键盘输入整数s(1<=s<=m)和n,从环表的第s个结点开始计数为1,当计数到第n个结点时,输出该第n结点对应的编号,将该结点从环表中消除,从输出结点的下一个结点开始重新计数到n,这样,不断进行计数,不断进行输出,直到输出了这个环表的全部结点为止。例如,m=10,s=3,n=4。则输出序列为:6,10,4,9,5,2,1,3,8,7。?三、程序设计?1、概要设计应用单向环表寄存数字序列。 (1)、单项环表的抽象数据类型定义为:ADT?ListLink {? 数据对象:D = { ai | ai ElemSet, i=1, …,n,n≥0 }数据关系:R1 = { <ai-1, ai> | ai-1,ai D, i=2, …,n }基本操作: Creat( & L, m )操作结果:构造一个有m个结点的单向环表L。若申请空间失败返回错误信息FindInitPostion( & L, m, s ) 初始条件:单向环表L已经存在。 操作结果:找到单向环表L的第s个结点。 OutNum( & L, n )初始条件:单向环表L已经存在。 操作结果:进行约瑟夫环的计算并输出相应编号。} ADT ?ListLink (2)、宏定义?#define?OK?1?#define?ERROR?0(3)、主程序流程主程序首先调用create(&L,m)函数创建含有m个结点的单向环表L,随后调用FindInitPostion(&L,m,s)函数找到初始位置第s个结点,最后调用OutNum(&L,n)函数计算结果并在屏幕上输出。?(4)、模块调用关系:由主函数模块调用创建模块,查找模块与计算模块。?由计算模块将结果输出。?(5)、流程图查找第s个结点创建具有m个结点的单向环表输入m,s,n的值开始进行约瑟夫环计算输出结点的序号结束2、详细设计(1)、数据类型设计typedef struct list{ int num; struct list * next;}list,* plist; //结点类型,指针类型plist h,p,q; plist h,p,q;? //设置几个外部变量(2)、操作算法设计void Create(int n)//创建一个有m个结点的单向链表{ h=(plist)malloc(sizeof(list)); if(!h) { printf("malloc error\n"); exit(1);} h->next=NULL; h->num=0; //建立头结点 while(--n) //建立链表 { p=(plist)malloc(sizeof(list)); if(!p) { printf("malloc error\n"); exit(1);} p->num=n; p->next=h->next; h->next=p; } While (p->next) p=p->next; //找到表尾 p->next=h->next; //形成环}void FindInitPostion(int m,int s)// 找到初始的位置{ p=h; while(p->num!=s) p=p->next;}void OutNum(int n)// 计算链表,找到相应的结点删除并输出序号{ while(p->next!=p) //终止条件只剩一个结点{ for(int i=1;i<n-1;i++) p=p->next; q=p->next; //找到要删的结点 printf("%-4d",p->next->num); p->next=p->next->next; p=p->next; free(q); //删除结点} printf("%-4d\n",p->num); }⑶主函数设计void main(){ int m,s,n; scanf("%d%d%d",&m,&s,&n); if(m<1||s<0||n<1||s>m) {printf("Input Error\n"); exit(1);} Create(m+1); FindInitPostion(m,s); OutNum(n);} 四、程序调试分析1、在运行时结果总也不对,我采取了分模块检测的方法,首先创建链表后马上输出各结点的值,发现一直都

文档评论(0)

haihang2017 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档