数据结构-线性表习题及解析

数据结构-线性表习题及解析
数据结构-线性表习题及解析

线性表典型例题

一、单项选择题

[例7-1]在数据结构中,与所使用计算机无关的数据叫( ①)结构;链表是一种采用( ②)存储结构存储的线性表;链表适用于( ③)查找;在链表中进行( ④)操作的效率比在线性表中进行该操作的效率高。

①A.存储B.物理C.逻辑D.物理和逻辑

②A.顺序B.网状C.星式D.链式

③A.顺序B.二分法C.顺序及二分法D.随机

④A.二分法查找B.快速查找C.顺序查找D.插入

解析:本题考查的是基本概念。本题答案为:①C;②D;③A;④D。

[例7-2] 链表不具备的特点是( )。

A.插入和删除不需要移动元素B.可随机访问任一结点

C.不必预分配空间D.所需空间与其长度成正比

解析:线性表可随机访问任一结点,而链表必须从第一个数据结点出发逐一查找每个结点。本题答案为:B。

[例7-3] 不带头结点的单链表head为空的判定条件是( )。

A.head==NULL B.head_>next==NULL

C.head_>next==head D.head!=NULL

解析:在不带头结点的单链表head中,head指向第一个数据结点。空表即该表没有结点,head==NULL表示该单链表为空。本题答案为:A。

[例7-4] 带头结点的单链表head为空的判定条件是( )。

A.head==NULL B.head—>next==NULL

C.head—> next==head D.head!=NULL

解析:在带头结点的单链表head中,head指向头结点。空表即该表只有头结点,head —>next==NULL表示该单链表为空。本题答案为:B。

[例7-5] 带头结点的循环单链表head中,head为空的判定条件是( )。

A.head==NULL B.head—>next==NULL

C.head—> next==head D.head!=NULL

解析:在带头结点的循环单链表head中,head指向头结点。空表即该表只有头结点,head—>next==head表示该单链表为空。本题答案为:C。

[例7-6] 线性表采用链式存储时其存储地址( )。

A.必须是连续的B.部分地址必须是连续的

C.一定是不连续的D.连续不连续都可以

解析:链式存储采用动态存储,地址一般不连续。本题答案为:D。

[例7-7] 在双向链表的* p结点前插入新结点*s的操作为( )。

A.p—>prior=s;s—>next=p;p—>prior—>next=s;s—>prior=p—>prior;

B.p—>prior=s;p—>prior—>next=s;s—>next=p;s—>prior=p—>prior;

C.s—>next=p;s—>prior=p—>prior;p—>prior=s;p—>prior—>next=s;

D.s—>next=p;s—>prior=p—>prior;p—>prior—>next=s;p—>prior=s;

解析:在双向链表的* p结点前插入新结点* s的操作如图7.12所示,图中虚线为所作的操作,序号为操作顺序。本题答案为:D。

图7.12 双向链表插入结点的过程示意图

(例7-8)若某表最常用的操作是在最后一个结点后插入一个结点和删除第一个结点,则采用( )存储方式最节省运算时间。

A.单链表B.双向链表

C.给出表头指针的循环单链表D.给出尾指针的循环单链表

解析:在链表中插入或删除一个结点,需修改相邻结点的指针域。上述四个选项中,只有选项D才能从尾指针经过最少的结点来进行题目要求的插入或删除操作。本题答案为:D。

[例7-9] 若线性表中有2n个元素,算法( )在单链表上实现要比在顺序表上实现效率更高。

A.删除所有值为x的元素B.在最后一个元素的后面插入一个新元素C.顺序输出前k个元素D.交换其中某两个元素的值

解析:对于选项A,在单链表上和顺序表上实现的时间复杂度都为O(n),但后者要移动大量的元素,因此在单链表上实现效率更高。本题答案为:A。

(例7-10) 在长度为n的( )上,删除第一个元素,其算法复杂度为O(n)。

A.只有表头指针的不带头结点的循环单链表

B.只有尾指针的不带表头结点的循环单链表

C.只有表尾指针的带头结点的循环单链表

D.只有尾指针的带表头结点的循环单链表

解析:本题答案为:A。具体算法如下:

linklist * delfirst(linklist * h)

{

Linklist * p=h;

while(p—> next!=h) //找到表尾结点

p=p—>next;

p—>next=h—> next;

free(h);

returnp一>next;//返回头指针

}

二、填空题

[例7-11] 在单链表中结点* p后插入结点* s的指令序列为;。

解析:在单链表中结点* p后插入结点* s,即将* p 的后继结点变为* s 的后继结点,* s 则成为* p的后继结点。操作指令序列为:s—>next=p—>next;p—>next=s。

[例7-12]在线性表的链式存储结构中,根据每个结点所含指针的个数,链表可分为和;而根据指针的链接方式,链表又可分为和。

解析:本题答案为:单链表;多重链表;循环链表;普通链表(非循环链表)。

[例7-13] 在单链表中,要删除某一个指定的结点,必须找到该结点的 结点。 解析:由单链表的特点可知,删除某一个结点的操作是将其前驱结点的next 指针域指 向该结点的后继结点。本题答案为:前驱。

[例7-14] 在一个长度为n 的顺序表中删除第i(0≤i ≤n 一1)个元素,需向前移动 个元素。

解析:需将第i 个元素后的元素依次前移一个位置,总共移动(n-1)-(i+1)+1个元素。本题答案为:n-i-1。

[例7-15] 在一个具有n 个结点的单链表,在 * p 结点后插入一个新结点的时间复杂度是 ;在给定值为x 的结点后插入一个新结点的时间复杂度是 。

解析:在 * p 结点后插入一个新结点 * s 的操作是:s —> next =p —> next ;p —>next = s ;其时间复杂度为0(1)。

在给定值为x 的结点后插入一个结点,首先要找到该结点,然后再进行插入。找到该 结点的时间复杂度为O(n),插入的时间复杂度为O(1)。本题答案为:O(1);O(n)。

三、应用题

(例7-16) 设A 是一个线性表(a 0,a 1,…,a i ,…,a n-1),采用顺序存储结构,则在等概率情况下平均每插入一个元素需要移动的元素个数是多少?若元素插在a i 和a i+1之间 (0≤i ≤n-1)的概率为1(1)/2

n n n -+,则平均每插入一个元素所需要移动的元素个数是多少?

解析:在等概率情况下,平均每插入一个元素需要移动的元素个数为:

(012)12

n n n ++++=+ 若元素插在a i 和a i+l 之间(0≤i ≤n-1)的概率为

(1)/2n i n n -+,则平均每插入一个元素所需 要移动的元素个数为:

10n i -=∑2222()221(1)1(1)/2(1)3

n i n n n n n n n -+??=+-++=??++ (例7-17) 简述线性表采用顺序存储方式和链式存储方式的优缺点。

解析:顺序表的优点是可以随机访问数据元素,而且不需要额外的空间存储元素间的逻辑关系;缺点是表的大小固定,增减结点需要移动大量元素。链表的优点是增减元素非常方便,只需要修改指针内容;缺点是只能进行顺序访问,另外在每个结点上增加指针域会造成存储空间增大。

