ImageVerifierCode 换一换
格式:DOCX , 页数:25 ,大小:375.97KB ,
资源ID:6281217      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6281217.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(实验一 线性表的基本操作实现及其应用.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

实验一 线性表的基本操作实现及其应用.docx

1、实验一 线性表的基本操作实现及其应用实验 一 线性表的基本操作实现及其应用一、实验目的1、熟练掌握线性表的基本操作在两种存储结构上的实现。2、会用线性链表解决简单的实际问题。二、实验内容 题目一、该程序的功能是实现单链表的定义和操作。该程序包括单链表结构类型以及对单链表操作的具体的函数定义和主函数。其中,程序中的单链表(带头结点)结点为结构类型,结点值为整型。单链表操作的选择以菜单形式出现,如下所示:please input the operation: 1.初始化 2.清空 3.求链表长度 4.检查链表是否为空 5.检查链表是否为满 6.遍历链表(设为输出元素)7.从链表中查找元素 8.从链

2、表中查找与给定元素值相同的元素在表中的位置 9.向链表中插入元素 10. 从链表中删除元素 其他键退出。 其中黑体部分必做题目二、约瑟夫环问题:设编号为1,2,3,n的n(n0)个人按顺时针方向围坐一圈,每个人持有一个正整数密码。开始时任选一个正整数做为报数上限m,从第一个人开始顺时针方向自1起顺序报数,报到m时停止报数,报m的人出列,将他的密码作为新的m值,从他的下一个人开始重新从1报数。如此下去,直到所有人全部出列为止。令n最大值取30。要求设计一个程序模拟此过程,求出出列编号序列。struct node /结点结构 int number; /* 人的序号 */ int cipher; /

3、* 密码 */ struct node *next; /* 指向下一个节点的指针 */;三、实验步骤(一) 数据结构与核心算法的设计描述1、单链表的结点类型定义/* 预处理命令 */#define OK 1;#define ERROR 0;#define OVERFLOW -1;/* 定义DataType,status为int类型 */typedef int DataType;typedef int status;/* 单链表的结点类型 */typedef struct LNode DataType data; struct LNode *next;LNode,*LinkedList;2、初始

4、化单链表LinkedList LinkedListInit() /定义并返回头结点L3、清空单链表 void LinkedListClear(LinkedList L) / L是带头结点的链表的头指针,释放除头结点外的所有内存空间 4检查单链表是否为空 int LinkedListEmpty(LinkedList L)/ L是带头结点的链表的头指针,判断头结点的next是否为空,如果空/返回OK,否则返回ERROR5、 遍历单链表 void LinkedListTraverse(LinkedList L)/ L是带头结点的链表的头指针,遍历并输出L所有结点(不包括头/结点)的数据6、求单链表的

5、长度int LinkedListLength(LinkedList L)/ L是带头结点的链表的头指针,通过遍历链表用i记录结点个数(不/包括头结点),并返回i 7、从单链表表中查找元素 LinkedList LinkedListGet(LinkedList L,int i) /L是带头结点的链表的头指针,返回第 i 个元素8、从单链表表中查找与给定元素值相同的元素在链表中的位置(位置) int LinkedListGet1(LinkedList L,DataType x) /L是带头结点的链表的头指针,返回值为x元素在链表中的位置的 /位置9、从单链表表中查找与给定元素值相同的元素在链表中的

6、位置(指针)LinkedList LinkedListLocate(LinkedList L, DataType x) /L是带头结点的链表的头指针,返回值为x元素的指针10、 向单链表中插入元素 status LinkedListInsert(LinkedList L,int i,DataType x)(二) 函数调用及主函数设计 图1.主函数流程图(三) 程序调试及运行结果分析1进入选择界面后,先选择7,进行插入: 2.选择4,进行遍历,结果为:3.选择2,得出当前链表长度.4.选择3,得出当前链表为.5.选择分别选择5、6进行测试.6.选择8,分别按位置和元素值删除.7.选择9,或非1-

7、8的字符,程序结束.(四) 实验总结 通过这次实验,我对线性链表有了更深的理解,深入明白了线性存储结构与链式存储结构在内存存储的不同特点,同时我还学会了用这些知识实际解决一些问题,能够更加熟练地将算法转化为实际程序。同时,在写程序和调试程序的过程中,学会了一些书写技巧和调试技巧,这对于自己能在短时间高效的写出正确地程序有很大作用。四、主要算法流程图及程序清单1. 主要算法流程图: (1) 从单链表表中查找与给定元素值相同的元素在链表中的位置 2. 程序清单:#includeusing namespace std;#include#include/* 预处理命令 */#define OK 1;#

8、define ERROR 0;#define OVERFLOW -1; /* 单链表的结点类型 */typedef struct LNode int data; struct LNode *next;LNode,*LinkedList;/*初始化单链表*/LinkedList LinkedListInit() /定义并返回头结点 LinkedList L; L=(LinkedList)malloc(sizeof(LNode); L-next=NULL; return L;/*清空单链表*/void LinkedListClear(LinkedList L) /释放除头结点外的所有内存空间 Li

9、nkedList p=L-next,q; L-next=NULL; while (p) q=p-next; free(p); p=q; coutttt已清空!next) return OK; return ERROR;/*遍历单链表*/void LinkedListTraverse(LinkedList L) /遍历并输出L所有结点(不含头结点)的数据 LinkedList p=L-next; if (!p) coutttt链表为空!endl; couttt; while(p) coutdatanext; coutnext; int i=0; while(p) i+; p=p-next; re

