理解线性表的逻辑结构特性.ppt

上传人:牧羊曲112 文档编号:6367530 上传时间:2023-10-21 格式:PPT 页数:89 大小:554KB
返回 下载 相关 举报
理解线性表的逻辑结构特性.ppt_第1页
第1页 / 共89页
理解线性表的逻辑结构特性.ppt_第2页
第2页 / 共89页
理解线性表的逻辑结构特性.ppt_第3页
第3页 / 共89页
理解线性表的逻辑结构特性.ppt_第4页
第4页 / 共89页
理解线性表的逻辑结构特性.ppt_第5页
第5页 / 共89页
点击查看更多>>
资源描述

《理解线性表的逻辑结构特性.ppt》由会员分享,可在线阅读,更多相关《理解线性表的逻辑结构特性.ppt(89页珍藏版)》请在三一办公上搜索。

1、1,第二章 线性表,重点:理解线性表的逻辑结构特性熟练掌握线性表的顺序存储结构的描述方法,以及在该存储结构下的基本操作熟练掌握线性表的链式存储结构的描述方法,灵活使用单链表、双链表、循环链表,学会在相应存储结构下实现其各种基本算法及相关的时间性能分析一元多项式的表示和相加,2,第二章 线性表,难点:能够从时间和空间复杂度的角度综合比较线性表两种存储结构的不同特点及其应用场合使用本章所学的基本知识设计有效算法,解决与线性表相关的应用问题,3,第二章 线性表,2.1 线性表的类型定义2.2 线性表的顺序表示和实现2.3 线性表的链式表示和实现 2.3.1 线性链表 2.3.2 循环链表 2.3.3

2、 双向链表2.4 一元多项式的表示及相加,4,第二章 线性表,线性结构的特点:在数据元素的非空有限集中,1)存在唯一的一个被称为“第一个”的数据元素2)存在唯一的一个被称为“最后一个”的数据元素3)除第一个之外,集合中的每个数据元素均只有一个前驱4)除最后一个之外,集合中的每个数据元素均只有一个后继,5,1.线性表:定义:简称为表,是零个或多个元素的有穷序列,通常可以表示成(a1,a2,an)(n 0)表的长度:表中所含元素的个数 n空表:长度为零的表表项:表中的元素 ai位序:数据元素 ai 在线性表中的位置,2.1 线性表的类型定义,6,1.线性表:线性表中的数据元素在不同的情况下可以有不

3、同的具体含义,它可以是一个数、一个符号,也可是其它更复杂的信息例1.26个字母(A,B,Z)例2.班级人数(33,32,35,30)例3.学生情况登记表:数据元数为记录,有若干个数据项组成(如姓名,学号,性别,年龄),2.1 线性表的类型定义,7,2.线性表的特点:线性表中的数据元素是各种各样的,但同一线性表中的元素必定具有相同特性,即属于同一数据对象相邻数据元素之间存在序偶关系(a1,a2,ai-1,ai,ai+1,an)ai-1是 ai的直接前驱元素,ai+1是ai的直接后继元素相当灵活,长度可以增长或缩短,2.1 线性表的类型定义,8,3.线性表的基本运算在线性表中插入一个元素;在线性表

