收藏 分享(赏)

第 2 章 线性表.ppt

上传人:Facebook 文档编号:3426418 上传时间:2018-10-27 格式:PPT 页数:46 大小:251KB
下载 相关 举报
第 2 章 线性表.ppt_第1页
第1页 / 共46页
第 2 章 线性表.ppt_第2页
第2页 / 共46页
第 2 章 线性表.ppt_第3页
第3页 / 共46页
第 2 章 线性表.ppt_第4页
第4页 / 共46页
第 2 章 线性表.ppt_第5页
第5页 / 共46页
点击查看更多>>
资源描述

1、2018/10/27,1,11. (1) 静态链表既有顺序存储的优点,又有动态链表的优点。所以,它存取表中第i个元素的时间与i无关。 (2) 静态链表中能容纳的元素个数的最大数在表定义时就确定了,以后不能增加。 (3) 静态链表与动态链表在元素的插入、删除上类似,不需做元素的移动。 以上错误的是( ) 【南京理工大学 2000 一.3(1.5分)】 A(1),(2) B(1) C(1),(2),(3) D. (2),2018/10/27,2,13. 若长度为n的线性表采用顺序存储结构,在其第i个位置插入一个新元素的算法的时间复杂度为( )(1=i=n+1)。【北京航空航天大学 1999 一.1

2、(2分)】 A. O(0) B. O(1) C. O(n) D. O(n2),2018/10/27,3,15线性表( a1,a2,an)以链接方式存储时,访问第i位置元素的时间复杂性为( ) AO(i) BO(1) CO(n) DO(i-1) 【中山大学 1999 一.2(1分)】,2018/10/27,4,17循环链表H的尾结点P的特点是( )。 【中山大学 1998 二.2(2分)】 AP-NEXT=H BP-NEXT=H-NEXT CP=H DP=H-NEXT,2018/10/27,5,18在一个以 h 为头的单循环链中,p 指针指向链尾的条件是( ) A. p-next=h B. p-

3、next=NIL C. p-next-next=h D. p-data=-1 【南京理工大学1998 一.15(2分)】,2018/10/27,6,19对于双向循环链表,在p指针所指的结点之后插入s指针所指结点的操作应为( )。 A p-right=s; s-left=p; p-right-left=s; s-right=p-right; B p-right=s ; p-right-left=s ; s-left=p; s-right=p-right; C s-left=p; s-right=p-right; p-right=s; p-right-left=s; D s-left=p; s-r

4、ight=p-right; p-right-left=s; p-right=s; 【北方工业大学2004一.1(3分)】,2018/10/27,7,23在双向链表指针p的结点前插入一个指针q的结点操作是( )。 A. p-Llink=q;q-Rlink=p;p-Llink-Rlink=q;q-Llink=q; B. p-Llink=q;p-Llink-Rlink=q;q-Rlink=p;q-Llink=p-Llink; C. q-Rlink=p;q-Llink=p-Llink;p-Llink-Rlink=q;p-Llink=q; D. q-Llink=p-Llink;q-Rlink=q;p-L

5、link=q;p-Llink=q; 【青岛大学 2000 五.2(2分)】,2018/10/27,8,20对于一个线性表既要求能够进行较快速的插入和删除,又要求存储结构能反映数据之间的逻辑关系,则应该用( )。【哈尔滨工业大学2005二.2(1分)】 A. 顺序存储方式 B. 链式存储方式 C. 散列存储方式 D. 以上均可以,2018/10/27,9,24在单链表指针为p的结点之后插入指针为s的结点,正确的操作是:( )。 Ap-next=s; s-next=p-next; B s-next=p-next; p-next=s; Cp-next=s; p-next=s-next; D p-ne

6、xt=s-next; p-next=s; 【青岛大学 2001 五.3(2分)】,2018/10/27,10,25对于一个头指针为head的带头结点的单链表,判定该表为空表的条件是( ) Ahead=NULL Bheadnext=NULL Cheadnext=head Dhead!=NULL 【北京工商大学 2001 一.5(3分)】,2018/10/27,11,27. 双向链表中有两个指针域,llink和rlink分别指向前趋及后继,设p指向链表中的一个结点,现要求删去p所指结点,则正确的删除是( )(链中结点数大于2,p不是第一个结点) AP-llink-rlink=p-llink; p-

