考研计算机复习资料数据结构

上传人:艾力 文档编号:35804732 上传时间:2018-03-20 格式:PDF 页数:41 大小:516.82KB
返回 下载 相关 举报
考研计算机复习资料数据结构_第1页
第1页 / 共41页
考研计算机复习资料数据结构_第2页
第2页 / 共41页
考研计算机复习资料数据结构_第3页
第3页 / 共41页
考研计算机复习资料数据结构_第4页
第4页 / 共41页
考研计算机复习资料数据结构_第5页
第5页 / 共41页
点击查看更多>>
资源描述

《考研计算机复习资料数据结构》由会员分享,可在线阅读,更多相关《考研计算机复习资料数据结构(41页珍藏版)》请在金锄头文库上搜索。

1、 【考查目标】 1 1. 理解数据结构的基本概念;掌握数据的逻辑结构、存储结构及其差异,以及各种基 本操作的实现。 2 2. 掌握基本的数据处理原理和方法的基础上,能够对算法进行设计与分析。 3 3. 能够选择合适的数据结构和方法进行问题求解。 一、线性表 大纲要求: (一) 线性表的定义和基本操作 (二) 线性表的实现 1. 顺序存储结构 1 2. 链式存储结构 2 3. 线性表的应用 知识点: 1 深刻理解数据结构的概念,掌握数据结构的“三要素”:逻辑结构、 物理(存储)结构 及在这种结构上所定义的操作“运算”。 2 时间复杂度和空间复杂度的定义,常用计算语句频度来估算算法的时间复杂度。

2、以下 六种计算算法时间的多项式是最常用的。其关系为: O(1)link=plink;plink=s Bqlink=s;slink=p Cplink=slink;s link=p Dplink=s;slink=q 10. 在一个长度为 n 的顺序表的表尾插入一个新元素的渐进时间复杂度为( B )。 AO(n) BO(1) CO(n2) DO(log2n) 11. 表长为 n 的顺序存储的线性表,当在任何位置上插入一个元素的概率相等时,插入一 个元素所需移动元素的平均个数为( B ) An B. n/2 C. (n-1)/2 D. (n+1)/2 12. 循环链表的主要优点是( D ) A不再需要

3、头指针了。 B已知某个结点的位置后,能很容易找到它的直接前驱结 点。 C在进行删除操作后,能保证链表不断开。 D从表中任一结点出发都能遍历 整个链表。 (二)应用题 1、按增长率由小至大排列以下 7 个函数。 ( 2)n、( 3 n 3)n、2100 、log log 2 2 2 n 、log 2 、(log n)2 、n 2 n 答:( 2)n、2100 、log log 2 n 、log n 、(log )2 、 n、( 3)n 3 2 2 2 2 2、数据的存储结构由哪四种基本的存储方法实现,并做以简要说明? 答 :四种表示方法 (1)顺序存储方式。数据元素顺序存放,每个存储结点只含一个

4、元素。存储位置反映数 据元素间的逻辑关系。存储密度大,但有些操作(如插入、删除)效率较差。 (2)链式存储方式。每个存储结点除包含数据元素信息外还包含一组(至少一个)指针。 指针反映数据元素间的逻辑关系。 这种方式不要求存储空间连续,便于动态操作(如插入、 删除等),但存储空间开销大(用于指针),另外不能折半查找等。 (3)索引存储方式。除数据元素存储在一地址连续的内存空间外,尚需建立一个索引表, 索引表中索引指示存储结点的存储位置(下标)或存储区间端点(下标),兼有静态和动 态 特性。 (4)散列存储方式。通过散列函数和解决冲突的方法,将关键字散列在连续的有限的 地 址空间内,并将散列函数的

5、值解释成关键字所在元素的存储地址,这种存储方式称为 散列 存储。其特点是存取速度快,只能按关键字随机存取,不能顺序存取,也不能折半 存取。 3. 线性表有两种存储结构:一是顺序表,二是链表。试问: (1)如果有 n 个线性表同时并存,并且在处理过程中各表的长度会动态变化,线性 表 的总数也会自动地改变。在此情况下,应选用哪种存储结构? 为什么? (2)若线性表的总数基本稳定,且很少进行插入和删除,但要求以最快的速度存取 线 性表中的元素,那么应采用哪种存储结构?为什么? 答: (1)选链式存储结构。它可动态申请内存空间,不受表长度(即表中元素个数)的影 响 ,插入、删除时间复杂度为 O(1)。

6、 (2)选顺序存储结构。顺序表可以随机存取,时间复杂度为 O(1)。 (三)算法设计题 1设计算法,求带表头的单循环链表的表长。 解: int length(Linklist L) int I; listnode *p; I=0; P=L; while (p-next!=L) p=p-next; I+; return I; 2.已知单链表 L,写一算法,删除其重复结点。 算法思路:用指针 p 指向第一个数据结点,从它的后继结点开始到表的结束,找与其值相 同的结点并删除之;p 指向下一个;依此类推,p 指向最后结点时算法结束。算法如下: 解 : void pur_LinkList(LinkLis

7、t H) LNode *p,*q,*r; p=H-next; /*p 指向第一个结点*/ if(p=NULL) return; while (p-next) q=p; while (q-next) /* 从*p 的后继开始找重复结点*/ if (q-next-data=p-data) r=q-next; /*找到重复结点,用 r 指向,删除*r */ q-next=r-next; free(r); /*if*/ else q=q-next; /*while(q-next)*/ p=p-next; /*p 指向下一个,继续*/ /*while(p-next)*/ 该算法的时间性能为 O(n2)。