[例7-18] 若频繁地对一个线性表进行插入和删除操作,则应采用何种存储结构来存储该线性表?为什么?

解析:应采用链式结构来存储该线性表。采用链式存储结构来存储线性表,在进行插 入和删除操作时的复杂度体现在查找插入或删除结点的前驱结点的操作上,查找过程中平 均移动指针域的次数为表长的一半;而采用顺序存储结构存储线性表,在进行插入和删除 操作时的复杂度则体现在元素的移动上,平均需移动表中的一半元素。因为指针域的移动 操作次数比元素的移动操作次数少得多,所以应采用链式结构来存储该线性表。

(例7—19) (1)写出在双向链表中的结点 * p 前插入一个结点 *s 的语句序列。

(2)写出判断带头结点的双向循环链表L 为空表的条件。

解析:(1)s —>prior =p —>prior ;p —>prior — >next =s ;

s —>next =p ;p —>prior =s ;

(2)(L==L—>next)&&(L==L—>prior)

[例7-20] 链表所表示的元素是否是有序的?如果有序,则有序性体现在何处?链表所表示的元素是否一定要在物理上是相邻的?有序表的有序性又如何理解?

解析:链表所表示的元素是有序的,其有序性体现在逻辑有序,即指针有指向。链表所表示的元素在物理上不一定相邻。有序表的有序性不仅在逻辑结构上有序,而且在物理结构上也有序。

四、算法设计题

(例7-21)编写一个算法,将一个带头结点的单链表逆转。要求在原链表空间上进行逆转,即不允许构造新的链表结点;

解析:从单链表的一种构造方法——头插法中可以得知,该方法构造的线性表中结点的顺序与插人次序相反。因此我们可以将表结点从前往后逐个拆下并用头插法插人新表,所构造的单链表即为原表的逆转。

具体算法如下:

linklist * reverse(1inklist * h)

{

linklist * p,*q,*r;

p=h—>next;

h—>next=NULL;//构造空表

while(p!=NULL)

{

q=p;//拆下结点

p=p—> next;

q—>next=h—>next;//用头插法插入

h—>next=q;

}

return h;

}

(例7-22) 已知一个顺序表La的元素按值非递减有序,编写一个算法将元素x插人后保持该表仍然按值非递减有序。

解析:要让插入新元素后的顺序表仍然按值非递减有序,必须把x插入到表中第一个大于等于x的元素之前。应先在表中找到该位置,然后后移该元素,空出一个位置,再将x 插入。

具体算法如下:

insert(sqlist *La,datatype x) //La为指向顺序表的指针

{

int i=0,j;

while(i<= La—>last) //查找插入位置i

{

if(x<=La—>data[i])

break;

i++;

}

for(j=La—>last+1;j>i;j--) //后移所有大于等于x的元素

La—>data[j]=La—>data[j-1];

La—>data[i]=x;//将x插入

La—>last++;//表长度加1

}

(例7-23)用顺序表A、B表示集合,编写算法求集合A和集合B的交集C(假设A、B 表内无重复元素)。’

解析:求C=A∩B,C中元素是A、B中的公共元素。对于表A中的每个元素,在表B中扫描,若有与它相同的元素,则为交集元素,将其放到C中。

具体算法如下:

intersection(sqlist A,sqlist B,sqlist * C)