7、llink-rlink=p-rlink; free(p); Bfree(p); p-llink-rlink=p-llink; p-llink-rlink=p-rlink; CP-llink-rlink=p-llink; free(p); p-llink-rlink=p-rlink; D以上A,B,C都不对。 【南京理工大学 1997 一.1(2分)】,2018/10/27,12,28. 线性表的顺序存储结构是一种_。 【北京理工大学2006 五.3(1分)】 A. 随机存取的存储结构 B. 顺序存取的存储结构 C. 索引存取的存储结构 D. Hash存取的存储结构,2018/10/27,13,

8、基本算法:查找、插入、删除 、合并、逆置、创建,一、按存储结构(1)顺序表,如17、22、25 (2)链表 二、按操作: 1、逆置:如29、30、31、32、33、34 2、查找:如19、20、22、35 3、集合:如3、4、5、6、7、8 4、排序:如12、13、17、56 5、拆分:如15、16、36、54 6、合并:如2、9、10、53 7、插入:如22、42、44 8、删除:如19、35、37、39,2018/10/27,14,算法举例 2.15 链表的逆置,LinkedList invert(LinkedList head) 逆置单链表p=head-next; p为工作指针,指向第一

9、个元素head-next=NULL; 置空链表while(p!=NULL) 将原链表的元素按头插法插入r=p-next; 暂存p的后继p-next=head-next;逆置(头插法插入)head-next=p; 头结点的指针域指向新插入的结点p=r; 恢复待处理结点return(head);invert,2018/10/27,15,遍历、删除,37在一个递增有序的线性表中,有数值相同的元素存在。若存储方式为单链表,设计算法去掉数值相同的元素,使表中不再有重复的元素。例如:(7,10,10,21,30,42,42,42,51,70)将变作(7,10,21,30,42,51,70),分析算法的时间

10、复杂度。 【北京工业大学 1996 三 (15分)】,2018/10/27,16,LinkedList DelSame(LinkedList la) pre=la-next;pre是p所指向的前驱结点的指针p=pre-next; p是工作指针,设链表中至少有一个结点while(p)if(p-data=pre-data) 相同元素值,释放结点u=p; pre-next=p-next; p=p-next;free(u); else pre=p;p=p-next; 元素值不同return la; DelSame,【2.9】ha,hb分别是带头结点的两个单链表的头指针,链表中的元素值按非递减有序,本算