8、 3.已知指针 la 和 lb 分别指向两个无头结点的单链表中的首结点。请编写函数完成从表 la 中删除自第 i 个元素开始的共 len 个元素并将它们插入到表 lb 中第 j 个元素之前,若 lb 中只有 j-1 个元素,则插在表尾。函数原型如下: int DeleteAndInsertSub(LinkList LinkList p,q,prev,s; if(inext; k+; 2976184525451876if(!p) return -1; q=p;k=1; while(q k+; if(!q) return -1; if(!prev) la=q-next; else prev-nex

9、t=q-next; if(j=1) else q-next=lb; lb=q; s=lb;k=1; while(s k+; if(!s) return -1; q-next=s-next; s-next=p; return 1; 4写一算法,将一带有头结点的单链表就地逆置,即要求逆置在原链表上进行,不允许 重新构造新链表。 L 25 25 L 29 25 (a) (b) 图 单链表的倒置 函数原型如下: void LinkList_reverse(LinkList p=L-next;q=p-next;s=q-next;p-next=NULL; while(s-next) q-next=p;p=

10、q; q=s;s=s- next; q-next=p;s-next=q;L-next=s; 5写一算法,将带有头结点的非空单链表中数据域值最小的那个结点移到链表的最前面。 要求:不得额外申请新的链结点。函数原型如下: void delinsert(LinkList /p 是链表的工作指针 pre=L; /pre 指向链表中数据域最小值结点的前驱 q=p; /q 指向数据域最小值结点,初始假定是第一结点 while(p-next!=NULL) if(p-next-datadata) /找到新的最小值结点 pre=p; q=p-next; p=p-next; if(q!=L-next) /若最小值

11、是第一元素结点,则不需再操作 pre-next=q-next; /将最小值结点从链表上摘下 q-next=L-next; /将 q 结点插到链表最前面 L-next=q; 6编写一个算法来交换单链表中指针 P 所指结点与其后继结点,HEAD 是该链表的头指针, P 指向该链表中某一结点。 答:单链表中查找任何结点,都必须从头指针开始。 本题要求将 指针 p 所指结点与其后继结 点交换,这不仅要求知道 p 结点,还应知道 p 的前驱结点。 这样 才能在 p 与其后继结点交换 后,由原 p 结点的前驱来指向原 p 结点的后继结点。 LinkedList Exchange(LinkedList HE

12、AD,p) HEAD 是单链表头结点的指针,p 是链表中的一个结点。本算法将 p 所指结点与其后继结 点交换。 q=head-next; q 是工作指针,指向链表中当前待处理结点。 pre=head; pre 是前驱结点指针,指向 q 的前驱。 while(q!=null p 是链表中最后一个结点,无后 继。 Else 处理 p 和后继结点交换 q=p-next; 暂存 p 的后继。 pre-next=q; p 前驱结点的后继指向 p 的后继。 p-next=q-next;p 的后继指向原 p 后继的后继。 q-next=p ;原 p 后继的后继指针指向 p。 算法结束。 7已知线性链表第一个

13、链结点指针为 list,请写一算法,将该链表分解为两个带有头结 点的循环链表,并将两个循环链表的长度分别存放在各自头结点的数据域中。其中,线性表 中序号为偶数的元素分解到第一个循环链表中,序号为奇数的元素分解到第二个循环链表 中。 答:算法如下: void split(ListNode *List, ListNode *; q=list1; r=list2; len1=0; len2=0 ; mark=1; while (p!=null) if(mark=1) q-next=p; q=q-next; len1+; mark=2; else r-next=p; r=r-next; len2+;

14、mark=1; list1-data=len1; list2-data=len2; q-next=list1; r-next=list2; 8. 设 A 和 B 是两个单链表,其表中元素递增有序。 试写一算法将 A 和 B 归并成一个按元素值递减有序的单链表 C,并要求辅助空间为 O(1)。 答 :Linklist merge(Linklist A,Linklist B) Linklist C; Listnode *p; C=null; while (AA-next=C;C=A;A=p; else p=B-next;B-next=C;C=B;B=p; if (A) while(A) p=A-n

15、ext;A-next=C;C=A;A=p; else while(B) p=B-next;B-next=C;C=B;B=p; return C; 二、栈、队列和数组 大纲要求: (一) 栈和队列的基本概念 (二) 栈和队列的顺序存储结构 (三) 栈和队列的链式存储结构 (四) 栈和队列的应用 (五) 特殊矩阵的压缩存储 知识点: 1栈、 队列的定义及其相关数据结构的概念,包括:顺序栈、 链栈、 循环队列、 链队列等。 栈与队列存取数据(请注意包括:存和取两部分)的特点。 2 掌握顺序栈和链栈上的进栈和退栈的算法,并弄清栈空和栈满的条件。 注意因栈在一端 操作,故通常链栈不设头结点。 3 如何将中缀表达式转换成前缀、后缀表达式,了解对两种表达式求值的方法。 4 栈与递归的关系。用递归解决的几类问题:问题的定义是递归的,数

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号