{

int i,j,k=0;

for(i=0;i<=A.1ast;i++)

{

j=0;

while(j<=B.1ast&& A.dara[i]!=B.data[j]

j++;

if(j<=B.1ast) //表示A.data[i]在B中

C—>data[k++]=A.data[i]

}

C—>last=k—l;//修改表长度

}

[例7-24]编写一个算法,计算在头指针为head的单链表中数据域值为x的结点个数。

解析:先设一计数器n,初值为0。然后遍历链表中的每个结点,每遇到一个结点都需要判断其数据域值是否为x,如果是,计数器n加1。遍历完成后计数器n的值就是所求的结点数。

具体算法如下:

int count(linklist * head, datatype x)

{

int n=0;

linklist * p;

p = head;

while(p ! = NULL)

{

if(p—> data = = x)

n++;

p=p—>next;

}

return n;

}

(例7-25)用单链表La、Lb表示集合A、B,编写算法求集合A和集合B的差集C,并用链表Lc表示(假设A、B内无重复元素)。

解析:根据集合运算规则可知,集合A—B中包含所有属于集合A而不属于集合B的元素。具体做法是:从头到尾扫描单链表La,并判断当前元素是否在单链表Lb中;若不

在,则将其插入单链表Lc中。

具体算法如下:

linklist * difference(linklist * La, linklist * Lb)

{

linklist *Lc, * pa, *pb, * s, * r;

pa= La—>next

Lc = (linklist * ) malloc (sizeof (linklist)) ;

r=Lc;

while(pa! = NULL)

{

pb=Lb—> next;

while (phb! = NULL & & pb—> data ! = pa—> data)

pb= pb—>next;

if(pb = = NULL)

{

s= (linklist * )malloe(sizeof(linklist));

s—> data= pa—>data;

r—>next=s;

r—s;

}

pa= pa—>next;

}

r—>next = NULL;

return Lc;

}

(例7-26) 已知两个头指针分别为La和Lb的单链表,它们的元素按值递增有序。编写一算法将两个单链表合并,要求合并后链表仍然递增有序,不允许开辟另外的链表空间。

解析:由于题目要求不开辟另外的链表空间,所以首先以两个链表中的一个头结点为新链表的头结点构造一个空的单链表。从头到尾逐个比较La和Lb表中的元素,将值较小的元素结点链接到新表的末尾,若结点值相同则将其中一个链接到新表的末尾而释放另一个。当La或Lb为空后,把另一个链表余下的结点链接到新表的末尾。

具体算法如下:

linklist * union(linklist * La, linklist * Lb)

{

linklist * pa, * pb, * r;

pa = La—> next;

pb= Lb—>next;

r=La;//以*La为新表头结点,r为新表尾指针

free(Lb); //释放Lb表头结点

while(pa! =NULL && pb! =NULL)

{

if ( pa—> data< pb—> data)

{

r=pa;

pa= pa—>next;

}

else if(pa—>datadata)

{

r—> next = pb;

r=pb;

pb = pb—> next;

r—>next= pa;

}

else //pa->data = = Pb—>data的情况

{

r=pa;//将原La表结点插入,原Lb表结点删除

pa = pa—> next;

s=pb;

pb = pb—>next;

free(s);

}

}

if(pa==NULL) //将Lb表剩余结点链到新表

r—>next=pb;

return La;//返回新表头结点地址

}

(例7-27) 设计——个将循环双链表中结点*p与其后继结点交换位置的算法。解析:本题应充分利用双向链表可对前驱结点和后继结点进行操作的特点。

具体算法如下:

int swap(dlinklist * p)

{

dlinklist * q;

if(p—>next= = p—>prior) //只有一个数据结点,不能交换

return 0;//交换失败

q=p—>next;//q指向* p的后继

p—>next=q—>next;//删除* q

q—>next—>prior= p;

q—>prior= p—>prior;//把*q插入*p前

q—>next=p;

p—>prior—>next=q;

p—>prior=q;

return 1;//交换成功

}

线性表习题

一单项选择题

1.下面关于线性表的叙述中,错误的是[]

A.线性表采用顺序存储,必须占用一片连续的存储单元。

B.线性表采用顺序存储,便于进行插入和删除操作。

C.线性表采用链接存储,不必占用一片连续的存储单元。

D.线性表采用链接存储,便于进行插入和删除操作。

2.带头结点的双向链表head为空的判定条件是[]

A.head==NULL

B.head->next==NULL

C.head->next==head

D.head!=NULL

3.若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用[]存储方式最节省时间

A.顺序表 B.双链表 C 带头结点的双循环链表 D 单循环链表

4.链表不具有的特点是[]

A 插入和删除不需要移动元素

B 可随机访问任一元素

C 不必事先估计存储空间

D 所需空间与线性长度成正比

5.下面叙述中不正确的是[]

A 线性表在链式存储时,查找第i个元素的时间与i的值成正比

B线性表在链式存储时, 查找第i个元素的时间必须经过前i-1个元素

C 线性表在顺序存储时,查找第i个元素的时间与i的值成正比

D线性表在顺序存储时,查找第i个元素的时间与i的值无关

6对于顺序存储的线性表,访问结点和增加,删除结点的时间复杂度分别是

A O(n), O(n)

B O(n), O(1)

C O(1) O(n)

D O(1) O(1)

7 在一个以h为头指针的单循环链表中,p指针指向链尾的条件是

A p->next=h

B p->next=NULL

C p->next->next=h

D p->data=-1

8在单链表指针为p的结点之后插入指针为s的结点,正确的操作是

A p->next=s;s->next= p->next

B s->next= p->next; p->next=s

C p->next=s; p->next=s->next

D p->next=s->next; p->next=s

9 在双向链表存储结构中,删除p所指的结点时的操作是

A p->prior->next=p->next;p->next->prior=p->prior

B p->prior= p->prior->prior; p->prior->next=p

C p->next->prior=p; p->next= p->next->next

D p->next= p->prior->prior; p->prior= p->next->next

10 需要分配较大空间,插入和删除不需要移动元素的线性表,其存储结构是

A 单链表

B 静态链表

C 线性链表

D 顺序存储结构

11如果最常用的操作是取第i个结点及其前驱,则采用[]存储方式最节省时间

A 单链表

B 双链表

C 单循环链表

D 顺序表

12 在一个长度n(n>1)的单链表上设有头和尾两个指针,执行[]操作与链表

的长度有关

A 删除单链表中第一个元素结点

B删除单链表中最后一个元素结点

C 在单链表第一个元素结点前插入一个新结点

D 在单链表最后一个元素结点后插入一个新结点

13 与单链表相比,双链表的优点之一是

A插入和删除操作更简单 B 可以进行随机访问

C 可以省略头指针和表尾指针

D 访问相邻结点更灵活

14 设有两个长度为n的单链表,结点类型相同,若以h1为表头指针的链表是非循环链表,以h2为表头指针的链表是循环链表,则

A 对于两个链表来说,插入任意一个结点的操作,其时间复杂度是O(1) B对于两个链表来说,删除最后一个结点的操作,其时间复杂度是O(n)

C h2要比h1占用更多的存储空间

D h1和h2是不同类型的变量

二.判断题

1链表中的头结点仅起到标识的作用

2 顺序存储结构的主要缺点之一是不利于插入和删除操作

3 线性表采用链表存储时,结点和结点内部的存储空间可以是不连续的

4 顺序存储方式的插入和删除操作效率太低,因此它不如链式存储方式好

5 顺序存储方式只能用于存储线性结构

6 线性表的特点是每个元素都有一个前驱和一个后继

7 取线性表的第i个元素的时间同i的大小有关

8 线性表只能用顺序存储结构实现

9 顺序存储方式的优点是存储密度大,且插入和删除运算效率高

10 链表是采用链式存储结构的线性表,进行插入和删除操作时,一般在链表中比在顺序存储结构中的效率高

三.填空题

1 当线性表的元素总数基本稳定,且很少进行插入和删除操作,但要求以最快的速度存取线性表中的元素时,应采用[ ]存储结构。

2 线性表L=(a1,a2,…,an)用数组表示,若删除表中任一元素的概率相同,则删除一个元素平均需要移动元素的个数是[ ]

3 已知指针px指向单链表中数据域值为x的结点,指针py指向数据域值为y的新结点,若将结点y插入结点x之后,则需要执行以下语句:[ ]

4 在一个长度为n的顺序表中的第i个元素(0<=i<=n-1)之前插入一个新元素时,需向后移动[ ]个元素

5 对于一个具有n个结点的单链表,在已知的结点*p后插入一个新结点的时间复杂度为[ ],在给定值为x的结点后插入一个新结点的时间复杂度为[ ]

6 链接存储的特点是利用[ ]来表示数据元素之间的逻辑关系。

7 对于双向链表,在两个结点之间插入一个新结点需修改的指针共为[ ]个,而对于单链表则为[ ]个。

8循环单链表的最大特点是:[ ]

9 带头结点的双循环链表L中只有一个元素结点的条件是:[ ]

10 在单链表L中,指针p所指结点有后继结点的条件是:[ ]

11 将一个单链表中的*p结点删除,可执行如下操作:

q=p->next; p->data=p->next->data;

p->next=[ ];

free(q);

C语言数据结构线性表的基本操作实验报告

实验一线性表的基本操作 一、实验目的与基本要求 1.掌握数据结构中的一些基本概念。数据、数据项、数据元素、数据类型和数据结构,以及它们之间的关系。 2.了解数据的逻辑结构和数据的存储结构之间的区别与联系;数据的运算与数据的逻辑结构的关系。 3.掌握顺序表和链表的基本操作:插入、删除、查找以及表的合并等运算。4.掌握运用C语言上机调试线性表的基本方法。 二、实验条件 1.硬件:一台微机 2.软件:操作系统和C语言系统 三、实验方法 确定存储结构后,上机调试实现线性表的基本运算。 四、实验内容 1.建立顺序表,基本操作包括:初始化,建立一个顺序存储的链表,输出顺序表,判断是否为空,取表中第i个元素,定位函数(返回第一个与x相等的元素位置),插入,删除。 2.建立单链表,基本操作包括:初始化,建立一个链式存储的链表,输出顺序表,判断是否为空,取表中第i个元素,定位函数(返回第一个与x相等的元素位置),插入,删除。 3.假设有两个按数据元素值非递减有序排列的线性表A和B,均以顺序表作为存储结构。编写算法将A表和B表归并成一个按元素值非递增有序(允许值相同)排列的线性表C。(可以利用将B中元素插入A中,或新建C表)4.假设有两个按数据元素值非递减有序排列的线性表A和B,均以单链表作为存储结构。编写算法将A表和B表归并成一个按元素值递减有序(即非递增有序,允许值相同)排列的线性表C。 五、附源程序及算法程序流程图 1.源程序 (1)源程序(实验要求1和3) #include #include #include #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 typedef struct arr {

数据结构线性表习题1

数据结构练习题1 指导老师:常璐璐 姓名:邢莉彬 学校:滨州学院 院系:信息工程学院软件技术

填空题 1. 对于一个n个结点的单链表,在表头插入元素的时间复杂度为_____O(1)_____,在表尾插入元素的时间复杂度为_____O(n)_____。 2. 删除非空线性链表中由q所指的链结点(其直接前驱结点由r指出)的动作时执行语句___r->link=q->link_______和______free(q)____。 结点结构为 typedef struct Node{ int value; node * link; }node; 3. 非空线性链表中,若要在由p所指的链结点后面插入新结点q,则应执行语句____ q->link=p->link;______和_____ p->link=q;_____。 结点结构为

typedef struct Node{ int value; node* link; }node; 4. 线性表L=(a1,a2,…,an)用数组表示,假定删除表中任一元素的概率相同,则删除一个元素平均需要移动元素的个数是_____(n-1)/2_____。 5. 在一个长度为n的顺序表中第i个元素(1≤i≤n)之前插入一个元素时,需向后移动_____ n-i+1_____ 个元素。 6.在具有n个链结点的链表中查找一个链结点的时间复杂度为O(_______n___)。

7. 线性表中的插入、删除操作,在顺序存储方式下平均移动近一半的元素,时间复杂度为_____O(n)_____;而在链式存储方式下,插入和删除操作的时间复杂度都是____O(1)______ 。 8. 若某线性表采用顺序存储结构,每个元素占4个存储单元,首地址为100,则第10个元素的存储地址为____136______。 选择题 1. 对于一个带头结点的单链表,头指针为head,判定该表为空的条件是________B__。 A. head==NULL B. head->next==NULL C. head->next==head D. head!=NULL 2. 将长度为m的线性链表链接在长度为n的线性链表之后的过程的时间复杂度若采用大O形式表示,则应该是______B____。 A.O(m) B.O(n) C.O(m+n) D.O(m-n) 3.在包含1000个数据元素的线性表中,实现如下4个操作所需要的执行时间最长的是______A____ 。

数据结构试题及答案

数据结构试题 一、单选题 1、在数据结构的讨论中把数据结构从逻辑上分为(C ) A 内部结构与外部结构 B 静态结构与动态结构 C 线性结构与非线性结构 D 紧凑结构与非紧凑结构。 2、采用线性链表表示一个向量时,要求占用的存储空间地址(D ) A 必须是连续的 B 部分地址必须是连续的 C 一定是不连续的 D 可连续可不连续 3、采用顺序搜索方法查找长度为n的顺序表时,搜索成功的平均搜索长度为( D )。 A n B n/2 C (n-1)/2 D (n+1)/2 4、在一个单链表中,若q结点是p结点的前驱结点,若在q与p之间插入结点s,则执行( D )。 A s→link = p→link;p→link = s; B p→link = s; s→link = q; C p→link = s→link;s→link = p; D q→link = s;s→link = p; 5、如果想在4092个数据中只需要选择其中最小的5个,采用( C )方法最好。 A 起泡排序 B 堆排序 C 锦标赛排序 D 快速排序 6、设有两个串t和p,求p在t中首次出现的位置的运算叫做( B )。 A 求子串 B 模式匹配 C 串替换 D 串连接 7、在数组A中,每一个数组元素A[i][j]占用3个存储字,行下标i从1到8,列下标j从1到10。所有数组元素相继存放于一个连续的存储空间中,则存放

该数组至少需要的存储字数是( C )。 A 80 B 100 C 240 D 270 8、将一个递归算法改为对应的非递归算法时,通常需要使用( A )。 A 栈 B 队列 C 循环队列 D 优先队列 9、一个队列的进队列顺序是1, 2, 3, 4,则出队列顺序为( C )。 10、在循环队列中用数组A[0..m-1] 存放队列元素,其队头和队尾指针分别为front和rear,则当前队列中的元素个数是( D )。 A ( front - rear + 1) % m B ( rear - front + 1) % m C ( front - rear + m) % m D ( rear - front + m) % m 11、一个数组元素a[i]与( A )的表示等价。 A *(a+i) B a+i C *a+i D &a+i 12、若需要利用形参直接访问实参,则应把形参变量说明为( B )参数。 A 指针 B 引用 C 值 D 变量 13、下面程序段的时间复杂度为( C ) for (int i=0;i

数据结构_实验1_线性表的基本操作

实验1 线性表的基本操作 一、需求分析 目的: 掌握线性表运算与存储概念,并对线性表进行基本操作。 1.初始化线性表; 2.向链表中特定位置插入数据; 3.删除链表中特定的数据; 4.查找链表中的容; 5.销毁单链表释放空间; 二、概要设计 ●基础题 主要函数: 初始化线性表InitList(List* L,int ms) 向顺序表指定位置插入元素InsertList(List* L,int item,int rc)删除指定元素值的顺序表记录DeleteList1(List* L,int item) 删除指定位置的顺序表记录 DeleteList2(List* L,int rc) 查找顺序表中的元素 FindList(List L,int item) 输出顺序表元素OutputList(List L) 实验步骤: 1,初始化顺序表 2,调用插入函数 3,在顺序表中查找指定的元素 4,在顺序表中删除指定的元素 5,在顺序表中删除指定位置的元素 6,遍历并输出顺序表 ●提高题

要求以较高的效率实现删除线性表中元素值在x到y(x和y自定义)之间的所有元素 方法: 按顺序取出元素并与x、y比较,若小于x且大于y,则存进新表中。 编程实现将两个有序的线性表进行合并,要求同样的数据元素只出现一次。 方法: 分别按顺序取出L1,L2的元素并进行比较,若相等则将L1元素放进L中,否则将L 1,L2元素按顺序放进L。 本程序主要包含7个函数 主函数main() 初始化线性表InitList(List* L,int ms) 向顺序表指定位置插入元素InsertList(List* L,int item,int rc)删除指定元素值的顺序表记录DeleteList1(List* L,int item) 删除指定位置的顺序表记录 DeleteList2(List* L,int rc) 查找顺序表中的元素 FindList(List L,int item) 输出顺序表元素OutputList(List L) 提高题的程序 void Combine(List* L1,List* L2,List* L) void DeleteList3(List* L,int x,int y) 二、详细设计 初始化线性表InitList(List* L,int ms) void InitList(List* L,int ms) { L->list=(int*)malloc(LIST_INIT_SIZE*sizeof(int)); L->size=0; L->MAXSIZE=LIST_INIT_SIZE;

数据结构练习题-线性表

第2章线性表 一选择题 1.下述哪一条是顺序存储结构的优点?() A.存储密度大 B.插入运算方便 C.删除运算方便 D.可方便地用于各种逻辑结构的存储表示 2.下面关于线性表的叙述中,错误的是哪一个?() A.线性表采用顺序存储,必须占用一片连续的存储单元。 B.线性表采用顺序存储,便于进行插入和删除操作。 C.线性表采用链接存储,不必占用一片连续的存储单元。 D.线性表采用链接存储,便于插入和删除操作。 3.线性表是具有n个()的有限序列(n>0)。 A.表元素 B.字符 C.数据元素 D.数据项 E.信息项 4.若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用()存储方式最节省时间。 A.顺序表 B.双链表 C.带头结点的双循环链表 D.单循环链表 5. 链表不具有的特点是() A.插入、删除不需要移动元素 B.可随机访问任一元素 C.不必事先估计存储空间 D.所需空间与线性长度成正比 6. 下面的叙述不正确的是() A.线性表在链式存储时,查找第i个元素的时间同i的值成正比 B. 线性表在链式存储时,查找第i个元素的时间同i的值无关 C. 线性表在顺序存储时,查找第i个元素的时间同i 的值成正比 D. 线性表在顺序存储时,查找第i个元素的时间同i的值无关 7. 若长度为n的线性表采用顺序存储结构,在其第i个位置插入一个新元素的算法的时间复杂度为()(1<=i<=n+1)。 A. O(0) B. O(1) C. O(n) D. O(n2) 8. 对于顺序存储的线性表,访问结点和增加、删除结点的时间复杂度为()。 A.O(n) O(n) B. O(n) O(1) C. O(1) O(n) D. O(1) O(1) 9.线性表( a1,a2,…,an)以链接方式存储时,访问第i位置元素的时间复杂性为()A.O(i) B.O(1) C.O(n) D.O(i-1) 10.在单链表指针为p的结点之后插入指针为s的结点,正确的操作是:()。 A.p->next=s;s->next=p->next; B. s->next=p->next;p->next=s; C.p->next=s;p->next=s->next; D. p->next=s->next;p->next=s; 11.对于一个头指针为head的带头结点的单链表,判定该表为空表的条件是()A.head==NULL B.head→next==NULL C.head→next==head D.head!=NULL 二、判断 1. 链表中的头结点仅起到标识的作用。( ) 2. 顺序存储结构的主要缺点是不利于插入或删除操作。( ) 3.线性表采用链表存储时,结点和结点内部的存储空间可以是不连续的。( ) 4.顺序存储方式插入和删除时效率太低,因此它不如链式存储方式好。( ) 5. 对任何数据结构链式存储结构一定优于顺序存储结构。( ) 6.集合与线性表的区别在于是否按关键字排序。( ) 7. 线性表的特点是每个元素都有一个前驱和一个后继。( )

数据结构线性表2答案

习题二 一、选择题 1.在一个长度为n的顺序表中删除第i个元素(0<i

数据结构线性表实验报告

序号 数据结构实验报告 班级姓名同组者/ 成绩 日期 3.9指导教师 实验名称实验一线性表及其应用 一、实验目的 1、深刻理解线性表的逻辑特性及其顺序、链式存储方式的特点。 2、熟练掌握线性表的常用操作(建立、插入、删除、遍历等)在顺序、链式存储上的实现。 3、加深对C/C++等编程语言的相关知识点的理解(如结构体、指针、函数、引用参数等)。 二、实验内容 1、根据给定的整型数组,以尾插法建立一个单链表,并实现以下操作: ①查找:输入一个欲查找的整数,找到则显示第一个相匹配的整数在单链表中所处的位置,若不存在,则显示提示信息。 ②删除:输入一个欲删除的整数e ,若存在则在单链表中删除第一个值为 e 的元素。 ③插入:输入一个欲插入位置i 和欲插入元素e,将e 插入到第i 个整数之前(注意i 的合法性)。 A、算法思想 ①创建 head 为头结点指针,初始时head->next 为NULL ;tail 始终指向当前链表的最后一个元素,其初始时指向头结点;p 始终指向每次申请的新结点,修改p->data 为当前读入的整数;修改tail->next 为p ,修改tail 为p ;最后修改tail->next 为NULL ,。 ②插入 找到插入点的前驱(即第i-1 个结点)的指针p ;s 指向新申请的结点;修改s->data 为参数e,修改s->next 为p->next ,修改p->next 为s 。 ③查找 ……利用p进行遍历,直到节点的数据和所给的数据相同,输出节点的位置 ④删除 ……利用p进行遍历,并总是将p的前一节点的指针赋给pre,一旦找到,则删除节点并

退出循环,没有到话,反馈相关信息 B、算法源码 /* *线性表及其应用 */ #include using namespace std; typedef struct _LinkList { int elem; struct _LinkList* next; }LinkList; void InitList(LinkList *&link );//构造一个含有头结点的链表 bool InsertList(LinkList *&link,int i,int e);//在第i个位置之前插入包含元素e的新节点void GetTailPointer(LinkList *link,LinkList *&tail);//获得单链表尾结点指针 void AddList(LinkList *&link,int e);//根据将e以尾插法插入链表 void DisplayList(LinkList *link);//打印静态链表中的所有数据 void LocatedList(LinkList *link,int e);//查找e的位置 void DeleteList(LinkList *&link,int e);//删除所在节点 void MergeList(LinkList *linka,LinkList *linkb,LinkList *&linkc);//归并 void InitList(LinkList *&link )//构造一个含有头结点的链表 { LinkList *L,*head; head = (LinkList *)malloc(sizeof(LinkList)); head -> next = NULL; L = head; link = L; } void AddList(LinkList *&link,int e)//根据将e以尾插法插入链表 { LinkList *p =NULL; p =(LinkList *)malloc(sizeof(LinkList)); p -> elem = e; p->next = NULL; LinkList *tail = link;

数据结构实验一题目一线性表实验报告

北京邮电大学电信工程学院 数据结构实验报告 实验名称:实验1——线性表 学生姓名: 班级: 班内序号: 学号: 日期: 1.实验要求 1、实验目的:熟悉C++语言的基本编程方法,掌握集成编译环境的调试方法 学习指针、模板类、异常处理的使用 掌握线性表的操作的实现方法 学习使用线性表解决实际问题的能力 2、实验内容: 题目1: 线性表的基本功能: 1、构造:使用头插法、尾插法两种方法 2、插入:要求建立的链表按照关键字从小到大有序 3、删除 4、查找 5、获取链表长度 6、销毁 7、其他:可自行定义 编写测试main()函数测试线性表的正确性。 2. 程序分析 2.1 存储结构 带头结点的单链表

2.2 关键算法分析 1.头插法 a、伪代码实现:在堆中建立新结点 将x写入到新结点的数据域 修改新结点的指针域 修改头结点的指针域,将新结点加入链表中b、代码实现: Linklist::Linklist(int a[],int n)//头插法 {front=new Node; front->next=NULL; for(int i=n-1;i>=0;i--) {Node*s=new Node; s->data=a[i]; s->next=front->next; front->next=s; } } 2、尾插法

a、伪代码实现:a.在堆中建立新结点 b.将a[i]写入到新结点的数据域 c.将新结点加入到链表中 d.修改修改尾指针 b、代码实现: Linklist::Linklist(int a[],int n,int m)//尾插法 {front=new Node; Node*r=front; for(int i=0;idata=a[i]; r->next=s; r=s; } r->next=NULL; } 时间复杂度:O(n) 3、按位查找 a、伪代码实现: 初始化工作指针p和计数器j,p指向第一个结点,j=1 循环以下操作,直到p为空或者j等于1 b1:p指向下一个结点 b2:j加1 若p为空,说明第i个元素不存在,抛出异常 否则,说明p指向的元素就是所查找的元素,返回元素地址 b、代码实现 Node* Linklist::Get(int i)//得到指向第i个数的指针 {Node*p=front->next; int j=1; while(p&&j!=i)//p非空且j不等于i,指针后移 {p=p->next; j++;

数据结构课后习题及答案

填空题(10 * 1’ = 10’) 一、概念题 .当对一个线性表经常进行的是插入和删除操作时,采用链式存储结构为宜。 .当对一个线性表经常进行的是存取操作,而很少进行插入和删除操作时,最好采用顺序存储结构。 .带头结点的单链表L中只有一个元素结点的条件是L->Next->Next==Null。 .循环队列的引入,目的是为了克服假溢出。 .长度为0的字符串称为空串。 .组成串的数据元素只能是字符。 .设T和P是两个给定的串,在T中寻找等于P的子串的过程称为模式匹配,又称P为模式。 .为了实现图的广度优先搜索,除一个标志数组标志已访问的图的结点外,还需要队列存放被访问的结点实现遍历。 .广义表的深度是广义表中括号的重数 .有向图G可拓扑排序的判别条件是有无回路。 .若要求一个稠密图的最小生成树,最好用Prim算法求解。 . 直接定址法法构造的哈希函数肯定不会发生冲突。 .排序算法所花费的时间,通常用在数据的比较和交换两大操作。 .通常从正确性﹑可读性﹑健壮性﹑时空效率等几个方面评价算法的(包括程序)的质量。 .对于给定的n元素,可以构造出的逻辑结构有集合关系﹑线性关系树形关系﹑图状关系四种。 .存储结构主要有顺序存储﹑链式存储﹑索引存储﹑散列存储四种。 .抽象数据类型的定义仅取决于它的一组逻辑特性,而与存储结构无关,即不论其内部结构如何变化,只要它的数学特性不变,都不影响其外部使用。 .一个算法具有五大特性:有穷性﹑确定性﹑可行性,有零个或多个输入﹑有一个或多个输入。 .在双向链表结构中,若要求在p指针所指的结点之前插入指针为s所指的结点,则需执行下列语句:s->prior= p->prior; s->next= p; p->prior- next= s; p->prior= s;。 .在单链表中设置头结点的作用是不管单链表是否为空表,头结点的指针均不空,并使得对单链表的操作(如插入和删除)在各种情况下统一。 .队列是限制在表的一端进行插入和在另一端进行删除的线性表,其运算遵循先进先出原则。 .栈是限定尽在表位进行插入或删除操作的线性表。 .在链式队列中,判定只有一个结点的条件是(Q->rear==Q->front)&&(Q->rear!=NULL)。 .已知链队列的头尾指针分别是f和r,则将x入队的操作序列是node *p=(node *)malloc(node); p->next=x; p->next=NULL; if(r) {r->next=p; r=p;} else {r=p; f=p;}。 .循环队列的满与空的条件是(rear+1)%MAXSIZE==fornt和(front=-1&&rear+1==MAXSIZE)。 .串是一种特殊的线性表,其特殊性表现在数据元素都是由字符组成。 .字符串存储密度是串值所占存储位和实际分配位的比值,在字符串的链式存储结构中其结点大小是可变的。 .所谓稀疏矩阵指的是矩阵中非零元素远远小于元素总数,则称该矩阵为矩阵中非零元素远远小于元素总数,则称该矩阵为稀疏矩阵。 .一维数组的逻辑结构是线性结构,存储结构是顺序存储结构;对二维或多维数组,分别按行优先和列优先两种不同的存储方式。 .在有向图的邻接矩阵表示中,计算第i个顶点入度的方法是求邻接矩阵中第i列非0元素的个数。 网中,结点表示活动,边表示活动之间的优先关系,AOE网中,结点表示事件,边表示活动。 .按排序过程中依据不同原则对内部排序方法进行分类,主要有选择排序﹑交换排序﹑插入排序归并排序等4类。 .在堆排序、快速排序和归并排序中若只从排序结果的稳定性考虑,则应选择归并排序方法;若只从平均情况下排序最快考虑,则应选择快速排序方法;若只从最坏情况下排序最快且要节省类存考虑,则应选择堆排序方法。 .直接插入排序用监视哨的作用是存当前要的插入记录,可又省去查找插入位置时对是否出界的判断。 .设表中元素的初始状态是按键值递增的,则直接插入排序最省时间,快速排序最费时间。 .下列程序判断字符串s是否对称,对称则返回1,否则返回0;如?(“abba”)返回1,?(”abab”)返回0. Int f (char*s) { Int i=0,j=0; 求串长*/

数据结构线性表实验报告

《数据结构》实验报告 专业: 学号: 姓名: 实验二线性表 【实验目的】 1.熟悉VC环境,学习如何使用C语言实现线性表的两种存储结构。 2.通过编程、上机调试,进一步理解线性表的基本概念,东运用C语言实现线性表基本操作。 3.熟练掌握线性表的综合应用问题。 【实验内容】 1、一个线性表有n个元素(n-MAXSIZE.MAXSIZE指线性表的最大长度),且递增有。现有一元素x要插入到线性表的适当位置上,并保持线性表原有的顺序不变。设计程序实现。要求:采用顺序存储表示实现;采用链式存储表示方法实现:比较两种方法的优劣。 2.从单链表中删除指定的元素x,若x在单链表中不存在,给出提示信息。 要求: ①指定的值x由键盘输入; ②程序能处理空链表的情况。 3.设有头结点的单链表,编程对表中的任意值只保留一个结点,删除其余值相同的结点。 要求: ①该算法用函数(非主函数)实现; ②在主函数中调用创建链表的函数创建一个单链表,并调用该函数,验证算法的正确性。LinkedList Exchange(LinkedList HEAD,p) //HEAD是单链表头结点的指针,p是链表中的一个结点。本算法将p所指结点与其后 继结点交换。 (q=head->next;//q是工作指针,指向链表中当前待处理结点。 pre=head;//pre是前驱结点指针,指向q的前驱。 while(q'=null &&q1=p)(pre=q;q=q->next;]/未到p结点,后移指针。 if(p->next==null)printf(“p无后继结点\n”);/p是链表中最后一个结点,无后继。 else/处理p和后继结点交换 (q=p->next;//暂存p的后继。 pre->next=q://p前驱结点的后继指向p的后继。 p->next=q->next;//p的后继指向原p后继的后继。 q->next=p://原p后继的后继指针指向p。} }//算法结束。 4.已知非空单链表第一个结点由head指出,请写一算法,交换p所指结点与其下一个结点在链表中的位置。 要求:

数据结构-线性表-习题

线性表 一、选择题 1.线性表是( A ) A.一个有限序列,可以为空B.一个有限序列,不可以为空 C.一个无限序列,可以为空D.一个无限序列,不可以为空 2.一维数组与线性表的特征是( C )。 A.前者长度固定,后者长度可变B.两者长度均固定 C.后者长度固定,前者长度可变D.两者长度均可变 3.用单链表方式存储的线性表,存储每个结点需要两个域,一个数据域,另一个是( B ). A.当前结点所在地址域B.指针域 C.空指针域D.空闲域 4.用链表表示线性表的优点是( B )。 A.便于随机存取 B.便于进行插入和删除操作 C.占用的存储空间较顺序表少 D.元素的物理顺序与逻辑顺序相同 5.在具有 n 个结点的单链表中,实现__A _的操作,其算法的时间复杂度都是O(n)。 A.遍历链表和求链表的第i个结点 B.在地址为P的结点之后插入一个结点 C.删除开始结点 D.删除地址为P的结点的后继结点 6.下面关于线性表的叙述中,错误的是( B )。 A.线性表采用顺序存储必须占用一片连续的存储单元 B.线性表采用顺序存储便于进行插入和删除操作 C.线性表采用链式存储不必占用一片连续的存储单元 D.线性表采用链式存储便于进行插入和删除操作 7.已知单链表的每个结点包括一个指针域next,它指向该结点的后继结点。现要将指针 q 指向的新结点插入到指针 p 指 向的结点之后,下面的操作序列中正确的是( C )。 A . q = p->next; p->next = q->next ; B . p->next = q->next; q = p->next ; C . q->next = p->next; p->next = q ; D . p->next = q; q->next = p->next ;

数据结构试题答案

第一章概论 一、选择题 1、研究数据结构就是研究(D )。 A. 数据的逻辑结构 B. 数据的存储结构 C. 数据的逻辑结构和存储结构 D. 数据的逻辑结构、存储结构及其基本操作(研究非数值计算的程序设计问题中,计算机操作对象以及他们之间的关系和操作) 2、算法分析的两个主要方面是( A )。 A. 空间复杂度和时间复杂度 B. 正确性和简单性 C. 可读性和文档性 D. 数据复杂性和程序复杂性 3、具有线性结构的数据结构是( D )。(线性结构就是:在非空有限集合中,存在为一个被称为第一个的数据元素和最后一个元素,有除了第一个元素,集合中每一个元素均只有一个前驱,除了最后一个元素有唯一后继)(链表、栈、队列、数组、串) A. 图 B. 树 C. 广义表(线性表的推广) D. 栈 4、计算机中的算法指的是解决某一个问题的有限运算序列,它必须具备输入、输出、(B )等5个特性。 A. 可执行性、可移植性和可扩充性 B. 可执行性、有穷性和确定性 C. 确定性、有穷性和稳定性 D. 易读性、稳定性和确定性 5、下面程序段的时间复杂度是( C )。 for(i=0;i

6、算法是(D )。为了解决某一问题而规定的一个有限长的操作序列 A. 计算机程序 B. 解决问题的计算方法 C. 排序算法 D. 解决问题的有限运算序列 7、某算法的语句执行频度为(3n+nlog2n+n2+8),其时间复杂度表示(C )。 A. O(n) B. O(nlog2n) C. O(n2) D. O(log2n) 8、下面程序段的时间复杂度为( C )。 i=1; while(i<=n) i=i*3; A. O(n) B. O(3n) C. O(log3n) D. O(n3) 9、数据结构是一门研究非数值计算的程序设计问题中计算机的数据元素以及它们之间的(B )和运算等的学科。(关系和操作) A. 结构 B. 关系 C. 运算 D. 算法 10、下面程序段的时间复杂度是( A )。 i=s=0; while(s

《数据结构》实验一 线性表及其应用

实验一线性表及其应用 一、实验目的 1.熟悉C语言的上机环境,进一步掌握C语言的结构特点。 2.掌握线性表的顺序存储结构的定义及C语言实现。 3.掌握线性表的链式存储结构——单链表的定义及C语言实现。 4.掌握线性表在顺序存储结构即顺序表中的各种基本操作。 5.掌握线性表在链式存储结构——单链表中的各种基本操作。 二、实验内容 1.顺序线性表的建立、插入及删除。 2.链式线性表的建立、插入及删除。 三、实验步骤 1.建立含n个数据元素的顺序表并输出该表中各元素的值及顺序表的长度。 2.利用前面的实验先建立一个顺序表L={21,23,14,5,56,17,31},然后在第i个位置插入元素68。 3.建立一个带头结点的单链表,结点的值域为整型数据。要求将用户输入的数据按尾插入法来建立相应单链表。 四、实现提示 1.由于C语言的数组类型也有随机存取的特点,一维数组的机内表示就是顺序结构。因此,可用C语言的一维数组实现线性表的顺序存储。 在此,我们利用C语言的结构体类型定义顺序表: #define MAXSIZE 1024 typedef int elemtype; /* 线性表中存放整型元素*/ typedef struct { elemtype vec[MAXSIZE]; int len; /* 顺序表的长度*/ }sequenlist; 将此结构定义放在一个头文件sqlist.h里,可避免在后面的参考程序中代码重复书写,另外在该头文件里给出顺序表的建立及常量的定义。 2. 注意如何取到第i个元素,在插入过程中注意溢出情况以及数组的下标与位序(顺序表中元素的次序)的区别。 3.单链表的结点结构除数据域外,还含有一个指针域。用C语言描述结点结构如下: typedef int elemtype; typedef struct node

数据结构_线性表练习题

一、判断题 1. 线性表的逻辑顺序与存储顺序总是一致的。(FALSE) 2. 顺序存储的线性表可以按序号随机存取。(TRUE) 3.顺序表的插入和删除一个数据元素,每次操作平均只有近一半的元素需要移动。TRUE) 4.线性表中的元素可以是各种各样的,但同一线性表中的数据元素具有相同的特性,因此是属于同一数据对象。(TRUE) 5,在线性表的顺序存储结构中,逻辑上相邻的两个元素在物理位置上并不一定紧邻。(FALSE ) 6.在线性表的链式存储结构中,逻辑上相邻的元素在物理位置上不一定相邻。(TRUE) 7.线性表的链式存储结构优于顺序存储结构。(FALSE ) 8. 在线性表的顺序存储结构中,插入和删除时,移动元素的个数与该元素的位置有关。(TRUE) 9.线性表的链式存储结构是用一组任意的存储单元来存储线性表中数据元素的。(TRUE) 10.在单链表中,要取得某个元素,只要知道该元素的指针即可,因此,单链表是随机存取的存储结构。(FALSE ) 二.选择题 11.线性表是()。 (A)一个有限序列,可以为空; (B)一个有限序列,不能为空; (C)一个无限序列,可以为空; (D)一个无序序列,不能为空。答:A 12.对顺序存储的线性表,设其长度为n,在任何位置上插入或删除操作都是等概率的。插入一个元素时平均要移动表中的()个元素。 (A)n/2(B)(n+1)/2(C)(n–1)/2(D)n答:A 13.线性表采用链式存储时,其地址()。 (A)必须是连续的;(B)部分地址必须是连续的;(C)一定是不连续的;(D)连续与否均可以。答:D 14.用链表表示线性表的优点是()。 (A)便于随机存取 (B)花费的存储空间较顺序存储少 (C)便于插入和删除 (D)数据元素的物理顺序与逻辑顺序相同答:C 15.单链表中,增加一个头结点的目的是为了()。

数据结构习题与答案

第 1 章绪论 课后习题讲解 1. 填空 ⑴()是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。 【解答】数据元素 ⑵()是数据的最小单位,()是讨论数据结构时涉及的最小数据单位。 【解答】数据项,数据元素 【分析】数据结构指的是数据元素以及数据元素之间的关系。 ⑶从逻辑关系上讲,数据结构主要分为()、()、()和()。 【解答】集合,线性结构,树结构,图结构 ⑷数据的存储结构主要有()和()两种基本方法,不论哪种存储结构,都要存储两方面的内容:()和()。 【解答】顺序存储结构,链接存储结构,数据元素,数据元素之间的关系 ⑸算法具有五个特性,分别是()、()、()、()、()。 【解答】有零个或多个输入,有一个或多个输出,有穷性,确定性,可行性 ⑹算法的描述方法通常有()、()、()和()四种,其中,()被称为算法语言。 【解答】自然语言,程序设计语言,流程图,伪代码,伪代码 ⑺在一般情况下,一个算法的时间复杂度是()的函数。 【解答】问题规模 ⑻设待处理问题的规模为n,若一个算法的时间复杂度为一个常数,则表示成数量级的形式为(),若为n*log25n,则表示成数量级的形式为()。 【解答】Ο(1),Ο(nlog2n) 【分析】用大O记号表示算法的时间复杂度,需要将低次幂去掉,将最高次幂的系数去掉。 2. 选择题 ⑴顺序存储结构中数据元素之间的逻辑关系是由()表示的,链接存储结构中的数据元素之间的逻辑关系是由()表示的。 A 线性结构 B 非线性结构 C 存储位置 D 指针 【解答】C,D 【分析】顺序存储结构就是用一维数组存储数据结构中的数据元素,其逻辑关系由存储位置(即元素在数组中的下标)表示;链接存储结构中一个数据元素对应链表中的一个结点,元素之间的逻辑关系由结点中的指针表示。

数据结构习题

《数据结构》习题集 第一章序论 思考题: 1.1简述下列术语:数据、数据元素、数据对象、数据结构、存储结构、数据类型、抽象数据类型 作业题: 1.2设有数据结构(D,R),其中 D={d1, d2, d3, d4 } R={r1, r2} r1={ , , , , , } r2={ (d1, d2), (d1, d3), (d1, d4), (d2, d4), (d2, d3) } 试绘出其逻辑结构示意图。 1.3设n是正整数。试写出下列程序段中用记号“△”标注的语句的频度:(1) i=1; k=0; while(i<=n-1) { △k+=10*i; i++; } (2) i=1; k=0; do { △k+=10*i; i++; }while(i<=n-1) (3)i=1; k=0; do { △k+ = 10*i; i++; }while(i==n); (4) i=1; j=0; while(i+j≤n) { △if(i

(5) x=n; y=0; //n是不小于1的常数 while(x>=(y+1)*(y+1)){ △y++; } (6) x=91; y=100; while ( y>0 ) { △if(x>100) { x-=10; y--; } else x++ ; } (7) for( i=0; i

数据结构作业及答案

第一章绪论 一、选择题 1.数据结构是一门研究非数值计算的程序设计问题中计算机的1以及它们之间的2和运算等的学科。1 A.数据元素 B.计算方法 C.逻辑存储 D.数据映像 2 A.结构 B.关系 C.运算 D.算法 2.数据结构被形式地定义为(K, R),其中K是1的有限集,R是K上的2有限集。 1 A.算法 B.数据元素 C.数据操作 D.逻辑结构 2 A.操作 B.映像 C.存储 D.关系 3.在数据结构中,从逻辑上可以把数据结构分成。 A.动态结构和静态结构 B.紧凑结构和非紧凑结构 C.线性结构和非线性结构 D.内部结构和外部结构 4.线性结构的顺序存储结构是一种1的存储结构,线性表的链式存储结构是一种2的存储结构。A.随机存取 B.顺序存取 C.索引存取 D.散列存取 5.算法分析的目的是1,算法分析的两个主要方面其一是指2,其二是指正确性和简单性。1 A.找出数据结构的合理性 B.研究算法中的输入和输出的关系 C.分析算法的效率以求改进 D.分析算法的易懂性和文档性 2 A.空间复杂度和时间复杂度 B.研究算法中的输入和输出的关系 C.可读性和文档性 D.数据复杂性和程序复杂性k 6.计算机算法指的是1,它必须具备输入、输出和2等5个特性。 1 A.计算方法 B.排序方法 C.解决问题的有限运算序列 D.调度方法 2 A.可执行性、可移植性和可扩充性 B.可行性、确定性和有穷性 C.确定性、有穷性和稳定性 D.易读性、稳定性和安全性 7.线性表的逻辑顺序与存储顺序总是一致的,这种说法。A.正确 B.不正确 8线性表若采用链式存储结构时,要求内存中可用存储单元的地址。 A.必须连续的 B.部分地址必须连续的 C.一定是不续的D连续不连续都可以 9.以下的叙述中,正确的是。A.线性表的存储结构优于链式存储结构 B.二维数组是其数据元素为线性表的线性表C.栈的操作方式是先进先出D.队列的操作方式是先进后出10.每种数据结构都具备三个基本运算:插入、删除和查找,这种说法。A.正确B.不正确 二、填空题1.数据逻辑结构包括三种类型、和,树形结构和图形结构合称为。2.在线性结构中,第一个结点前驱结点,其余每个结点有且只有个前驱结点;最后一个结点后续结点,其余每个结点有且只有个后续结点。3.算法的五个重要特性是、、、、。 4.下面程序段的时间复杂度是。 for( i = 0; i < n; i++) for( j = 0; j < m; j++) A[i][j] = 0; 5.下面程序段的时间复杂度是。 i = s = 0; while ( s < n) { i ++; /* i = i +1*/ s += i; /* s = s + i*/ } 6.下面程序段的时间复杂度是。 s = 0; for( i = 0; i < n; i++) for( j = 0; j < n; j++) s += B[i][j]; sum = s; 7.下面程序段的时间复杂度是。 i = 1; while ( i <= n ) i = i * 3;

相关文档
最新文档