11、法将两链表合并成一个按元素值非递增有序的单链表,并删除重复元素 解法一:边删除边合并 LinkedList Union(LinkedList ha, LinkedList hb) pa=ha-next; pa是链表ha的工作指针pb=hb-next; pb是链表hb的工作指针ha-next=null; ha作结果链表的头指针,先将结果链表初始化为空,合并、头插法(创建)、删除,2018/10/27,18,当两链表均不为空时,先删除重复元素,然后头插创建非递增有序表 while(pa!=null free(u); ,2018/10/27,19,/取pa与pb中较小的元素用头插法插入表头 if(p

12、a-datadata) pa结点数值小 r=pa-next; pa 的后继结点暂存于rpa-next=ha-next; pa结点头插入链表实现逆置换 ha-next=pa;pa=r; 恢复pa为当前待比较结点 else if(pb-datadata) pb结点数值小 r=pb-next; pb 的后继结点暂存于rpb-next=ha-next; pb结点头插入链表实现逆置 ha-next=pb;pb=r; 恢复pb为当前待比较结点else u=pb;pb=pb-next;free(u) pa与pb数值相等删除链表pb和pa中的重复元素 / while(pa!=null & pb!=null),

13、2018/10/27,20,if(pa) pb=pa; 避免再对pa写下面的while语句 将尚未到尾的表逆置到结果表中 while(pb!=null) r=pb-next; pb-next=ha-next; ha-next=pb; pb=r; return ha 算法Union结束,2018/10/27,21,解法二:先合并,再去结果表里删除重复元素 LinkedList Union(LinkedList ha, LinkedList hb) pa=ha-next; pa是链表ha的工作指针pb=hb-next; pb是链表hb的工作指针ha-next=null; ha作结果链表的头指针,先

14、将结果链表初始化为空/合并a,b表中元素while(pa!=null 恢复pb为当前待比较结点/ while(pa!=null & pb!=null),2018/10/27,22,/pa或pb的剩余元素 if(pa) pb=pa; 避免再对pa写下面的while语句 将尚未到尾的表逆置到结果表中 while(pb!=null) r=pb-next; pb-next=ha-next; ha-next=pb; pb=r; /删除重复元素 p=ha-next; /p工作指针,指向结果表ha的首元结点 while(p) 删除ha链表中的重复元素while(p-next ,2018/10/27,23,【

15、2.10】在递增有序的双向循环链表la中插入元素x,使表中元素依然递增有序 DLinkedList DInsert(DLinkedList la, ElemType x) p=la-next; p指向第一元素MaxElemType是和x同类型的机器最大值,用做监视哨la-data=MaxElemType; while(p-datanext ;s=(DLNode *)malloc(sizeof(DLNode);申请结点空间s-data=x;s-prior=p-prior; 将插入结点链入链表s-next=p; p-prior-next=s; p-prior=s; ,插入,2018/10/27,2

16、4,【2.11】设p指向头指针为la的单链表中某结点,试编写算法,删除结点*p的直接前驱结点。,LinkedList LinkedListDel(LinkedList la,LNode *p) 找到*p的前驱结点的前驱*pre。进行如下操作: u=pre-next; pre-next=u-next;free(u);pre=la;if(pre-next=p)printf(“*p是链表第一结点,无前驱n”) ; exit(0) ; while(pre-next-next !=p)pre=pre-next;u=pre-next; pre-next=u-next; free(u);return(la)

17、; ,2018/10/27,25,【2.12】 设计算法,将一个用循环链表表示的稀疏多项式分解成两个多项式,使这两个多项式各自仅有奇次幂或偶次幂项,要求利用原链表中的结点空间来构造这两个链表。,设循环链表表示的多项式的结点结构为: typedef struct node int power; 幂float coef; 系数ElemType other; 其他信息struct node *next; 指向后继的指针 PNode,*PolyLinkedList;,拆分,2018/10/27,26,void PolyDis(PolyLinkedList poly) 设链表带头结点PolyLinked

18、List poly2=(PolyLinkedList)malloc(sizeof(PNode);r2=poly2; r2是只含奇次幂的多项式链表的尾指针r1=poly; r1是只含偶次幂的多项式链表当前结点的前驱结点的指针p=poly-next; 工作指针p指向第一个元素while(p!=poly)if(p-power % 2) 处理奇次幂 r2-next=p; r2=p; p=p-next; else 处理偶次幂 r1-next=p; r1=p; p=p-next; r2-next=poly2; 构成循环链表r1-next=poly; PolyDis,2018/10/27,27,【2.14】

19、设单向链表的头指针为head,试设计算法,将链表按递增的顺序就地排序。,LinkedList LinkListInsertSort(LinkedList head) if(head-next!=null) 链表不为空表 p=head-next-next; 工作指针p指向第二个元素结点head-next-next=null; 首元结点指针域置空while(p!=null) r=p-next; 暂存p的后继q=head; /q指向头结点,从首元结点开始查找插入位置while(q-next /while/if /算法,直接插入排序,2018/10/27,28,排序,17、已知线性表(a1 a2 a3

20、 an)按顺序存于内存,每个元素都是整数,试设计用最少时间把所有值为负数的元素移到全部正数值元素前边的算法:例: (x,-x,-x,x,x,-x x)变为 (-x,-x,-xx,x,x)。 【东北大学 1998 二 (15分)】题目分析题目要求重排n个元素且以顺序存储结构存储的线性表,使得所有值为负数的元素移到正数元素的前面。这可采用快速排序的思想来实现,只是暂存的第一个元素(枢轴)并不作为以后的比较标准,比较的标准是元素是否为负数。,2018/10/27,29,SeqList Rearrange(SeqList a) int i,j,t;i=0; j=a.Last-1; / i,j为工作指针

21、(下标) t=a.data0; /暂存枢轴元素。while(i=0) j-; /j指针前移找小于0的元素if(ij) a.datai+=a.dataj; / 将负数前移while(ij ,快速排序,2018/10/27,30,查找、插入、删除,【2.18】 L是带头结点的按访问频度递减的双向链表,本算法先查找数据x,查找成功时结点的访问频度域增1,最后将该结点按频度递减插入链表中。若查找失败,则在表尾插入值为x的结点;,2018/10/27,31,DLinkList ListLocate(DLinkedList L,ElemType x) DLinkList p=L-next, q=L; p为

22、L表的工作指针,q为p的前驱,用于查找插入位置while(p ,2018/10/27,32,else 查找成功 p-freq+; 令元素值为x的结点的freq域加1p-next-prior=p-prior; 将p结点从链表上摘下p-prior-next=p-next;q=p-prior; 以下查找p结点的插入位置从后往前找,频率非递增有序, 退出循环时q的freq是第一个大于或等于p的freq的while(q !=L 返回值为x的结点的指针 算法结束,2018/10/27,33,51、已知非空双向链表由d指出,结点结构为(llink,data,rlink),请设计算法将链表中数据域值最大(假定

23、唯一)的那个结点移至链表的最前面。要求:不得额外申请新的双链表结点.,【厦门大学 2005 一(15分)】,查找、删除、插入,2018/10/27,34,DLinkedList DListAddedOne(DLinkedList d) /设链表有头结点 /算法仍然用next和prior表示前驱后继 p=d-next; /p记录数据域最大结点q=d-next-next; /q指向待处理的结点while(q) /遍历链表查找值最大的元素 if(q-datap-data) p=q;q=q-next;p-prior-next=p-next; /摘下pp-next-prior=p-prior;p-nex

24、t=d-next; p-prior=d;/插入d指向的头结点的后面d-next-prior=p; d-next=p; ,2018/10/27,35,52、已知p是指向单向循环链表最后一个结点的指针,试编写只包含一个循环的算法,将线性表(a1,a2,an-1,an)改造为(a1,a2,an-1,an,an-1,a2,a1) 【算法思想】从a1开始遍历链表,复制当前元素插入到an的后面,【北京理工大学 2005 十四(15分)】,遍历、头插法(创建),2018/10/27,36,LinkedList CyclInsert(LinkedList p) /设链表没有头结点 q=p-next; /p指向

25、an,q指向a1t= (LNode*)malloc(sizeof(LNode); t-data=q-data;/新的a1将成为链表中最后一个结点,r保存尾指针r=t; /将a1结点放入an的后面t-next=p-next; p-next=t;q=q-next; /从a2结点开始,2018/10/27,37,while(q!=p)/头插法将其余结点插入p(即an)的后面,实现逆序 t= (LNode*)malloc(sizeof(LNode); t-data=q-data;t-next=p-next; p-next=t;q=q-next;p=r; /p指向新a1即为尾指针return p; ,2

26、018/10/27,38,53、设有两个有序单链表,一为升序,一为降序。试编写程序,将这两个链表合并为一个有序链表。 【算法思想】先将降序链表利用头插法逆置,然后两链表合并。,【东北大学 2004 五(15分)】,逆置(头插法)、合并(尾插法),2018/10/27,39,LinkedList Union(LinkedList la,lb) /设两链表均有头结点 p=lb-next;while(p) /头插法逆置lbs=p-next;p-next=lb-next; lb-next=p;p=s;,2018/10/27,40,p=la-next; q=lb-next; r=la;/r为尾指针whi

27、le(p ,2018/10/27,41,拆分,54、写算法将单链表L1拆成两个链表,其中以L1为头的链表保持原来向后的链接,另一个链表的头为L2,其链接方向与L1相反,L1包含原链表的奇数序号结点,L2包含原链表的偶数序号结点。 【算法思想】 设计数器i计算当前结点是第几个 L1尾插法,L2头插法,【东华大学 2004 三(10分)】,2018/10/27,42,LinkedList Union(LinkedList L1) /设两链表均有头结点 int i=0;L2= (LNode*)malloc(sizeof(LNode); /L2头结点L2-next=null;p=L1-next; /工

28、作指针遍历链表pre=L1; /L1的尾指针while(p) i+;if(i%2)pre-next=p; pre=p; p=p-next;else s=p-next; p-next=L2-next; L2-next=p; p=s;pre-next=null; /L1尾结点指针域赋值return L2; ,2018/10/27,43,查找、插入,7. 已知递增有序的单链表A,B和C分别存储了一个集合,设计算法实现A:=A(BC),并使求解结构A仍保持递增。要求算法的时间复杂度为O(|A|+|B|+|C|)。其中,|A|为集合A的元素个数。 题目分析本题首先求B和C的交集,即求B和C中共有元素,再

29、与A求并集,同时删除重复元素,以保持结果A递增。 【合肥工业大学 2000 五.1(8分)】,2018/10/27,44,LinkedList union(LinkedList A,B,C) 设置三个工作指针 pa=A-next; pb=B-next; pc=C-next; pre=A; pre指向结果链表中当前待合并结点的前驱while(pa | (pb 算法Union结束,2018/10/27,45,查找、插入,56在数组 A1n中有n个数据,试建立一个带有头结点的循环链表,头指针为h,要求链中数据从小到大排列,重复的数据在链中只保存一个。 题目分析本题要求建立有序的循环链表。从头到尾扫描数组A,取出Ai(0=in),然后到链表中去查找值为Ai的结点,若查找失败,则插入。 【南京理工大学1998七.2 (7分)】,2018/10/27,46,LinkedList creat(ElemType A,int n) LinkedList h;h=(LinkedList)malloc(sizeof(LNode);申请结点h-next=h; 形成空循环链表for(i=0;inext;while(p!=h 算法结束,

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

当前位置:首页 > 中等教育 > 小学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报