4、中删除某个元素;在线性表中查找某个特定元素;在线性表中查找某个元素的后继元素;在线性表中查找某个元素的前驱元素;创建空线性表;判别一个线性表是否为空表。由基本运算可以构成其它较为复杂的运算,2.1 线性表的类型定义,9,4.抽象数据类型线性表的定义(P19)ADT List 数据对象:D=ai|aiElemSet,i=1,2,n,n 0 数据关系:R1=|ai-1,ai D,i=1,2,n 基本操作:InitList(&L)操作结果:构造一个空的线性表L DestroyList(&L)初始条件:线性表L已存在 操作结果:销毁线性表,2.1 线性表的类型定义,10,4.抽象数据类型线性表的定义(

5、P19)ClearList(&L)初始条件:线性表L已存在 操作结果:将线性表L重置为空表 ListEmpty(L)初始条件:线性表L已存在 操作结果:若L为空表,则返回TRUE,否则返回FALSE ListLength(L)初始条件:线性表L已存在 操作结果:返回L中数据元素个数,2.1 线性表的类型定义,11,4.抽象数据类型线性表的定义(P19)GetElem(L,i,&e)初始条件:线性表L已存在,1iLengthList(L)操作结果:用e返回L中第i个元素的值 LocateElem(L,e,compare()初始条件:线性表L已存在,compare()是元素判定 函数 操作结果:返

6、回L中第1个与e满足关系compare()的 元素的位序。若这样的元素不存在,则 返回值为0 PriorElem(L,cur_e,&pre_e)初始条件:线性表L已存在 操作结果:若cur_e是L的元素,但不是第一个,则 用pre_e 返回它的前驱,否则操作失败,pre_e无定义,2.1 线性表的类型定义,12,4.抽象数据类型线性表的定义(P19)NextElem(L,cur_e,&next_e)初始条件:线性表L已存在 操作结果:若cur_e是L的元素,但不是最后一个,则用next_e返回它的后继,否则操作失败,next_e无定义 ListTraverse(L,visit()初始条件:线性

7、表L已存在 操作结果:依次对L的每个元素调用函数visit()。一 旦visit()失败,则操作失败 PutElem(L,i,&e)初始条件:线性表L已存在,1iLengthList(L)操作结果:L中第i个元素赋值同e的值,2.1 线性表的类型定义,13,4.抽象数据类型线性表的定义(P19)ListInsert(&L,i,e)初始条件:线性表L已存在,1iLengthList(L)+1 操作结果:在L的第i个元素之前插入新的元素e,L 的长度增1 ListDelete(&L,i,&e)初始条件:线性表L已存在且非空,1iLengthList(L)操作结果:删除L的第i个元素,并用e返回其值

8、,L 的长度减1 ADT List,2.1 线性表的类型定义,14,例2-1 假设利用两个线性表LA和LB分别表示两个集合A和B(即:线性表中的数据元素即为集合中的成员),现要求一个新的集合AAB。上述问题等价于:要求对线性表作如下操作:扩大线性表LA,将存在于线性表LB中而不存在于线性表LA中的数据元素插入到线性表LA中去。分下列三步进行:1)从线性表LB中依次取得每个数据元素;2)依值在线性表LA中进行查访;3)若不存在,则插入之。,2.1 线性表的类型定义,15,用C语言描述得如下算法:void union(List/La中不存在和 e 相同的数据元素,则插入之/union算法 2.1,

9、2.1 线性表的类型定义,16,例2-2 已知一个非纯集合 B,试构造集合A,要求集合A中只包含集合B中所有值不相同的数据元素解法一:同上,分别以线性表LA和LB表示集合A和B,则首先初始化线性表LA为空表,之后的操作和例2-1完全相同解法二:仍以线性表表示集合。只是求解之前先对线性表LB中的数据元素进行排序,即线性表LB中的数据元素依其值从小到大有序排列,则值相同的数据元素必相邻。则上述操作中的第二步就不需要进行从头至尾的查询,2.1 线性表的类型定义,17,用C语言描述得如下算法:void purge(List/for/purge算法 2.2,2.1 线性表的类型定义,18,例2-3 归并

10、两个“其数据元素按值非递减有序排列的”线性表LA和LB,求得线性表LC也具有同样特性void MergeList(List La,List Lb,List,2.1 线性表的类型定义,19,if(ai=bj)ListInsert(Lc,+k,ai);+i;else ListInsert(Lc,+k,bj);+j;while(i=La_len)GetElem(La,i+,ai);ListInsert(Lc,+k,ai);while(j=Lb_len)GetElem(Lb,j+,bj);ListInsert(Lc,+k,bj);/merge_list算法 2.3,2.1 线性表的类型定义,20,假设

11、:GetElem和ListInsert这两个操作的执行时间和表长无关,LocateElem的执行时间和表长成正比,则算法2.1的时间复杂度为 O(ListLength(LA)ListLength(LB);例2-2(解法一)的时间复杂度为 O(ListLength2(LB);算法2.2的时间复杂度为 O(ListLength(LB);可见,不同的算法策略所得不同算法的时间复杂度不同。算法2.3的时间复杂度为 O(ListLength(LA)ListLength(LB),2.1 线性表的类型定义,21,线性表的顺序表示:以元素在计算机内存中的“物理位置相邻”来表示线性表中数据元素之间的逻辑关系,如

12、下所示:Locate(ai+1)=Locate(ai)+sizeof(DataType)Locate(ai)=Locate(a0)+sizeof(DataType)*i只要确定了首地址,线性表中任意数据元素都可以随机存取称第一个数据元素的存储地址为线性表的起始地址,称作线性表的基地址,2.2 线性表的顺序表示和实现,22,线性表的顺序存储结构示意图,2.2 线性表的顺序表示和实现,23,2.2 线性表的顺序表示和实现,顺序表的定义:在C语言中可以用一维数组表示 const LIST_INIT_SIZE=100;/表初始分配空间 const LISTINCREMENT=10;/空间分配增量基址

13、typedef struct ElemType*elem;/存储空间 int length;/当前长度 int listsize;/当前存储容量 int incrementsize;/空间分配增量 SqList;,24,2.2 线性表的顺序表示和实现,Status InitList_Sq(SqList/InitList_Sq,25,2.2 线性表的顺序表示和实现,根据顺序表的存储特点,顺序表的基本运算:1.int insert_sq(SqList palist,DataType x,int p)在palist所指顺序表中下标为p的位置上插入一个值为x的元素,并返回插入成功与否的标志。此运算在0

14、pn时有意义2.int delete_sq(SqList palist,int p)在palist所指顺序表中删除下标为p的元素,并返回删除成功与否的标志。此运算在0pn时有意义,26,2.2 线性表的顺序表示和实现,根据顺序表的存储特点,顺序表的基本运算:3.int first_sq(SqList palist)求palist所指顺序表中第一个元素的下标。当palist为空表时返回一个特殊的下标值-14.int locate_sq(SqList palist,DataType x)在palist所指顺序表中寻找值为 x 的元素的下标,若palist中不存在值为 x 的元素,则返回一个特殊的下

15、标值-1,27,2.2 线性表的顺序表示和实现,根据顺序表的存储特点,顺序表的基本运算:5.DataType retrieve_sq(SqList palist,int p)在palist所指顺序表中,寻找下标为 p(0pn)的元素,并将该元素的值作为函数值返回,若palist中无下标为的元素,则返回一个特殊的值6.int next_sq(SqList palist,int p)求palist所指顺序表中下标为 p 的元素的后继元素下标,当不存在下标为 p 的元素或虽有该元素但无后继时,返回一个特殊的下标值-1,28,2.2 线性表的顺序表示和实现,根据顺序表的存储特点,顺序表的基本运算:7.

16、int previous_sq(SqList palist,int p)求palist所指顺序表中下标为 p 的元素的前驱元素下标,当不存在下标为 p 的元素,或虽有该元素但无前驱时,本函数返回一个特殊的下标值-18.void createNullList_sq(SqList palist)置palist所指顺序表为空表9.int isNullList_sq(SqList palist)判别palist所指顺序表是否为空表。若为空则返回1,否则返回0,29,2.2 线性表的顺序表示和实现,Status ListInsert_Sq(SqList,30,31,32,2.2 线性表的顺序表示和实现,

17、q=/ListInsert_Sq,33,2.2 线性表的顺序表示和实现,Status ListDelete_Sq(SqList/ListDelete_Sq,34,2.2 线性表的顺序表示和实现,插入元素时的时间效率:设pi是在第i个元素之前插入一个元素的概率,则在长度为n的线性表中插入一个元素时所需移动元素的次数的期望值(平均次数)为:,设,则有,35,2.2 线性表的顺序表示和实现,删除元素时的时间效率:设qi是删除第i个元素的概率,则在长度为n的线性表中删除一个元素时所需移动元素的次数的期望值(平均次数)为:,设,则有,36,2.2 线性表的顺序表示和实现,两个顺序表的合并void Mer

18、geList_Sq(SqList la,SqList lb,SqList,37,2.2 线性表的顺序表示和实现,while(pa=pa_last/插入lb的剩余元素/End of MergeList_Sq(),38,2.2 线性表的顺序表示和实现,例:设计一个算法,用尽可能少的辅助空间将顺序表中前m个元素和后n个元素进行整体互换。即将线性表(a1,a2,am,b1,b2,bn)改变成(b1,b2,bn,a1,a2,am)分析:取一临时空间,将b1放入临时空间,a1-am全部后移一个位置,如此b2,直到bn.特点:牺牲时间节省空间 分析:另外申请空间m+n个元素单元,将b,a分别写入。时间将为n

19、+m,39,2.2 线性表的顺序表示和实现,void exchange1(SqList/exchange1,40,2.3 线性表的链式表示及实现,顺序表的缺陷:插入/删除耗费大量时间线性链表:用一组任意单元表示数据元素和数据元素之间的关系(这些单元可以是连续的,也可以是不连续的)其结点由两部分信息组成:(1)数据域:存储数据元素信息;(2)指针域:存储直接后继的存储位置(地址)。,41,2.3 线性表的链式表示及实现,2.3.1 单链表:,存储地址 数据域 指针域 1Li 43 7Qian 13 13Sun 1 19Wang NULL 25Wu 37 31Zhao 7 37Zheng 19 4

20、3Zhou 25,42,2.3 线性表的链式表示及实现,单链表:,线性链表的逻辑状态,43,44,45,2.3 线性表的链式表示及实现,单链表:,非空表,空表,46,单链表结构,2.3 线性表的链式表示及实现,47,2.3 线性表的链式表示及实现,头结点 头结点是链表的开始结点之前的一个附加结点。使用头结点的好处在于:(1)由于开始结点位置被存放在头结点的指针域中,所以在链表的第一个位置上的操作就和在表的其它位置上的操作一致,无须进行特殊处理(2)无论链表是否为空,其头指针是指向结点的非空指针(空表中头结点的指针域为空),因此空表和非空表的处理也就统一了,48,线性链表的定义typedef i

21、nt DataType;/*定义元素类型为整型,也可定义为其他类型*/struct LNode;/*单链表结点类型*/typedef struct LNode*PNode;/*结点指针类型*/struct LNode/*单链表结点结构*/ElemYype data;LNode*next;,2.3 线性表的链式表示及实现,49,基本操作:Status InitList_L(LinkList,2.3 线性表的链式表示及实现,50,Void CreateList_L(LinkList/CreateList_L,2.3 线性表的链式表示及实现,51,Status GetElem_L(LinkList

22、L,int i,ElemType/GetElem_L,2.3 线性表的链式表示及实现,52,单链表结点插入和删除时的情形,2.3 线性表的链式表示及实现,单链表,s-next=p-next;注:顺序不能反单链表插入结点时的情况,p-next=p-next-next;单链表删除结点时的情况,p-next=s;,53,Status ListInsert_L(LinkList/ListInsert_L,2.3 线性表的链式表示及实现,54,55,56,Status ListDelete_L(LinkList/ListDelete_L,2.3 线性表的链式表示及实现,57,LNode*LocateEl

23、em_L(LinkList L,ElemType e)/在L中找到第一个值和e相同的结点,返回其/地址,若不存在,返回空值。if(!L)return NULL;p=L;while(p 时间复杂度:O(n),2.3 线性表的链式表示及实现,58,例:将两个有序链表归并为一个新的有序链表。分析:有两个非递减有序链表La,Lb.现归并La,Lb得到Lc。其条件为大于前者,不小于后者Void MergeList_L(LinkList,2.3 线性表的链式表示及实现,59,while(pa/MergeList_L时间复杂度分析:O(n),2.3 线性表的链式表示及实现,60,单链表与顺序表的比较:单链表

24、的存储密度比顺序表低,它多占用了存储空间。但在许多情况下,链式的分配比顺序分配有效,顺序表必须分配足够大的连续的存储空间,而链表可以利用零星的存储单元在单链表里进行插入、删除运算比在顺序表里容易得多对于顺序表,可随机访问任一个元素,而在单链表中,需要顺着链逐个进行查找,因此单链表适合于在成批地、顺序地处理线性表中的元素时采用,2.3 线性表的链式表示及实现,61,2.3.2 循环链表最后一个结点的指针域的指针又指回第一个结点操作与线性链表基本一致循环条件:p-next=p-head表空条件:p-head-next=p-head,2.3 线性表的链式表示及实现,空循环链表,非空循环链表,62,2

25、.3.3 双向链表可以在单链表的每一个结点里再增加一个指向其前趋和后继的指针域。这样链表中有两条不同方向的链优点:既可以找前驱,也可以找后继,2.3 线性表的链式表示及实现,空双向链表,非空双向链表,63,双向链表存储结构:typedef struct DuLNode ElemType data;struct DuLNode*prior;struct DuLNode*next;DuLNode,*DuLinkList;,2.3 线性表的链式表示及实现,64,双向循环链表,2.3 线性表的链式表示及实现,空双向循环链表,非空双向循环链表,65,2.3 线性表的链式表示及实现,66,双向循环链表的插

26、入算法:Status ListInsert_Dul(DuLinkList/ListInsert_Dul,2.3 线性表的链式表示及实现,67,双向循环链表的删除算法:Status ListDelete_Dul(DuLinkList/ListDelete_Dul,2.3 线性表的链式表示及实现,68,线性链表与顺序表的比较:线性链表 优点:空间的合理利用;插入和删除时不需要移动 缺点:实现基本操作(如求表长)不如顺序表数据元素的“位序”概念被淡化很多场合下,是线性表的首选存储结构,2.3 线性表的链式表示及实现,69,一个带头结点的线性链表类型:P3738,2.3 线性表的链式表示及实现,70,

27、多项式运算的问题,几乎成为表处理的一个经典问题。用单链表结构来表示多项式,研究两个多项式的相加运算一元多项式 Pn(x)=pn+p1x+p2x2+pnxn Qm(x)=qn+q1x+q2x2+qmxm在计算机中可以用一个线性表P,Q(顺序存储)来表示:P=(p0,p1,p2,pn)Q=(q0,q1,q2,qm)每一项的指数都隐含在系数pi,qj的序号里,2.4 一元多项式的表示及相加,71,多项式相加:Rn(x)=Pn(x)+Qm(x)(mn)在计算机中可以用一个线性表R(顺序存储)来表示:R=(p0+q0,p1+q1,p2+q2,pm+qm,pm+1,pn)采用顺序结构使的多项式相加的算法非

28、常简洁这种表示方法对于所有项都比较全的时候是很好的,但是如果指数很高并且变化很大时,不合适,顺序表的最大长度难以确定,2.4 一元多项式的表示及相加,72,例如:一个稀疏多项式:S(x)=1+3x109-5x231+6x354把每一项的系数和指数都存储下来,也就是对于每一项都用两个数据项来存储。即为如下的形式:P=(p1,e1),(p2,e2),(pm,em)可用线性表(1,0),(3,109),(-5,231),(6,354)表示对于这种表示方法,采用链式存储。利用单链表表示多项式时,每个结点设有三个域:系数域coef,指数域exp和链域next。,2.4 一元多项式的表示及相加,coef,

29、exp,next,73,抽象数据类型一元多项式的定义ADT Polynomial 数据对象:D ai|ai TermSet,i=1,2,.,m,m0 TermSet中的每个元素包含一个表示系数的实数和表示指数的整数 数据关系:R1|ai-1,aiD,且ai-1中的指数值ai中的指数值,i=2,.,n 基本操作:CreatPolyn(&P,m)操作结果:输入m项的系数和指数,建立一元多项式P。DestroyPolyn(&P)初始条件:一元多项式P已存在。,2.4 一元多项式的表示及相加,74,操作结果:销毁一元多项式P。PrintPolyn(&P)初始条件:一元多项式P已存在。操作结果:打印输出

30、一元多项式P。AddPolyn(&Pa,&Pb)初始条件:一元多项式Pa和Pb已存在。操作结果:完成多项式相加运算,即:Pa=PaPb,并销毁一元多项式Pb。SubtractPolyn(&Pa,&Pb)初始条件:一元多项式Pa和Pb已存在。操作结果:完成多项式相减运算,即:Pa=PaPb,并销毁一元多项式Pb。,2.4 一元多项式的表示及相加,75,MultiplyPolyn(&Pa,&Pb)初始条件:一元多项式Pa和Pb已存在。操作结果:完成多项式相乘运算,即:Pa=PaPb,并销毁一元多项式Pb。PolynLength(P)初始条件:一元多项式P已存在。操作结果:返回一元多项式P中的项数。

31、ADT Polynomial,2.4 一元多项式的表示及相加,76,例 AH=1-10 x6+2x8+7x14 BH=-x4+10 x6-3x10+8x14+4x18 CH(x)=AH(x)+BH(x)它的单链表表示如图,2.4 一元多项式的表示及相加,77,多项式的加法运算规则:(1)若指数相等,系数相加,得C(x)的一项(若和为0,此项不存在);(2)若A(x)当前项指数大于B(x),复抄A(x)的这一项到C(x)上;(3)若A(x)当前项指数小于B(x),复抄B(x)的这一项到C(x)上;(4)若一个多项式每项都加到C(x)上了,就把另一多项式的剩余部分复抄到C(x)上,2.4 一元多项

32、式的表示及相加,78,C(x)是动态建立的,需要从表头指针所指的结点开始检测,为此我们设两个指针pa和pb分别指向两个多项式中当前被检测的结点;同时还需要记清C(x)建在什么地方,又设指针pc指向C(x)当前的最后一个结点。,2.4 一元多项式的表示及相加,79,根据运算规则,考虑以下三种情况:(1)exp(pa)exp(pb):把pa指的结点复抄到C表的后面。所以调用过程链接在C(x)上(coef(pa),exp(pa),pc)(将实参赋予了形参),并移动指针pa,继续往下检测(2)exp(pa)=exp(pb):将它们的系数相加,为此用一个x单元存放coef(pa)+coef(pb)的和。

33、若x0,就调用过程链接在C(x)上(x,exp(pb),pc),并移动指针pa,pb(3)exp(pa)exp(pb):把pb所指的结点复抄到C表的后面。所以调用过程链接在C(x)上(coef(pb),exp(pb),pc),并移动指针pb,2.4 一元多项式的表示及相加,80,一元多项式抽象数据类型的实现:typedef struct _ElemTypefloatcoef;/*多项式系数*/intexpn;/*多项式指数*/ElemType;/*Node Type 结点类型*/typedef struct _PolynElemType data;/*数据域*/struct _Polyn*ne

34、xt;/*指针域*/Node,*Link;/*Node type&Node Pointer,2.4 一元多项式的表示及相加,81,typedef structLink head,tail;/*用作链表的结节点和尾指针*/intlen;/*可以用来记录链表的长度*/LinkList,*PLinkList;typedef LinkList polynomial;/*Initialize a link list*/void InitPolyn(polynomial,2.4 一元多项式的表示及相加,82,/*实现两个一元多项式的相乘*/void MultiplyPolyn(polynomial,2.4

35、 一元多项式的表示及相加,83,多项式的加法:void AddPolyn(polynomial,2.4 一元多项式的表示及相加,84,else/*释放qa所指向的结点的空间*/DelFirst(ha,qa);FreeNode(qa);DelFirst(hb,qb);FreeNode(qb);qb=NextPos(Pb,hb);qa=NextPos(Pa,qa);break;case 1:/*第一个链表中当前结点的指数值大*/DelFirst(hb,qb);InsFirst(ha,qb);qb=NextPos(Pb,hb);break;/*End of Switch*/*End of while

36、*/if(!Empty(Pb)Append(Pa,qa);FreeNode(hb);/*Free the head node of pb*/*End of AddPolyn()*/,2.4 一元多项式的表示及相加,85,小 结,了解线性表的逻辑结构特征熟悉掌握顺序表和链表的描述方法、特点及有关概念重点掌握顺序表上的插入和删除算法重点掌握链表的建立、查找、插入和删除算法掌握从时间和空间的角度综合比较顺序表以及链表的不同特点及其适用场合一元多项式的表示和相加,86,1.已知线性表LA的数据元素(n个,n为偶数),现要求将LA拆开成两个新的线性表LB,LC。要求LB中的数据元素为LA中的奇数位序的数

37、据元素(a1,a3,an-1),LC中的数据元素为LA中的偶数位序的数据元素(a2,a4,an)。2.已知线性表LA的数据元素(n个),现要求将LA的数据元素复制到另一个线性表LB中。3.设有一个线性表采用顺序存储结构,表中的数据元素值为正整数(n个)。设在O(n)时间内,将线性表分成两为两部分,其中左半部分每个元素都小于原表的第一个元素,而右半部分则相反。,作 业,87,4.设线性表LA(a1,a2,am),LB(b1,b2,bn)。试编写一个算法,将LA、LB合并为线性表LC,使要求LA、LB和LC均以单链表为存储结构,且LC表利用LA和LB中结点空间,这里m和n的值没有保存在头结点中,并分析算法时间复杂度。,作 业,88,5.约瑟夫问题:设编号为1,2,n的n(n0)个人按顺时针方向围坐一圈,每人持有一正整数密码。开始时任选一个正整数作为报数上限值m,从第一个人开始顺时针方向自1起顺序报数,报到m时停止报数,报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人起重新从1报数。如此下去,直到所有人全部出列为止。令n最大值取30。要求设计一个程序模拟此过程,求出出列编号序列(采用循环单链表结构)。6.试比较顺序存储结构和链表存储结构的优缺点。,作 业,89,正确实现所要求的功能(能够通过测试)界面友好程序注释(可读性好)良好的编程风格健壮性,作业要求,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号