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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

线性表实验报告.docx

1、线性表实验报告一实验名称1.线性表基本操作;2.处理约瑟夫环问题二试验目的:1熟悉C语言的上机环境,掌握C语言的基本结构。2定义单链表的结点类型。3 熟悉对单链表的一些基本操作和具体的函数定义。4 通过单链表的定义掌握线性表的链式存储结构的特点。5熟悉对单链表的一些其它操作。三实验内容1.编制一个演示单链表初始化、建立、遍历、求长度、查询、插入、删除等操作的程序。2.编制一个能求解除约瑟夫环问题答案的程序。实验一 线性表表的基本操作 问题描述: 1. 实现单链表的定义和基本操作。该程序包括单链表结构类型以及对单链表操作的具体的函数定义程序中的单链表(带头结点)结点为结构类型,结点值为整型。/*

2、 定义DataType为int类型 */typedef int DataType;/* 单链表的结点类型 */typedef struct LNodeDataType data; struct LNode *next;LNode,*LinkedList;LinkedList LinkedListInit() /初始化单链表void LinkedListClear(LinkedList L) / 清空单链表int LinkedListEmpty(LinkedList L)/检查单链表是否为空void LinkedListTraverse(LinkedList L)/ 遍历单链表int Linke

3、dListLength(LinkedList L)/求单链表的长度/* 从单链表表中查找元素 */LinkedList LinkedListGet(LinkedList L,int i)/* 从单链表表中查找与给定元素值相同的元素在链表中的位置 */int LinkedListLocate(LinkedList L, DataType x)void LinkedListInsert(LinkedList L,int i,DataType x) /向单链表中插入元素/* 从单链表中删除元素 */void LinkedListDel(LinkedList L,DataType x)/* 用尾插法建

4、立单链表 */LinkedList LinkedListCreat( )2. 约瑟夫环问题:任给正整数N和K,按下述方法可以得到1,2, ,n的一个置换,将数字1,2,n环形排列,按顺时针方向自1开始报数,报到K时输出该位置上的数字,并使其出列。然后从他在顺时针方向的下一个数字继续报数,如此下去,直到所有的数字全部出列为止。例如N=10,K=3,则正确的出列顺序应为3,6,9,2,7,1,8,5,10,4。3. 试单链表实现一个简单的电子通讯本管理软件,要求能查找联系地址,增加和删除联系人。联系方式假定包括姓名、电话和地址。基本要求:1.上机前要做好准备工作,包括程序框图、数据结构以及算法。2

5、.按时实验3.服从实验室老师的安排4.独立实验,有问题可以讨论,但不得翻版。5.遵守实验室的各项纪律。四、概要设计1.单链表的操作(1)为了实现上述程序功能,需要定义单链表的抽象数据类型:ADTLinkedList数据对象:D=ai|aistructLNodeset,i=0,1,2,n,n0数据关系:R=|ai,ai+1D基本操作:LinkedListInit()操作结果:构造了一个带头节点的空链表L;LinkedListCreat()初始条件:单链表L已存在;操作结果:建立了一个带头节点的非空链表;LinkedListClear(&L)初始条件:单链表L已存在;操作结果:将L重置为带头节点的

6、空链表;LinkedListEmpty(&L)初始条件:单链表L已存在;操作结果:如果链表L为空则返回1,链表L非空则返回0;LinkedListLength(&L)初始条件:单链表L已存在;操作结果:返回单链表L中数据元素的个数,若L为空表则返回0;LinkedListTraverse(&L)初始条件:单链表L已存在;操作结果:依次返回单链表L中各节点的元素值,若L为空表则显示链表为空;LinkedListGet(&L,i)初始条件:单链表L已存在;操作结果:显示链表L中第i个节点个元素值,若链表L中没有第i个节点则显示查询位置不正确;LinkedListLocate(&L,x)初始条件:单

7、链表L已存在;操作结果:显示链表L中元素x的位置,若链表L中没有元素x则显示所查找元素不存在;LinkedListInsert(&L,i,x)初始条件:单链表L已存在;操作结果:在单链表L第i个节点后插入一个元素值为x的节点,L的长度加1,若单链表L中没有第i个节点则显示插入位置不正确;LinkedListDel(&L,i)初始条件:单链表L已存在;操作结果:在单链表L中删除第i个节点,L的长度减1,若单链表L中没有第i个节点则显示删除位置不正确;(2)本程序包含11个函数:1.主函数main()2.初始化单链表函数LinkListInit()3.清空单链表函数LinkedListClear(

8、)4.检查单链表是否为空函数LinkedListEmpty()5.遍历遍历单链表函数LinkedListTraverse()6.求单链表的长度函数LinkedListLength()7.从单链表表中查找元素函数LinkedListGet()8从单链表表中查找指定元素的位序函数LinkedListLocate()9.插入元素函数LinkedListInsert()10.删除元素函数LinkedListDel()11.建立单链表函数LinkedListCreat()各函数之间的关系:五详细设计1结点类型和指针类型typedef struct LNodeint data;struct LNode *

