第1章绪论
一、选择题
1. 算法的时间复杂度取决于( C )
A.问题的规模      B. 待处理数据的初态      C. A和B
2.计算机算法指的是(C),它必须具备(B)这三个特性。
(1) A.计算方法    B. 排序方法    C. 解决问题的步骤序列    D. 调度方法
(2) A.可执行性、可移植性、可扩充性    B. 可执行性、确定性、有穷性
C. 确定性、有穷性、稳定性
D. 易读性、稳定性、安全性
3.从逻辑上可以把数据结构分为( C )两大类。
A.动态结构、静态结构      B.顺序结构、链式结构
C.线性结构、非线性结构    D.初等结构、构造型结构
4.以下与数据的存储结构无关的术语是( D  )。
A.循环队列      B. 链表        C. 哈希表          D.  栈
5.在下面的程序段中,对x的赋值语句的频度为( C )
FOR i:=1  TO  n  DO
FOR j:=1  TO  n  DO
x:=x+1;
A. O(2n)      B.O(n)      C.O(n2)        D.O(log2n)
6.连续存储设计时,存储单元的地址( A )。
A.一定连续  B.一定不连续  C.不一定连续  D.部分连续,部分不连续
二、判断题
1. 数据元素是数据的最小单位。( F ) (数据项)
2. 记录是数据处理的最小单位。 (  F )(数据项)
3.数据的物理结构是指数据在计算机内的实际存储形式。( T )【山东师范大学2001 一、2(2分)】
4. 在顺序存储结构中,有时也存储数据结构中元素之间的关系。( F )
5. 顺序存储方式的优点是存储密度大,且插入、删除运算效率高。( F )
三、填空
1.数据的物理结构包括的表示和的表示。(数据元素)(关系)
2. 对于给定的n个元素,可以构造出的逻辑结构有(1),(2),(3),_(4)四种。
(数组,栈,线性表,队列)
3.数据的逻辑结构是指。
4.一个数据结构在计算机中称为存储结构。
5.数据结构中评价算法的两个重要指标是
6.已知如下程序段
FOR i:= n DOWNTO    1 DO {语句1}
BEGIN
x:=x+1;{语句2}
FOR j:=n DOWNTO i DO {语句3}
y:=y+1; {语句4}
END;
语句1执行的频度为(1);语句2执行的频度为(2);语句3执行的频度为(3);语句4执行的频度为(4)。
答案:1.数据元素数据元素间关系      2.集合线性结构树形结构图状结构或网状结构。3.数据的组织形式,即数据元素之间逻辑关系的总体。而逻辑关系是指数据元素之间的关联方式或称“邻接关系”。4.
表示(映像)。5.时间复杂度和空间复杂度。
6.(1)n+1  (2)n  (3)n(n+3)/2  (4)n(n+1)/2。
四、应用题
1. 数据元素之间的关系在计算机中有几种表示方法?各有什么特点?
四种表示方法
(1)顺序存储方式。数据元素顺序存放,每个存储结点只含一个元素。存储位置反映数据元素间的逻辑关系。存储密度大,但有些操作(如插入、删除)效率较差。
(2)链式存储方式。每个存储结点除包含数据元素信息外还包含一组(至少一个)指针。指针反映数据元素间的逻辑关系。这种方式不要求存储空间连续,便于动态操作(如插入、删除等),但存储空间开销大(用于指针),另外不能折半查等。
(3)索引存储方式。除数据元素存储在一地址连续的内存空间外,尚需建立一个索引表,索引表中索引指示存储结点的存储位置,兼有静态和动态特性。
(4)散列存储方式。通过散列函数和解决冲突的方法,将关键字散列在连续的有限的地址空间内,并将散列函数的值解释成关键字所在元素的存储地址,这种存储方式称为散列存储。其特点是存取速度快,只能按关键字随机存取,不能顺序存取,也不能折半存取。2.若有100个学生,每个学生有学号,姓名,平均成绩,采用什么样的数据结构最方便,写出这些结构?【山东师范大学 1996 二、2】
将学号、姓名、平均成绩看成一个记录(元素,含三个数据项),将100个这样的记录存于数组中。因一般无增删操作,故宜采用顺序存储。
typedef struct
{int num;//学号
char name[8];//姓名
float score;/平均成绩
}node;
node student[100];
第2章线性表
一选择题
1.线性表是具有n个(数据元素)的有限序列(n>0)。
2.若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用(顺序表)存储方式最节省时间。
3.某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用(仅有尾指针的单循环链表)存储方式最节省运算时间。
4.设一个链表最常用的操作是在末尾插入结点和删除尾结点,则选用( D )最节省时间。
A. 单链表
B.单循环链表
C. 带尾指针的单循环链表
D.带头结点的双循环链表
5.若某表最常用的操作是在最后一个结点之后插入一个结点或删除最后一个结点。则采用( D )存储
方式最节省运算时间。
A.单链表      B.双链表    C.单循环链表    D.带头结点的双循环链表
6. 链表不具有的特点是( B  )
A.插入、删除不需要移动元素  B.可随机访问任一元素
C.不必事先估计存储空间  D.所需空间与线性长度成正比
7. 下面的叙述不正确的是(  BC  )
A.线性表在链式存储时,查第i个元素的时间同i的值成正比
B. 线性表在链式存储时,查第i个元素的时间同i的值无关
C. 线性表在顺序存储时,查第i个元素的时间同i 的值成正比
D. 线性表在顺序存储时,查第i个元素的时间同i的值无关
8. 若长度为n的线性表采用顺序存储结构,在其第i个位置插入一个新元素的算法的时间复杂度为(  C  )(1<=i<=n+1)。
A. O(0)
B. O(1)
C. O(n)
D. O(n2)
9. 对于顺序存储的线性表,访问结点和增加、删除结点的时间复杂度为( C  )。
A.O(n)  O(n)      B. O(n)  O(1)      C. O(1)  O(n)        D. O(1) O(1) 10.线性表( a1,a2,…,an)以链接方式存储时,访问第i位置元素的时间复杂性为( C  )A.O(i)      B.O(1)      C.O(n)      D.O(i-1)
11.非空的循环单链表head的尾结点p↑满足(  A  )。
A.p↑.link=head      B.p↑.link=NIL        C.p=NIL    D.p= head 12.完成在双循环链表结点p之后插入s的操作是( D  );
A. p^.next:=s ; s^.priou:=p; p^.next^.priou:=s ; s^.next:=p^.next;
B. p^.next^.priou:=s; p^.next:=s; s^.priou:=p; s^.next:=p^.next;
C. s^.priou:=p; s^.next:=p^.next; p^.next:=s; p^.next^.priou:=s ;
D. s^.priou:=p; s^.next:=p^.next; p^.next^.priou:=s ; p^.next:=s;
14.对于一个头指针为head的带头结点的单链表,判定该表为空表的条件是(B  )A.head==NULL  B.head→next==NULL    C.head→next==head  D.head!=NULL
二、判断
2. 顺序存储结构的主要缺点是不利于插入或删除操作。( T )
3.线性表采用链表存储时,结点和结点内部的存储空间可以是不连续的。(  T  )
4.顺序存储方式插入和删除时效率太低,因此它不如链式存储方式好。(  F  )
5. 对任何数据结构链式存储结构一定优于顺序存储结构。( F )
6.顺序存储方式只能用于存储线性结构。( F  )
7.集合与线性表的区别在于是否按关键字排序。(  F  )
9. 线性表的特点是每个元素都有一个前驱和一个后继。(  F  )
10. 取线性表的第i个元素的时间同i的大小有关. ( F  )
11. 循环链表不是线性表. (  F  )
12. 线性表只能用顺序存储结构实现。( F  )
13. 线性表就是顺序存储的表。(  F  )
14.为了很方便的插入和删除数据,可以使用双向链表存放数据。( T  )
三、填空
1.线性表L=(a1,a2,…,an)用数组表示,假定删除表中任一元素的概率相同,则删除一个元素平均需要移动元素的个数是((n-1)/2)。
数据结构与算法考研真题2.设单链表的结点结构为(data,next),next为指针域,已知指针px指向单链表中data 为x的结点,指针py指向data为y的新结点 , 若将结点y插入结点x之后,则需要执行以下语句: (py->next=px->next; px->next=py);
3.在单链表中设置头结点的作用是(主要是使插入和删除等操作统一,在第一个元素之前插入元素和删除第一个结点不必另作判断)。
4.顺序存储结构是通过(物理上相邻)表示元素之间的关系的;链式存储结构是通过(指针)表示元素之间的关系的。
5. 带头结点的双循环链表L中只有一个元素结点的条件是:(L->next->next==L)
6. 在单链表L中,指针p所指结点有后继结点的条件是:(p->next!=null)
7.带头结点的双循环链表L为空表的条件是:(L->next==L && L->prior==L)。
四应用题
1.链式存储结构一般说克服了顺序存储结构的三个弱点。首先,插入、删除不需移动元素,只修改指针,时间复杂度为O(1);其次,不需要预先分配空间,可根据需要动态申请空间;其三,表容量只受可用内存空间的限制。其缺点是因为指针增加了空间开销,当空间不允许时,就不能克服顺序存储的缺点。
2. 线性表的链式存储结构中,头指针与头结点之间的根本区别;头结点与首元结点的关系。在线性表的
链式存储结构中,头指针指链表的指针,若链表有头结点则是链表的头结点的指针,头指针具有标识作用,故常用头指针冠以链表的名字。头结点是为了操作的统一、方便而设立的,放在第一元素结点之前,其数据域一般无意义(当然有些情况下也可存放链表的长度、用做监视哨等等),有头结点后,对在第一元素结点前插入结点和删除第一结点,其操作与对其它结点的操作统一了。而且无论链表是否为空,头指针均不为空。首元结点也就是第一元素结点,它是头结点后边的第一个结点。
3. 设单链表中某指针p所指结点(即p结点)的数据域为data,链指针域为next,请写出在p结点之前插入s结点的操作。(若头节点未知,则后插交换)
设单链表的头结点的头指针为head,且pre=head;
while(pre->next!=p) pre=pre->next;
s->next=p; pre->next=s;
4.设双向循环链表中结点的数据域、前驱和后继指针域分别为data,pre和next,试写出在指针p 所指结点之前插入一s结点的算法。
五、算法设计题
1.假设有两个按元素值递增次序排列的线性表,均以单链表形式存储。请编写算法将这两个单链表归并为一个按元素值递减次序排列的单链表,并要求利用原来两个单链表的结点存放归并后的单链表。
LinkedList Union(LinkedList la,lb)
∥la,lb分别是带头结点的两个单链表的头指针,链表中的元素值按递增序排列,本算法将两链表合并成一个按元素值递减次序排列的单链表。
{ pa=la->next; pb=lb->next;∥pa,pb分别是链表la和lb的工作指针
la->next=null;          ∥la作结果链表的头指针,先将结果链表初始化为空。
while(pa!=null && pb!=null) ∥当两链表均不为空时作
if(pa->data<=pb->data)
{ r=pa->next;          ∥将pa 的后继结点暂存于r。
pa->next=la->next;    ∥将pa结点链于结果表中,同时逆置。
la->next=pa;
pa=r; }              ∥恢复pa为当前待比较结点。
else
{r=pb->next;∥将pb 的后继结点暂存于r。
pb->next=la->next; ∥将pb结点链于结果表中,同时逆置。
la->next=pb;
pb=r; }∥恢复pb为当前待比较结点。
while(pa!=null) ∥将la表的剩余部分链入结果表,并逆置。
{r=pa->next; pa->next=la->next; la->next=pa; pa=r; }
while(pb!=null)
{r=pb->next; pb->next=la->next; la->next=pb; pb=r; }
}∥算法Union结束。
[算法讨论]上面两链表均不为空的表达式也可简写为while(pa&&pb),两递增有序表合并成递减有序表时,上述算法是边合并边逆置。也可先合并完,再作链表逆置。后者不如前者优化。算法中最后两个while语句,不可能执行两个,只能二者取一,即哪个表尚未到尾,就将其逆置到结果表中,即将剩余结点依次前插入到结果表的头结点后面。
2. 已知头指针分别为la和lb 的带头结点的单链表中,结点按元素值非递减有序排列。写出将la 和 lb两链表归并成一个结点按元素值非递减有序排列的单链表(其头指针为 lc),并计算算法的时间复杂度。(课本31页)
本题与上题类似,要求结果指针为lc,其核心语句段如下:
pa=la->next;pb=hb->next;
lc=(LinkedList )malloc(sizeof(LNode));
pc=lc;∥pc是结果链表中当前结点的前驱
while(pa&&pb)
if(pa->data<pb->data)
{pc->next=pa;pc=pa;pa=pa->next;}
else {pc->next=pb;pc=pb;pb=pb->next;}
if(pa)pc->next=pa; else pc->next=pb;
free(la);free(lb);∥释放原来两链表的头结点。
算法时间复杂度为O(m+n),其中m和n分别为链表la和lb的长度。
3. 已知递增有序的两个单链表A,B分别存储了一个集合。设计算法实现求两个集合的交集的运算A:=A∩B
本题是求交集,即只有同时出现在两集合中的元素才出现在结果表中。核心语句段如下:pa=la->next;pb=lb->next;∥设工作指针pa和pb;
pc=la;∥结果表中当前合并结点的前驱的指针。
while(pa&&pb)
if(pa->data==pb->data)∥交集并入结果表中。
{ pc->next=pa;pc=pa;pa=pa->next;
u=pb;pb=pb->next;free(u);}
else if(pa->data<pb->data) {u=pa;pa=pa->next;free(u);}
else {u=pb; pb=pb->next; free(u);}
while(pa){ u=pa; pa=pa->next; free(u);}∥释放结点空间
while(pb) {u=pb; pb=pb->next; free(u);}∥释放结点空间
pc->next=null;∥置链表尾标记。
4. 已知长度为n的线性表A采用顺序存储结构,请写一时间复杂度为0(n)、空间复杂度为0(1)的算法,该算法删除线性表中所有值为item的数据元素。
[题目分析] 在顺序存储的线性表上删除元素,要涉及到一系列元素的移动(删第i个元素,第i+1至第n个元素要依次前移)。本题要求删除线性表中所有值为item的数据元素,并未要求元素间的相对位置不变。因此可以考虑设头尾两个指针(i=1,j=n),从两端向中间移动,凡遇到值item的数据元素时,直接将右端元素左移至值为item的数据元素位置。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。