数据结构实验一线性表
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构与算法
实验报告
实验一:线性表操作实验
—用循环链表实现约瑟夫环问题
******
学号:*************
班级:14信科二班
二〇一六年十月
实验一 线性表操作实验
【实验内容】
实现线性表的初始化和插入删除操作
提高部分实验:用循环链表实现约瑟夫环问题
【实验目的】
掌握线性表的顺序映象和链式映象方式,能熟练掌握链表结构的使用。
【问题描述】
一个旅行社要从n 个旅客中选出一名旅客,为他提供免费的环球旅行服务。旅行社安排这些旅客围成一个圆圈,从帽子中取出一张纸条,用上面写的正整数m( 要求:用C 或C++语言实现,对某个给定的n 和m (例如n=7和m=3),给出被淘汰出列的旅客编号序列,以及最终的幸存者。 要求实验结果上机演示,最终以实验报告(附原程序)的方式递交。 【问题的实现】 一、线性表初始化和插入删除操作 (1)抽象数据类型 ADT SqList { 数据对象:0}n n,,1,2,3,i Elem Set,a |{a i i ≥⋯=∈=D 数据关系: n} ,2,3,i D,a ,a |a ,a {1i 1-i i 1-i ⋯=∈=R 基本操作: InitList_Sq(&L) 操作结果:构造一个空的线性表L 。 GetElem(L,i,&e) 初始条件:线性表L 已存在,)(L L istLength i 1≤≤。 操作结果:用e 返回L 中第i 个元素的值。 ListInsert_Sq(&L,i,e) 初始条件:线性表L 已存在,1istLength i 1+≤≤) (L L 。 操作结果:在L 中第i 个位置之前插入新数据元素e ,L 长度 加1。 ListDelete_Sq(&L,i,e) 初始条件:循环链表L 已存在且非空,)(L L istLength i 1≤≤。 操作结果:删除L 第i 个数据元素,用e 返回其值,L 长度 减1。 ListPrint_Sq (&L ) 初始条件:线性表L 已存在。 操作结果:输出线性表。 } ADT SqList (2)主要实现思路: 首先定义结点结构,然后构建空线性表,完成初始化; 其次构建GetElem 函数用以返回线性表中元素值; 据题意完成线性表插入和删除函数的构建; 定义一个线性表输出函数以方便检验插入删除操作的运行结果; 定义主函数,总体完成以上所有函数功能的实现。 二、循环链表实现约瑟夫环问题 (1)抽象数据类型 ADT LNode { 数据对象:0}n n,,1,2,3,i Elem Set,a |{a i i ≥⋯=∈=D 数据关系: n} ,2,3,i D,a ,a |a ,a a ,a {1i 1-i i 1-i 1n ⋯=∈=,R } ADT LNode (2)主要实现思路: 首先定义结点结构,一个数据域和一个指针域; 定义头指针和尾指针; 定义主函数: 1)实现旅客数n 与报数值m 输入 2)用for 循环构建结点输入旅客序列,建立循环链表 3)报数淘汰: 引入sum 计数、定义指针p 指向淘汰者; 指针tail 为当前位置,定义指针q 为tail 后继指针,通过tail 来指向q 的位置,实现删除淘汰选手操作; 用while 循环报数淘汰直到列表中只剩一人,跳出循环; 最后剩下一人即幸运获奖者,输出幸运获奖者实现约瑟夫环问题的解决。 【总结】 两个实验结果都基本实现了问题的要求。 对于提高部分实验,有两点改进的地方: 1.可以把循环链表的建立和报数淘汰两部分写成两个函数,再在主函数中调用,这样代码结构更加清晰明确。 2.旅客信息可以结合数组和指针添加姓名进去。 附件: 代码一:线性表初始化和插入删除 #include #include #include #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 #define OVERFLOW -2 typedef struct { char *elem; int length; int listsize; }SqList; //构造一个空的线性表L int InitList_Sq(SqList *L){ L->elem=(char*)malloc(LIST_INIT_SIZE*sizeof(char)); if(!L->elem) exit(OVERFLOW); L->length=0; L->listsize=LIST_INIT_SIZE; return 0; } //获取某个元素 int GetElem(SqList *L,int i,char *e) { if(L->length == 0 || i < 1 || i > L->length) return -1; *e = L->elem[i - 1];