10、turn i;/*从单链表表中查找元素*/LinkedList LinkedListGet(LinkedList L,int i) /L是带头结点的链表的头指针,返回第 i 个元素 LinkedList p=L-next; int j=1; while(jnext; j+; if (!p) return NULL; return p;/*从链表中查找与给定元素值相同的元素在表中的位置,返回位置*/int LinkedListGet1(LinkedList L,int x) /L是带头结点的链表的头指针,返回值为x元素的位置 LinkedList p=L-next; int i=1; while

11、(p&!(p-data=x) i+; p=p-next; if (!p) return 0; return i;/*从单链表表中查找与给定元素值相同的元素在链表中的位置*/LinkedList LinkedListLocate(LinkedList L, int x) /L是带头结点的链表的头指针,返回值为x元素的指针 LinkedList p=L-next; while(p&!(p-data=x) p=p-next; if (!p) return NULL; return p;/*向单链表中插入元素*/int LinkedListInsert(LinkedList L,int i,int x

12、) / L 为带头结点的单链表的头指针,本算法 / 在链表中第i 个结点之前插入新的元素 x LinkedList s=(LinkedList)malloc(sizeof(LNode); s-data=x; LinkedList p=L-next,q; if (i=1) if (p=NULL) L-next=s; s-next=NULL; return OK; else L-next=s; s-next=p; return OK; int j=1; while(jnext; j+; if (!p) free(s); return ERROR; q=p-next; p-next=s; s-nex

13、t=q; return OK;/*从单链表中删除元素*/int LinkedListDel(LinkedList L,int x) /删除以 L 为头指针的单链表中值为x结点 LinkedList p=L-next,q=L; while(p&!(p-data=x) q=p; p=p-next; if (!p) return ERROR; q-next=p-next; free(p); return OK;int LinkedListDel(LinkedList L,int i,int &x) /删除以 L 为头指针的单链表中第 i 个结点,并返回x的值 LinkedList p=L-next,

14、q=L; int j=1; while(jnext; j+; if (!p) x=0; return ERROR; q-next=p-next; x=p-data; free(p); return OK;/*菜单显示*/void ScreenShow() coutttt1.清空endl; coutttt2.求链表长度endl; coutttt3.检查链表是否为空endl; coutttt4.遍历链表endl; coutttt5.从链表中查找元素 endl; coutttt6.从链表中查找与给定元素值相同的元素在表中的位置endl; coutttt7.向链表中插入元素endl; coutttt8

15、.从链表中删除元素endl; coutttt9.退出endl;/*主函数*/int main() /初始化链表 int i=1; LinkedList L=LinkedListInit(); if (L) coutttt初始化成功!n=1&i=8) couttti; switch (i) /1、清空链表 case 1:LinkedListClear(L);break; /2.求链表长度 case 2: coutttt链表长度为:LinkedListLength(L)endl; getch(); break; /3.检查链表是否为空 case 3: if (!LinkedListEmpty(L)

16、 coutttt链表不为空!endl; else coutttt链表为空!endl; getch(); break; /4.遍历链表 case 4: LinkedListTraverse(L); getch(); break; /5.从链表中查找元素 case 5: coutj; if (LinkedListGet(L,j) coutttt位置i的元素值为:dataendl; else coutttti大于链表长度!endl; getch(); break; /6.从链表中查找与给定元素值相同的元素在表中的位置 case 6: coutb; if (LinkedListGet1(L,b) co

17、utttt要查找的元素值位置为:LinkedListGet1(L,b)endl; coutttt要查找的元素值内存地址为:LinkedListLocate(L,b)endl; else coutttt该值不存在!endl; getch(); break; /7.向链表中插入元素 case 7: coutx; coutk; if(LinkedListInsert(L,k,x) coutttt插入成功!endl; else coutttt插入失败!endl; getch(); break; /8.从链表中删除元素 case 8: coutttt1.按位置删除endl; coutttt2.按元素删除

18、endl; int d; coutd; switch(d) case 1: coutd; int y; if (LinkedListDel(L,d,y) coutttty被删除!endl; else coutttt删除失败!endl; break; case 2: couty; if (LinkedListDel(L,y) coutttty被删除!endl; else coutttt删除失败!endl; getch(); break; return 1;题二 约瑟夫环问题算法、思想为了解决这一问题,可以先定义一个长度为30(人数)的数组作为线性存储结构,并把该数组看成是一个首尾相接的环形结构,

19、那么每次报m的人,就要在该数组的相应位置做一个删除标记,该单元以后就不再作为计数单元。这样做不仅算法较复杂,而且效率低,还要移动大量的元素。用单循环链表来解决这一问题,实现的方法相对要简单得的多。首先定义链表结点,单循环链表的结点结构与一般单链表的结点结构完全相同,只是数据域用一个整数来表示位置;然后将它们组成一个具有n个结点的单循环链表。接下来从位置为1的结点开始数,数到第m个结点,就将此结点从循环链表中删去,然后再从删去结点的下一个结点开始数起,数到第m个结点,再将其删去,如此进行下去,直至全部删去为止。代码分析(一) 创建单循环链表 struct Link int Data; Link*

20、next; Link *Creat(int n) Link *head,*s,*r; head=new Link; r=head; for (int i=0;is-Data; r-next=s; r=s; r-next=head-next; return head; (二) “约瑟夫环”的操作模块;Link* Jose(Link*p,int m) int s=m; if (p=p-next) return p;/递归出口即循环链表只剩下一个结点,将该结点指针返回 Link*q=NULL;/指针q用来保存删除结点的前驱 for (int j=1;jnext; /查找要删除结点 q-next=p-

21、next; /删除节点 coutDatanext,s);/递归调用 (三) 主程序int main() coutn; cout请输入每个人手中的序号:endl; Link*head=Creat(n); coutm; Link*p=head-next; coutendl; cout离开的序号依次是:; Link*Result=Jose(p,m); coutDataendl; return 0; 测试数据调试分析1、早期程序只写了约瑟夫环的实现部分,没有对输入数据进行筛选,调试的时候会经常出错。比如是输入字母,或者输入0,大于32767溢出;2、早期的循环过程中没有进行优化,导致循环次数过多,浪费

22、时间;3、为了输出时美观,分别在input和main函数主体内做了两次,输入非零的判断,浪费了资源;4、算法的时空分析为了限制在输入过程中不会上溢,只在输入中限定为四个不全为零的数字,但是做的是dowhile循环,复杂度为o(1);当n大于1时:在数据输入中,链表的创建是for循环,时间复杂度为o(n-1)在约瑟夫环实现程序中,为for循环。时间复杂度为o(m%n -1)当n=1时,复杂度为o(1)。实验心得1、巩固和加深了对数据结构的理解,提高综合运用本课程所学知识的能力。2、培养了我选用参考书,查阅手册及文献资料的能力。培养独立思考,深入研究,分析问题、解决问题的能力。3、通过实际编译系统的分析设计、编程调试,掌握应用软件的分析方法和工程设计方法。4、通过课程设计,培养了我严肃认真的工作作风,逐步建立正确的生产观念、经济观念和全局观念。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1