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

本站小编 免费考研网/2016-08-19


【考查目标】

1    1. 理解数据结构的基本概念;掌握数据的逻辑结构、存储结构及其差异,以及各种基 本操作的实现。
2    2. 掌握基本的数据处理原理和方法的基础上,能够对算法进行设计与分析。
3    3. 能够选择合适的数据结构和方法进行问题求解。

一、线性表

大纲要求:

(一) 线性表的定义和基本操作
(二) 线性表的实现
1. 顺序存储结构
1    2. 链式存储结构
2    3. 线性表的应用
知识点:

1. 深刻理解数据结构的概念,掌握数据结构的“三要素”:逻辑结构、物理(存储)结构 及在这种结构上所定义的操作“运算”。
2. 时间复杂度和空间复杂度的定义,常用计算语句频度来估算算法的时间复杂度。 以下 六种计算算法时间的多项式是最常用的。其关系为: O(1)<O(logn)<O(n)<O(nlogn)
<O(n2)<O(n3)
指数时间的关系为: O(2n)<O(n!)<O(nn)
3.线性表的逻辑结构,是指线性表的数据元素间存在着线性关系。主要是指:除第一及 最后一个元素外,每个结点都只有一个前趋和只有一个后继。在顺序存储结构中,元素 存储的先后位置反映出这种逻辑关系,而在链式存储结构中,是靠指针来反映这种逻 辑关系的。
4. 顺序存储结构用向量(一维数组)表示,给定下标,可以存取相应元素,属于随机存 取的存储结构。
5.线性表的顺序存储方式及其在具体语言环境下的两种不同实现:表空间的静态分配和 动态分配。掌握顺序表上实现插入、删除、定位等运算的算法。
6. 尽管“只要知道某结点的指针就可以存取该元素”,但因链表的存取都需要从头指针
开始,顺链而行,故链表不属于随机存取结构。要理解头指针、头结点、首元结点和元素 结点的差别。头结点是在插入、删除等操作时,为了算法的统一而设立的(若无头结点 则在第一元素前插入元素或删除第一元素时,链表的头指针总在变化)。对链表(不包 括循环链表)的任何操作,均要从头结点开始,头结点的指针具有标记作用,故头指 针往往被称为链表的名字,如链表head是指链表头结点的指针是head。理解循环链表中 设置尾指针而不设置头指针的好处。链表操作中应注意不要使链意外“断开”。因此, 若在某结点前插入一个元素或删除某元素,必须知道该元素的前驱结点的指针。
7. 链表是本部分学习的重点和难点。重点掌握以下几种常用链表的特点和运算:单链表、
 
循环链表、双向链表、双向循环链表的生成、插入、删除、遍历以及链表的分解和归并等操
作。并能够设计出实现线性表其它运算的算法。
8.从时间复杂度和空间复杂度的角度综合比较线性表在顺序和链式两种存储结构下的特 点,即其各自适用的场合。
小结:
顺序表和链表的比较 通过对它们的讨论可知它们各有优缺点,顺序存储有三个优点:
(1)方法简单,各种高级语言中都有数组,容易实现。
(2)不用为表示结点间的逻辑关系而增加额外的存储开销。
(3)顺序表具有按元素序号随机访问的特点。 但它也 有两个缺点:
(1)在顺序表中做插入删除操作时,平均移动大约表中一半的元素,因此对n较大的顺序 表效率低。
(2)需要预先分配足够大的存储空间,估计过大,可能会导致顺序表后部大量闲置;预 先分配过小,又会造成溢出。
链表的优缺点恰好与顺序表相反。 在实际中怎样选取存储结构呢?
(1)基于存储的考虑 对线性表的长度或存储规模难以估计时,不宜采用顺序表;链表 不用事先估计存储 规模,但链表的存储密度较低,显然链式存储结构的存储密度是 小于1的。
(2)基于运算的考虑 在顺序表中按序号访问ai的时间性能时O(1),而链表中按序号访问的时间性能 O(n),所以如果经常做的运算是按序号访问数据元素,显然顺序表优于链表;而在 顺序表中做插入、删除时平均移动表中一半的元素,当数据元素的信息量较大且表较 长时,这一点是不应忽视的;在链表中作插入、删除,虽然也要找插入位置,但操作 主要是比较操作,从这个角度考虑显然后者优于前者。
(3)基于环境的考虑 顺序表容易实现,任何高级语言中都有数组类型,链表的操作是 基于指针的,相对 来讲前者简单些,也是用户考虑的一个因素。 总之,两种存储结 构各有长短,选择那一种由实际问题中的主要因素决定。通常“较稳
定”的线性表选择顺序存储,而频繁做插入删除的即动态性较强的线性表宜选择链式存储。

练习题:

(一)选择题: 1.以下那一个术语与数据的存储结 构无关?(    A    )