9、next; LNode,*LinkedList;2单链表的基本操作(1)初始化单链表LinkedList LinkedListInit()LinkedList L;L=(LinkedList)malloc(sizeof(LNode);L-next=NULL;return L;(2)清空单链表void LinkedListClear(LinkedList L)L-next=NULL;printf(链表已经清空n);(3)检查单链表是否为空int LinkedListEmpty(LinkedList L)if(L-next=NULL) return TRUE;else return FALSE;(

10、4)遍历单链表void LinkedListTraverse(LinkedList L)LinkedList p;p=L-next;if(p=NULL) printf(单链表为空表n);elseprintf(链表中的元素为:n);while(p!=NULL)printf(%d ,p-data); p=p-next;printf(n);(5)求单链表长度int LinkedListLength (LinkedList L)LinkedList p;int j;p=L-next;j=0;while(p!=NULL) j+;p=p-next; return j;(6)从链表中查找元素LinkedLi

11、st LinkedListGet(LinkedList L,int i)LinkedList p;int j;p=L-next; j=1;while (p!=NULL & jnext; j+; if (j=i) return p;else return NULL;(7)从链表中查找与给定元素值相同的元素在顺序表中的位置int LinkedListLocate ( LinkedList L, int x)LinkedList p;int j;p=L-next; j=1;while ( p!=NULL & p-data != x)p=p-next;j+;if(p) return j;else re

12、turn 0;(8)向链表中插入元素void LinkedListInsert(LinkedList L, int i, int x)LinkedList p,s;int j;j=1;p=L;while(p&jnext;j+;if(p=NULL|ji)printf(插入位置不正确n);else s=(LNode *)malloc(sizeof(LNode);s-data=x;s-next=p-next;p-next=s;printf(%d已插入到链表中n,x);(9)从链表中删除元素void LinkedListDel(LinkedList L,int i) LinkedList p,q;in

13、t j;j=1;p=L;while(p-next&jnext;j+;if(p-next=NULL)printf(删除位置不正确n);else q=p-next;p-next=q-next;free(q);printf(第%d个元素已从链表中删除n,i);(10)建立单链表LinkedList LinkedListCreat( ) LinkedList L=LinkedListInit(),p,r;int x;r=L;printf(请依次输入链表中的元素,输入负数时结束n);scanf(%d,&x);while (x=0)p=(LinkedList)malloc(sizeof(LNode);p-

14、data=x;r-next=p;r=p;scanf(%d,&x);r-next=NULL;return L;(11)主函数main()int i,h,d,e,x,j,n,q;char ch;LinkedList L,p;while(q!=0) printf(请选择要进行的操作n);printf(1.初始化 2.清空 3.求链表长度 4.检查链表是否为空n);printf(5.遍历链表 6.从链表中查找元素n);printf(7.从链表中查找与给定元素值相同的元素在顺序表中的位置n);printf(8.向链表中插入元素 9. 从链表中删除元素n);printf(10.建立单链表n);printf

15、(按其它键结束n);scanf(%d,&x);switch(x)case 1:L=LinkedListInit();printf(链表已经初始化 n);break;case 2:LinkedListClear(L);printf(n);break;case 3:printf(链表的长度为 %dn,LinkedListLength(L);break;case 4:i= LinkedListEmpty(L);if(i)printf(链表为空n);else printf(链表非空n);break;case 5:LinkedListTraverse(L); break;case 6:printf(请输

16、入待查询元素在链表中的位置:);scanf(%d,&j);p=LinkedListGet(L,j);if(p) printf(链表中第%d个元素的值为:%dn,j,p-data);else printf(查询位置不正确n);break;case 7:printf(请输入待查询元素的值:);scanf(%d,&e);h=LinkedListLocate(L,e);if(h)printf(%d在链表中的位置是:%dn,e,h);else printf(链表中没有值为%d的元素n,e);break;case 8:printf(请输入插入元素的位置和值(中间以空格或回车分隔):n);scanf(%d%

17、d,&d,&e);LinkedListInsert(L,d,e);break;case 9:if(LinkedListLength(L)=0)printf(链表已经为空,不能删除n);else printf(请输入待删除元素的位置:n);scanf(%d,&n);LinkedListDel(L,n);break;case 10:L=LinkedListCreat();printf(n);break;default:q=0; 六测试结果1、单链表的操作(1)建立单链表:选择1,然后选择10 ,输入1.2.3.4.5.6.7.8.9 最后一个负数(2)求链表长度:选择3,得到执行结果:链表的长度为

18、9(3)检查链表是否为空:选择4,得到执行结果:单链表非空(4)遍历链表:选择5,得到执行结果:链表中的元素为1,2,3,4,5,6,7,8,9,(5)从链表中查找元素:选择6,输入5,显示:链表中第5个元素的值为5(6)从链表中查找与给定元素值相同的元素在顺序表中的位置选择7,输入2,显示:2在链表中的位置是:2选择7,输入25,显示:链表中没有值为25的元素(7)向链表中插入元素选择8,输入(6,5),显示5以插入到链表中选择5:链表中的元素为1,2,3,4,5,5,6,7,8,9,(8)从链表中删除元素选择9,输入5,显示第5个元素已从表中删除选择9,输入12,显示删除位置不正确选择5,

19、显示链表中的元素为链表中的元素为1,2,3,4,5,6,7,8,9,实验二 约瑟夫环1.问题描述设有编号1,2,3。n(n0)的N个人围成一个圈,每个人持有一个密码(正整数)。开始时从第k(1=k=n)个人按顺时针方向自1开始顺序报数,报到m(m为第K个人的密码)的人出圈,再以这个人顺时针方向上的下一个人的密码为m,并开始重新从1报数。如此下去,直至所有人全部出列为止。试设计一个程序求出出列顺序。例如,设总人数n的初值为8,他们所持的密码分别为:3,10,7,1,4,8,4,5,开始报数人的编号k的初值为7,则出列顺序为:2,1,3,4,8,5,7,62.数据结构设计问题中以序号标示某个人,所

20、以结点的数据域设为一个整型类型的变量当某人出圈后,报数的工作要从下一个人开始继续,剩下的人仍然围成一圈,可以使用循环表。由于出圈的人将不再属于圈内,意味着数据元素的删除。因此,算法中存有频繁的元素删除操作,存储结构宜采用链表。每个结点中既存储密码还存储初始位置,所以结点有两个数据域,一个指针域。另外,每个结点代表一个人所以,可以令尾结点指针指向首元结点来进行循环。/ 结点类template struct Node / 数据成员: ElemType data; ElemType num; / 数据域 Node *next; / 指针域/ 构造函数: Node(); / 无参数的构造函数 Node

21、(ElemType item, ElemType item1,Node *link = NULL); / 已知数数据元素值和指针建立结构;/ 结点类的实现部分templateNode:Node()/ 操作结果:构造指针域为空的结点 next = NULL;templateNode:Node(ElemType item, ElemType item1,Node *link)/ 操作结果:构造一个数据域为item和item1,指针域为link的结点 data = item; num = item1; next = link;#endif3.算法设计编写一个函数实现结点的删除与输入工作,另编写一个主

22、函数main()完成链表的创建与函数调用工作。(1)插入template Status LinkList:Insert(int position, const ElemType &e)/ 操作结果:在线性表的第position个位置前插入元素e/ position的取值范围为1positionLength()+1/ position合法时返回SUCCESS, 否则函数返回RANGE_ERROR if (position Length() + 1) / position范围错 return RANGE_ERROR; / 位置不合法 else / position合法 Node *tmpPtr;/

23、 取出指向第position-1个结点的指针 tmpPtr = GetElemPtr(position - 1); Node *newPtr; if(positionLength() / 如果插入尾结点,则域指针指向首元结点 newPtr = new Node(e, position,head-next); else newPtr= new Node(e, position,tmpPtr-next);/ 生成新结点 tmpPtr-next = newPtr; / 将tmpPtr插入到链表中 curPosition = position; / 设置当前位置的序号 curPtr = newPtr;

24、 / 设置指向当前位置的指针 count+; / 插入成功后元素个数加1 return SUCCESS; (2)删除template Status LinkList:Delete(int position, ElemType &e)/ 操作结果:删除线性表的第position个位置的元素, 并用e返回其值,/ position的取值范围为1positionLength(),/ position合法时函数返回SUCCESS,否则函数返回RANGE_ERROR / position合法 Node *tmpPtr; if(position=1) / 如果删除首元结点,取出指向尾结点的指针 tmpPt

25、r=GetElemPtr(Length(); else / 取出指向第position-1个结点的指针 tmpPtr = GetElemPtr(position - 1); Node *nextPtr = tmpPtr-next; if(position=1) /头结点与新的首元结点相连 head-next=nextPtr-next; / nextPtr为tmpPtr的后继 tmpPtr-next = nextPtr-next; / 删除结点 e = nextPtr-data; / 用e返回被删结点元素值 if (position = Length() / 删除尾结点,当前结点变为头结点 cu

26、rPosition = 1; / 设置当前位置的序号 curPtr = head-next; / 设置指向当前位置的指针 else / 删除非尾结点,当前结点变为第position个结点 curPosition = position; / 设置当前位置的序号 curPtr = tmpPtr-next; / 设置指向当前位置的指针 count-; / 删除成功后元素个数减1 delete nextPtr; / 释放被删结点 return SUCCESS; (3)出圈次序的算法描述template int LinkList:Pass(int position , int n ,ElemType &

27、e) int i; curPtr = GetElemPtr(position); /当前指针指向position curPosition=position; /记录当前位置 for(i=0;inext; curPosition+; coutnum ; /输出起始位置 e=curPosition; (4)主程序#includeassistance.h#includelk_list.h int POS(int n,int i) /计算当前位置的函数 if(n%i=0) n=i; else n=n%i; return n; int main() int tmp,i,k=0,n=0,key; int pos; LinkList lc; /创建空链表 while(n20) /限制人数 coutn; cout请输入每个人的密码,用空格分隔,密码大于0:endl; for(

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

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