A.程序        B.问题求解步骤的描述 C.要满足五个基本特性    D.A 和 C. 3、数据结构 中,与所使用的计算机无关的是数据的( C    )
A.存储结构    B.物理结构    C.逻辑结构    D.物理结构和存储结构
 
4. 算法的计算量的大小称为计算的(    B    )。
A.效率    B.复杂性    C.现实性    D.难度 5.下列说法,不正确的是(D)。
A.数据元素是数据的基本单位 B.数据项是数据 中不可分割的最小可标识单位 C.数据可由若干 个数据元素构成 D.数据项可由若干个数据元素 构成
6.连续存储设计时,存储单元的地址(    A    )。
A.一定连续    B.一定不连续
C.不一定连续    D.部分连续,部分不连续
7.    线性表( a1,a2,…,an)以链接方式存储时,访问第 i 位置元素的时间复杂性为(    C
)。
A.O(i)    B.O(1)    C.O(n)    D.O(i-1)
8.    对于顺序存储的线性表,访问结点和增加、删除结点的时间复杂度为( C    )。
A.O(n)    O(n)    B. O(n)    O(1)
C. O(1)    O(n)    D. O(1)    O(1)
9.    设单链表中结点的结构为(data,link)。已知指针 q 所指点是指针 p 所指结点的直接 前驱,若在*q 与*p 之间插入结点*s,则应执行下列哪一个操作?(    B    )。 A.s-
>link=p->link;p->link=s B.q->link=s;s->link=p C.p->link=s->link;s-
>link=p D.p->link=s;s->link=q
10.  在一个长度为 n 的顺序表的表尾插入一个新元素的渐进时间复杂度为( B )。
A.O(n)    B.O(1)
C.O(n2)    D.O(log2n)
11. 表长为 n 的顺序存储的线性表,当在任何位置上插入一个元素的概率相等时,插入一 个元素所需移动元素的平均个数为( B )
A.n    B. n/2
C. (n-1)/2    D. (n+1)/2
12. 循环链表的主要优点是( D )
A.不再需要头指针了。 B.已知某个结点的位置后,能很容易找到它的直接前驱结 点。 C.在进行删除操作后,能保证链表不断开。 D.从表中任一结点出发都能遍历 整个链表。

(二)应用题 1、按增长率由小至大排列以

 
下 7 个函数。
(2)n、( 3)n、2100 、log log
 

n
、log
 


、(log
 

n
)2    、n
 
2
3    2    2    2    2
 
n
答:(2)n、2100 、loglog 2
 
n
、log
 
、(log  )2    、n、(3)n
 
3    2    2    2    2
2、数据的存储结构由哪四种基本的存储方法实现,并做以简要说明? 答
:四种表示方法
(1)顺序存储方式。数据元素顺序存放,每个存储结点只含一个元素。存储位置反映数 据元素间的逻辑关系。存储密度大,但有些操作(如插入、删除)效率较差。
(2)链式存储方式。每个存储结点除包含数据元素信息外还包含一组(至少一个)指针。 指针反映数据元素间的逻辑关系。这种方式不要求存储空间连续,便于动态操作(如插入、 删除等),但存储空间开销大(用于指针),另外不能折半查找等。
(3)索引存储方式。除数据元素存储在一地址连续的内存空间外,尚需建立一个索引表, 索引表中索引指示存储结点的存储位置(下标)或存储区间端点(下标),兼有静态和动 态 特性。
(4)散列存储方式。通过散列函数和解决冲突的方法,将关键字散列在连续的有限的 地 址空间内,并将散列函数的值解释成关键字所在元素的存储地址,这种存储方式称为 散列 存储。其特点是存取速度快,只能按关键字随机存取,不能顺序存取,也不能折半 存取。

3. 线性表有两种存储结构:一是顺序表,二是链表。试问:
(1)如果有 n 个线性表同时并存,并且在处理过程中各表的长度会动态变化,线性 表 的总数也会自动地改变。在此情况下,应选用哪种存储结构? 为什么?
(2)若线性表的总数基本稳定,且很少进行插入和删除,但要求以最快的速度存取 线 性表中的元素,那么应采用哪种存储结构?为什么?
答:
(1)选链式存储结构。它可动态申请内存空间,不受表长度(即表中元素个数)的影 响
,插入、删除时间复杂度为 O(1)。
(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(LinkList 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)。

3.已知指针 la 和 lb 分别指向两个无头结点的单链表中的首结点。请编写函数完成从表 la 中删除自第 i 个元素开始的共 len 个元素并将它们插入到表 lb 中第 j 个元素之前,若 lb 中只有 j-1 个元素,则插在表尾。函数原型如下:
int DeleteAndInsertSub(LinkList &la,LinkList &lb,int i,int j,int len);


相关话题/数据结构