算法与数据结构C语言版课后习题答案(机械工业出版社)第1章 绪论 习题参考答案

算法与数据结构C语言版课后习题答案(机械工业出版社)第1章 绪论 习题参考答案
算法与数据结构C语言版课后习题答案(机械工业出版社)第1章 绪论 习题参考答案

第1章概论习题参考答案

一、基础知识题

1.简述下列概念

数据,数据元素,数据类型,数据结构,逻辑结构,存储结构,算法。

【解答】数据是信息的载体,是描述客观事物的数、字符,以及所有能输入到计算机中并被计算机程序识别和处理的符号的集合。数据元素是数据的基本单位。在不同的条件下,数据元素又可称为元素、结点、顶点、记录等。

数据类型是对数据的取值范围、数据元素之间的结构以及允许施加操作的一种总体描述。每一种计算机程序设计语言都定义有自己的数据类型。

“数据结构”这一术语有两种含义,一是作为一门课程的名称;二是作为一个科学的概念。作为科学概念,目前尚无公认定义,一般认为,讨论数据结构要包括三个方面,一是数据的逻辑结构,二是数据的存储结构,三是对数据进行的操作(运算)。而数据类型是值的集合和操作的集合,可以看作是已实现了的数据结构,后者是前者的一种简化情况。

数据的逻辑结构反映数据元素之间的逻辑关系(即数据元素之间的关联方式或“邻接关系”),数据的存储结构是数据结构在计算机中的表示,包括数据元素的表示及其关系的表示。数据的运算是对数据定义的一组操作,运算是定义在逻辑结构上的,和存储结构无关,而运算的实现则依赖于存储结构。

数据结构在计算机中的表示称为物理结构,又称存储结构。是逻辑结构在存储器中的映像,包括数据元素的表示和关系的表示。逻辑结构与计算机无关。

算法是对特定问题求解步骤的一种描述,是指令的有限序列。其中每一条指令表示一个或多个操作。一个算法应该具有下列特性:有穷性、确定性、可行性、输入和输出。

2.数据的逻辑结构分哪几种,为什么说逻辑结构是数据组织的主要方面?

【解答】数据的逻辑结构分为线性结构和非线性结构。(也可以分为集合、线性结构、树形结构和图形即网状结构)。

逻辑结构是数据组织的某种“本质性”的东西:

(1)逻辑结构与数据元素本身的形式、内容无关。

(2)逻辑结构与数据元素的相对位置无关。

(3)逻辑结构与所含数据元素的个数无关。

3.试举一个数据结构的例子,叙述其逻辑结构、存储结构、运算三方面的内容。

【解答】如学生成绩表,逻辑结构是线性结构,可以顺序存储(也可以链式存储),运算可以有插入、删除、查询、等等。

4.简述算法的五个特性,对算法设计的要求。

【解答】算法的五个特性是:有穷性、确定性、可行性、零至多个输入和一至多个输出。

对算法设计的要求:正确性,易读性,健壮性,和高的时空间效率(运算速度快,存储空间小)。

5.设n是正整数,求下列程序段中带@记号的语句的执行次数。

(1)i=1;k=0; (2) i=1;j=0;

while(i

{k=k+50*i; i++; @ {if(i>j)j++; @

} else i++; } @

(3)x=y=0; (4)x=91;y=100;

for(i=0;i0)

for(j=0;j100)

{x++; @ {x=x-10; y--; @

for(k=0;k

y++; @ else x++; @

}

【解答】(1)n-1

(2)n为偶数时,均为n div 2;

你为奇数时,分别为:(n div 2)+1 和n div 2

(3)n+1, n(n+1), n2,(n+1)n2, n3

(4)100, 1000

6.有实现同一功能的两个算法A1和A2,其中A1的时间复杂度为Tl=O(2n),A2

的时间复杂度为T2=O(n2),仅就时间复杂度而言,请具体分析这两个算法哪一个好?

【解答】对算法A1和A2的时间复杂度T1和T2取对数,得nlog2和2logn。显然,当n<4时,算法A1好于A2;当n=4时,两个算法时间复杂度相同;当n>4时,算法A2好于A1。

7. 选择题:算法分析的目的是()

A、找出数据结构的合理性

B、研究算法中的输入和输出的关系

C、分析算法的效率以求改进

D、分析算法的易懂性和文档特点

【解答】C

二、算法设计题

8. 已知输入x,y,z三个不相等的整数,设计一个“高效”算法,使得这三个数按从小到大输出。“高效”的含义是用最少的元素比较次数、元素移动次数和

输出次数。

void Best()

{ //按序输出三个整数的优化算法

int a,b,c,t;

scanf(“%d%d%d”,&a,&b,&c);

if(a>b)

{t=a; a=b; b=t:} //a和b已正序

if(b>c)

{t=c; c=b; //c已到位

if(a>t) {b=a; a=t;} //a和b已正序

else b=t;

}//if

printf(“%d,%d,%d\n”,a,b,c);

//最佳2次比较,无移动;最差3次比较,7个赋值

}

9.在数组A[n]中查找值为k的元素,若找到则输出其位置i(1≤i≤n),否则输出0作为标志。设计算法求解此问题,并分析在最坏情况下的时间复杂度

【题目分析】从后向前查找,若找到与k值相同的元素则返回其位置,否则返回0。

int Search(ElemType A[n+1], ElemType k)

{i=n;

wile(i>=1)&&(A[i]!=k)) i--;

if(i>=1) return i;

else return 0;

}

当查找不成功时,总的比较次数为n+1次,所以最坏情况下时间复杂度为O(n)。

第2章线性表习题参考答案

一、基础知识题

2.1 试述头指针、头结点、元素结点、首元结点的区别,说明头指针和头结点的作

【解答】指向链表第一个结点(或为头结点或为首元结点)的指针称为头指针。“头指针”具有标识一个链表的作用,所以经常用头指针代表链表的名字,如链表L既是指链表的名字是L,也是指链表的第一个结点的地址存储在指针变量L中,头指针为“NULL”则表示一个空表。

有时,我们在整个线性链表的第一个元素结点之前加入一个结点,称为头结点,它的数据域可以不存储任何信息(也可以做监视哨或存放线性表的长度等附加信息),指针域中存放的是第一个数据结点的地址,空表时为空。“头结点”的加入,使插入和删除等操作方便统一。

元素结点即是数据结点,至少包括元素自身信息和其后继元素的地址两个域。

首元结点是指链表中第一个数据元素的结点;为了操作方便,通常在链表的首元结点之前附设一个结点,称为头结点。

2.2分析顺序存储结构和链式存储结构的优缺点,说明何时应该利用何种结构。

【解答】①从空间上来看,当线性表的长度变化较大,难以估计其规模时,选用动态的链表作为存储结构比较合适,但链表除了需要设置数据域外,还要额外设置指针域,因此当线性表长度变化不大,易于事先确定规模时,为了节约存储空间,宜采用顺序存储结构。

②从时间上看,顺序表具有按元素序号随机访问的特点,在顺序表中按序号访问数据元素的时间复杂度为O(1);而链表中按序号访问的时间复杂度为O(n)。所以如果经常按序号访问数据元素,使用顺序表优于链表。

在顺序表中做插入删除操作时,平均移动大约表中一半的元素,因此n较大时顺序表的插入和删除效率低。在链表中作插入、删除,虽然也要找插入位置,但操作主要是比较操作。从这个角度考虑显然链表优于顺序表。

总之,两种存储结构各有长短,选择那一种存储结构,由实际问题中的主要因素决定。

2.3 分析在顺序存储结构下插入和删除结点时平均需要移动多少个结点。

【解答】平均移动表中大约一半的结点,插入操作平均移动个结点,删除操作平均移动个结点。具体移动的次数取决于表长和插入、删除的结点的位置。

2.4 为什么在单循环链表中常使用尾指针,若只设头指针,插入元素的时间复杂度如何?【解答】单循环链表中无论设置尾指针还是头指针都可以遍历表中任一个结点。设置尾指针时,若在表尾进行插入元素或删除第一元素,操作可在O(1)时间内完成;若只设置头指针,表尾进行插入或删除操作,需要遍历整个链表,时间复杂度为O(n)。

2.5 在单链表、双链表、单循环链表中,若知道指针p指向某结点,能否删除该结点,时间复杂度如何?

【解答:】以上三种链表中,若知道指针p指向某结点,都能删除该结点。双链表删除p所指向的结点的时间复杂度为O(1),而单链表和单循环链表上删除p所指向的结点的时间复杂度均为O(n)。

2.6 下面算法的功能是什么?

LinkedList Unknown(LinkedList la)

{LNode *q,*p;

if(la && la->next)

{q=la; la=la->next; p=la;

while(p->next) p=p->next;

p->next=q; q->next=null;

}

return la;

}

【解答】将首元结点删除并插入到表尾(设链表长度大于1)。

2.7 选择题:在循环双链表的*p结点之后插入*s结点的操作是()

la、p->next=s; s->prior=p; p->next->prior=s; s->next=p->next;

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

lc、s->prior=p; s->next=p->next; p->next:=s; p->next->prior=s;

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

【解答】D

2.8 选择题:若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用()存储方式最节省时间。

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

【解答】la

二、算法设计题

2.9 设ha和hb分别是两个带头结点的非递减有序单链表的头指针,试设计算法,将这两个有序链表合并成一个非递增有序的单链表。要求使用原链表空间,表中无重复数据。【题目分析】因为两链表已按元素值非递减次序排列,将其合并时,均从第一个结点起进行比较,将小的链入链表中,同时后移链表工作指针,若遇值相同的元素,则删除之。该问题要求结果链表按元素值非递增次序排列,故在合并的同时,将链表结点逆置。

LinkedList Union(LinkedList ha,hb)

∥ha,hb分别是带头结点的两个单链表的头指针,链表中的元素值按递增序排列

∥本算法将两链表合并成一个按元素值递减次序排列的单链表,并删除重复元素

{ pa=ha->next; ∥pa是链表ha的工作指针

pb=hb->next; ∥pb是链表hb的工作指针

ha->next=null; ∥ha作结果链表的头指针,先将结果链表初始化为空

while(pa!=null && pb!=null) ∥当两链表均不为空时作

{while(pa->next && pa->data==pa->next->data)

{u=pa->next; pa->next=u->next; free(u)}∥删除pa链表中的重复元素while(pb->next && pb->data==pb->next->data)

{u=pb->next; pb->next=u->next; free(u)}∥删除pb链表中的重复元素if(pa->datadata)

{r=pa->next; ∥将pa 的后继结点暂存于r

pa->next=ha->next; ∥将pa结点链于结果表中,同时逆置

ha->next=pa;

pa=r; ∥恢复pa为当前待比较结点

}

else if(pb->datadata)

{r=pb->next; ∥将pb 的后继结点暂存于r

pb->next=ha->next; ∥将pb结点链于结果表中,同时逆置

ha->next=pb;

pb=r; ∥恢复pb为当前待比较结点

}

else{u=pb;pb=pb->next;free(u)}∥删除链表pb和pa中的重复元素

}// while(pa!=null && pb!=null)

if(pa) pb=pa; ∥避免再对pa写下面的while语句

while(pb!=null) ∥将尚未到尾的表逆置到结果表中

{r=pb->next; pb->next=ha->next; ha->next=pb; pb=r; }

return ha

}∥算法Union结束

2.10 设la是一个双向循环链表,其表中元素递增有序。试写一算法插入元素x,使表中元素依然递增有序。

【问题分析】双向链表的插入与单链表类似,但需修改双向指针。

DLinkedList DInsert(DLinkedList la, ElemType x)

∥在递增有序的双向循环链表la中插入元素x,使表中元素依然递增有序

{p=la->next; ∥p指向第一元素

la->data=MaxElemType;∥MaxElemType是和x同类型的机器最大值,用做监视哨

while(p->data

p=p->next ;

s=(DLNode *)malloc(sizeof(DLNode));∥申请结点空间

s->data=x;

s->prior=p->prior; s->next=p; ∥将插入结点链入链表

p->prior->next=s; p->prior=s;

}

2.11 设p指向头指针为la的单链表中某结点,试编写算法,删除结点*p的直接前驱结点。【题目分析】设*p是单链表中某结点,删除结点*p的直接前驱结点,要找到*p的前驱结点的前驱*pre。进行如下操作:u=pre->next; pre->next=u->next;free(u);

LinkedList LinkedListDel(LinkedList la,LNode *p)

{∥删除单链表la上的结点*p的直接前驱结点,假定*p存在

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);

}

2.12 设计一算法,将一个用循环链表表示的稀疏多项式分解成两个多项式,使这两个多项式各自仅有奇次幂或偶次幂项,并要求利用原链表中的结点空间来构造这两个链表。

【题目分析】设循环链表表示的多项式的结点结构为:

typedef struct node

{int power; ∥幂

float coef; ∥系数

ElemType other; ∥其他信息

struct node *next; ∥指向后继的指针

}PNode,*PolyLinkedList;

则可以从第一个结点开始,根据结点的幂是奇数或偶数而将其插入到奇次幂或偶次幂项的链表中。假定用原链表保存偶次幂,要为奇次幂的链表生成一个表头,为了保持链表中结点的原来顺序,用一个指针指向奇次幂链表的表尾,注意链表分解时不能“断链”。

void PolyDis(PolyLinkedList poly)

∥将poly表示的多项式链表分解为各含奇次幂或偶次幂项的两个循环链表{PolyLinkedList poly2=(PolyLinkedList)malloc(sizeof(PNode));

∥poly2表示只含奇次幂的多项式

r2=poly2; ∥r2是只含奇次幂的多项式链表的尾指针

r1=poly; ∥r1是只含偶次幂的多项式链表当前结点的前驱结点的指针

p=poly->next; ∥链表带头结点,p指向第一个元素

while(p!=poly)

if(p->power % 2)∥处理奇次幂

{r=p->next; ∥暂存后继

r2->next=p; ∥结点链入奇次幂链表

r2=p; ∥尾指针后移

p=r; ∥恢复当前待处理结点

}

else ∥处理偶次幂

{r1->next=p; r1=p; p=p->next;}

}

r->next=poly2; r1->next=poly; ∥构成循环链表

}∥PolyDis

2.13 以带头结点的双向链表表示的线性表L=(a1,a2,…,an),试写一时间复杂度为O(n)的算法,将L改造为L=(a1,a3,…,an,…,a4,a2)。

【题目分析】分析结果链表,易见链表中位置是奇数的结点保持原顺序,而位置是偶数的结点移到奇数结点之后,且以与原来相反的顺序存放。因此,可从链表第一个结点开始处理,位置是奇数的结点保留不动,位置是偶数的结点插入到链表尾部,并用一指针指向链表尾,以便对偶数结点“尾插入”。

DLinkedList DInvert(DLinkedList L)

∥将双向循环链表L位置是偶数的结点逆置插入到链表尾部

{p=L->next; ∥p指向第一元素

Q=p->prior; ∥Q指向最后一个元素

pre=L ; ∥pre指向链表中位置为奇数的结点的前驱

r=L ; ∥r指向链表中偶数结点的尾结点

i=0 ; ∥i记录结点序号

while(p != Q) ∥寻找插入位置

{i++ ;

if(i%2) ∥处理序号为奇数的结点

{p->prior=pre ;pre->next=p ;pre=p; p=p->next;}

else ∥处理序号为偶数的结点

{u=p ; ∥记住当前结点

p=p->next ;∥p指向下个待处理结点

u->prior=r->prior; ∥以下4个语句将结点插入链表尾

u->next=r;

r->prior->next=u;

r->prior=u;

r=u; ∥指向新的表尾

}

}

2.14 设单向链表的头指针为head,试设计算法,将链表按递增的顺序就地排序。

【题目分析】本题中的“就地排序”,可理解为不另辟空间,这里利用直接插入原则把链表整理成递增有序链表。

LinkedList LinkListInsertSort(LinkedList head)

∥head是带头结点的单链表,本算法利用直接插入原则将链表整理成递增的有序链表

{if(head->next!=null) ∥链表不为空表

{p=head->next->next; ∥p指向第一结点的后继

head->next->next=null;

∥直接插入原则认为第一元素有序,然后从第二元素起依次插入

while(p!=null)

{r=p->next; ∥暂存p的后继

q=head;

while(q->next && q->next->datadata)

q=q->next;∥查找插入位置

p->next=q->next; ∥将p结点链入链表

q->next=p;

p=r;

}

} }

2.15 已知递增有序的三个单链表分别代表集合A,B和C,设计算法实现A=A∪(B∩C),并使结果链表仍保持递增。要求算法的时间复杂度为O(|A|+|B|+|C|)。其中,|A|为集合A的元素个数。

【题目分析】本题首先求B和C的交集,即求B和C中共有元素,再与A求并集,同时删除重复元素,以保持结果A递增。

LinkedList union(LinkedList A,B,C)

∥A、B和C均是带头结点的递增有序的单链表,本算法实现A=A∪(B∩C)

∥使结果表A保持递增有序

{pa=A->next;pb=B->next;pc=C->next;∥设置三个工作指针

pre=A; ∥pre指向结果链表中当前待合并结点的前驱

A->data=MaxElemType;∥同类型元素最大值,起监视哨作用

while(pa || pb && pc)

{while(pb && pc)

if(pb->datadata) pb=pb->next;

else if(pb->data>pc->data) pc=pc->next;

else break; ∥B表和C表有公共元素

if(pb && pc)

{while(pa && pa->datadata)∥先将A中小于B,C公共元素部分链入{pre->next=pa;pre=pa;pa=pa->next;}

if(pre->data!=pb->data)

{pre->next=pb;pre=pb;pb=pb->next;pc=pc->next;}

else{pb=pb->next;pc=pc->next;}

∥若A中已有B,C公共元素,则不再存入结果表

}

}∥while(pa||pb&&pc)

if(pa) pre->next=pa;

else pre->next=null; ∥当B,C无公共元素,将A中剩余链入

}∥算法Union结束

2.16 顺序表la与lb非递减有序,顺序表空间足够大。试设计一种高效算法,将lb中元素合到la中,使新的la的元素仍保持非递减有序。高效指最大限度地避免移动元素。

【题目分析】顺序存储结构的线性表的插入,其时间复杂度为O(n),平均移动近一半的元素。线性表la和lb合并时,若从第一个元素开始,一定会造成元素后移,这不符合本题“高效算法”的要求。应从线性表的最后一个元素开始比较,大者放到最终位置上。设两线性表的长度各为m和n ,则结果表的最后一个元素应在m+n位置上。这样从后向前,直到第一个元素为止。

SeqList Union(SeqList la, SeqList lb)

∥la和lb是顺序存储的非递减有序线性表,本算法将lb合并到la中,元素仍非递减有序{ m=https://www.360docs.net/doc/5117451772.html,st;n=https://www.360docs.net/doc/5117451772.html,st;∥m,n分别为线性表la和lb的长度

k=m+n-1; ∥k为结果线性表的工作指针(下标)

i=m-1;j=n-1; ∥i,j分别为线性表la和lb的工作指针(下标)

while(i>=0 && j>=0)

if(la.data[i]>=lb.data[j]) la.data[k--]=la.data[i--];

else la.data[k--]=lb.data[j--];

while(j>=0) la.data[k--]=lb.data[j--];

https://www.360docs.net/doc/5117451772.html,st=m+n;

return la;

}

【算法讨论】算法中数据移动是主要操作。在最佳情况下(lb的最小元素大于la的最大元素),仅将lb的n个元素移(拷贝)到la中,时间复杂度为O(n),最差情况,la的所有元素都要移动,时间复杂度为O(m+n)。因数据合并到la中,所以在退出第一个while循环后,只需要一个while循环,处理lb中剩余元素。第二个循环只有在lb有剩余元素时才执行,而在la有剩余元素时不执行。本算法“最大限度的避免移动元素”,是“一种高效算法”。

2.17 已知非空线性链表由head指出,试写一算法,将链表中数据域值最小的那个结点移到链表的最前面。要求:不得额外申请新的链结点。

【题目分析】本题要求将链表中数据域值最小的结点移到链表的最前面。首先要查找最小值结点。将其移到链表最前面,实质上是将该结点从链表上摘下(不是删除并回收空间),再插入到链表的最前面。

LinkedList Delinsert(LinkedList head)

∥本算法将非空线性链表head中数据域值最小的那个结点移到链表的最前面

{p=head->next;∥p是链表的工作指针

pre=head;∥pre指向链表中数据域最小值结点的前驱

q=p;∥q指向数据域最小值结点,初始假定是第一结点

while (p->next)

{if(p->next->datadata){pre=p;q=p->next;} ∥找到新的最小值结点

p=p->next;

}

if(q!=head->next) ∥若最小值是第一元素结点,则不需再操作

{pre->next=q->next;∥将最小值结点从链表上摘下

q->next=head->next;∥将q结点插到链表最前面

head->next=q;

}

}∥Delinsert

2.18 设la是带头结点的非循环双向链表的指针,其结点中除有prior,data和next外,还有一访问频度域freq,其值在链表初始使用时为0。当在链表中进行ListLocate(la,x)运算时,若查找失败,则在表尾插入值为x的结点;若查找成功,值为x的结点的freq值增1,并要求链表按freq域值非增(递减)的顺序排列,且最近访问的结点排在频度相同的结点的后面,使频繁访问的结点总是靠近表头。试编写符合上述要求的ListLocate(la,x)运算的算法,返回找到结点的指针。

【题目分析】首先在双向链表中查找数据值为x的结点,查到后,将结点从链表上摘下,然后再顺结点的前驱链查找该结点的位置。

DLinkList ListLocate(DLinkedList L,ElemType x)

∥L是带头结点的按访问频度递减的双向链表,本算法先查找数据x

∥查找成功时结点的访问频度域增1,最后将该结点按频度递减插入链表中

{DLinkList p=L->next,q; ∥p为L表的工作指针,q为p的前驱,用于查找插入位置

while(p && p->data!=x) p=p->next;∥查找值为x的结点

if(!p) {printf(“不存在所查结点\n”); exit(0);}

else { p->freq++; ∥令元素值为x的结点的freq域加1

p->next->prior=p->prior; ∥将p结点从链表上摘下

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

q=p->prior; ∥以下查找p结点的插入位置

while(q !=L && q->freqfreq) q=q->prior;

p->next=q->next; q->next->prior=p;∥将p结点插入

p->prior=q; q->next=p;

}

return(p); ∥返回值为x的结点的指针

} ∥算法结束

2.19 三个带头结点的线性链表la、lb和lc中的结点均依元素值自小至大非递减排列(可能存在两个以上值相同的结点),编写算法对la表进行如下操作:使操作后的la中仅留下三个表中均包含的数据元素的结点,且没有值相同的结点,并释放所有无用结点。限定算法的时间复杂度为O(m+n+p),其中m、n和p分别为三个表的长度。

【题目分析】留下三个链表中公共数据,首先查找两表la和B中公共数据,再去lc中找有无该数据。要消除重复元素,应记住前驱,要求时间复杂度O(m+n+p),在查找每个链表时,指针不能回溯。

LinkedList lcommon(LinkedList la,lb,lc)

∥本算法使la表留下la、lb和lc三个非递减有序表共同结点,无重复元素

{pa=la->next;pb=lb->next;pc=lc->next;

∥pa,pb和pc分别是la,lb和lc三个表的工作指针

pre=la;

la->data=MaxElemType ∥pre是la表当前结点的前驱结点的指针,头结点作监视哨

while(pa && pb && pc)∥当la,lb和lc表均不空时,查找三表共同元素{while(pa&&pa->data==pre->data)

{u=pa; pa=pa->next; free(u);}//删la中相同元素

while(pb && pc)

if(pb->datadata)pb=pb->next; ∥结点元素值小时,后移指针

else if(pb->data>pc->data)pc=pc->next;

else break ;∥处理lb和lc表元素值相等的结点

if(pb && pc)

{while(pa && pa->datadata){u=pa;pa=pa->next;free(u);}

if(pa && pa->data>pc->data){pb=pb->next; pc=pc->next;}

else if(pa && pa->data==pc->data)∥pc,pa和pb对应结点元素值相等

{pre->next=pa;pre=pa;pa=pa->next;∥将新结点链入la表

pb=pb->next;pc=pc->next;∥链表的工作指针后移

}∥pc,pa和pb对应结点元素值相等

} }∥while(pa && pb && pc)

pre->next=null;∥置新la表表尾

while(pa!=null)∥删除原la表剩余元素。

{u=pa;pa=pa->next;free(u);}

}∥算法结束

【算法讨论】算法中la表、lb表和lc表均从头到尾(严格说lb、lc中最多一个到尾)遍历一遍,算法时间复杂度符合O(m+n+p)。算法主要由while(pa && pb && pc)控制。三表有一个到尾则结束循环。要注意头结点的监视哨的作用,否则第一个结点要特殊处理。算法最后要给新la表置结尾标记,同时若原la表没到尾,还应释放剩余结点所占的存储空间。

[注]:某些算法的格式可能不标准,请同学们参考时注意。

数据结构与算法习题及答案

第1章绪论 习题 1.简述下列概念:数据、数据元素、数据项、数据对象、数据结构、逻辑结构、存储结构、抽象数据类型。2.试举一个数据结构的例子,叙述其逻辑结构和存储结构两方面的含义和相互关系。 3.简述逻辑结构的四种基本关系并画出它们的关系图。 4.存储结构由哪两种基本的存储方法实现 5.选择题 (1)在数据结构中,从逻辑上可以把数据结构分成()。 A.动态结构和静态结构B.紧凑结构和非紧凑结构 C.线性结构和非线性结构D.内部结构和外部结构 (2)与数据元素本身的形式、内容、相对位置、个数无关的是数据的()。 A.存储结构B.存储实现 C.逻辑结构D.运算实现 (3)通常要求同一逻辑结构中的所有数据元素具有相同的特性,这意味着()。 A.数据具有同一特点 B.不仅数据元素所包含的数据项的个数要相同,而且对应数据项的类型要一致 C.每个数据元素都一样 D.数据元素所包含的数据项的个数要相等 (4)以下说法正确的是()。 A.数据元素是数据的最小单位 B.数据项是数据的基本单位 C.数据结构是带有结构的各数据项的集合 D.一些表面上很不相同的数据可以有相同的逻辑结构 (5)以下与数据的存储结构无关的术语是()。 A.顺序队列B.链表C.有序表D.链栈 (6)以下数据结构中,()是非线性数据结构 A.树B.字符串C.队D.栈 6.试分析下面各程序段的时间复杂度。 (1)x=90;y=100; while(y>0) if(x>100) {x=x-10;y--;} elsex++; (2)for(i=0;i

数据结构与算法基础知识总结

数据结构与算法基础知识总结 1 算法 算法:是指解题方案的准确而完整的描述。 算法不等于程序,也不等计算机方法,程序的编制不可能优于算法的设计。 算法的基本特征:是一组严谨地定义运算顺序的规则,每一个规则都是有效的,是明确的,此顺序将在有限的次数下终止。特征包括: (1)可行性; (2)确定性,算法中每一步骤都必须有明确定义,不充许有模棱两可的解释,不允许有多义性; (3)有穷性,算法必须能在有限的时间内做完,即能在执行有限个步骤后终止,包括合理的执行时间的含义; (4)拥有足够的情报。 算法的基本要素:一是对数据对象的运算和操作;二是算法的控制结构。 指令系统:一个计算机系统能执行的所有指令的集合。 基本运算和操作包括:算术运算、逻辑运算、关系运算、数据传输。 算法的控制结构:顺序结构、选择结构、循环结构。 算法基本设计方法:列举法、归纳法、递推、递归、减斗递推技术、回溯法。 算法复杂度:算法时间复杂度和算法空间复杂度。 算法时间复杂度是指执行算法所需要的计算工作量。 算法空间复杂度是指执行这个算法所需要的内存空间。 2 数据结构的基本基本概念 数据结构研究的三个方面: (1)数据集合中各数据元素之间所固有的逻辑关系,即数据的逻辑结构; (2)在对数据进行处理时,各数据元素在计算机中的存储关系,即数据的存储结构;(3)对各种数据结构进行的运算。 数据结构是指相互有关联的数据元素的集合。 数据的逻辑结构包含: (1)表示数据元素的信息; (2)表示各数据元素之间的前后件关系。 数据的存储结构有顺序、链接、索引等。 线性结构条件:

(1)有且只有一个根结点; (2)每一个结点最多有一个前件,也最多有一个后件。 非线性结构:不满足线性结构条件的数据结构。 3 线性表及其顺序存储结构 线性表由一组数据元素构成,数据元素的位置只取决于自己的序号,元素之间的相对位置是线性的。 在复杂线性表中,由若干项数据元素组成的数据元素称为记录,而由多个记录构成的线性表又称为文件。 非空线性表的结构特征: (1)且只有一个根结点a1,它无前件; (2)有且只有一个终端结点an,它无后件; (3)除根结点与终端结点外,其他所有结点有且只有一个前件,也有且只有一个后件。结点个数n称为线性表的长度,当n=0时,称为空表。 线性表的顺序存储结构具有以下两个基本特点: (1)线性表中所有元素的所占的存储空间是连续的; (2)线性表中各数据元素在存储空间中是按逻辑顺序依次存放的。 ai的存储地址为:adr(ai)=adr(a1)+(i-1)k,,adr(a1)为第一个元素的地址,k代表每个元素占的字节数。 顺序表的运算:插入、删除。(详见14--16页) 4 栈和队列 栈是限定在一端进行插入与删除的线性表,允许插入与删除的一端称为栈顶,不允许插入与删除的另一端称为栈底。 栈按照“先进后出”(filo)或“后进先出”(lifo)组织数据,栈具有记忆作用。用top表示栈顶位置,用bottom表示栈底。 栈的基本运算:(1)插入元素称为入栈运算;(2)删除元素称为退栈运算;(3)读栈顶元素是将栈顶元素赋给一个指定的变量,此时指针无变化。 队列是指允许在一端(队尾)进入插入,而在另一端(队头)进行删除的线性表。rear指针指向队尾,front指针指向队头。 队列是“先进行出”(fifo)或“后进后出”(lilo)的线性表。 队列运算包括(1)入队运算:从队尾插入一个元素;(2)退队运算:从队头删除一个元素。循环队列:s=0表示队列空,s=1且front=rear表示队列满

算法与数据结构试题及答案

数据结构试卷(一) 一、单选题(每题2 分,共20分) 1.栈和队列的共同特点是( )。 A.只允许在端点处插入和删除元素 B.都是先进后出 C.都是先进先出 D.没有共同点 2.用链接方式存储的队列,在进行插入运算时( ). A. 仅修改头指针 B. 头、尾指针都要修改 C. 仅修改尾指针 D.头、尾指针可能都要修改 3.以下数据结构中哪一个是非线性结构?( ) A. 队列 B. 栈 C. 线性表 D. 二叉树 4.设有一个二维数组A[m][n],假设A[0][0]存放位置在644(10),A[2][2]存放位置在 676(10),每个元素占一个空间,问A[3][3](10)存放在什么位置?脚注(10)表示用10进制表示。 A.688 B.678 C.692 D.696 5.树最适合用来表示( )。 A.有序数据元素 B.无序数据元素 C.元素之间具有分支层次关系的数据 D.元素之间无联系的数据 6.二叉树的第k层的结点数最多为( ). A.2k-1 B.2K+1 C.2K-1 D. 2k-1 7.若有18个元素的有序表存放在一维数组A[19]中,第一个元素放A[1]中,现进行二 分查找,则查找A[3]的比较序列的下标依次为( ) A. 1,2,3 B. 9,5,2,3 C. 9,5,3 D. 9,4,2,3 8.对n个记录的文件进行快速排序,所需要的辅助存储空间大致为 A. O(1) B. O(n) C. O(1og2n) D. O(n2) 9.对于线性表(7,34,55,25,64,46,20,10)进行散列存储时,若选用H(K) =K %9作为散列函数,则散列地址为1的元素有()个, A.1 B.2 C.3 D.4 10.设有6个结点的无向图,该图至少应有( )条边才能确保是一个连通图。 A.5 B.6 C.7 D.8 二、填空题(每空1分,共26分) 1.通常从四个方面评价算法的质量:_________、_________、_________和_________。 2.一个算法的时间复杂度为(n3+n2log2n+14n)/n2,其数量级表示为________。 3.假定一棵树的广义表表示为A(C,D(E,F,G),H(I,J)),则树中所含的结点数 为__________个,树的深度为___________,树的度为_________。 4.后缀算式9 2 3 +- 10 2 / -的值为__________。中缀算式(3+4X)-2Y/3对应的后缀算式 为_______________________________。 5.若用链表存储一棵二叉树时,每个结点除数据域外,还有指向左孩子和右孩子的两个指 针。在这种存储结构中,n个结点的二叉树共有________个指针域,其中有________个指针域是存放了地址,有________________个指针是空指针。 6.对于一个具有n个顶点和e条边的有向图和无向图,在其对应的邻接表中,所含边结点 分别有_______个和________个。 7.AOV网是一种___________________的图。 8.在一个具有n个顶点的无向完全图中,包含有________条边,在一个具有n个顶点的有 向完全图中,包含有________条边。 9.假定一个线性表为(12,23,74,55,63,40),若按Key % 4条件进行划分,使得同一余数的元 素成为一个子表,则得到的四个子表分别为____________________________、___________________、_______________________和__________________________。

算法与数据结构复习资料

算法与数据结构复习资料 一、单选题 在一个带有附加表头结点的单链表HL中,若要向表头插入一个由指针p指向的结点,则执行( B)。 A. HL=p;p->next=HL; B.p->next=HL->next;HL->next=p; C.p->next=HL;p=HL; D.p->next=HL;HL=p; 若顺序存储的循环队列的QueueMaxSize=n,则该队列最多可存储(B)个元素. A. n B.n-1 C.n+1 D.不确定 下述哪一条是顺序存储方式的优点?(A) A.存储密度大B.插入和删除运算方便 C. 获取符合某种条件的元素方便 D.查找运算速度快 设有一个二维数组A[m][n],假设A[0][0]存放位置在600 (10),A[3][3]存放位置在678 (10) , 每个元素占一个空间,问A[2][3] (10)存放在什么位置?(脚注 (10) 表示用10进制表示,m>3)C A.658 B.648 C.633 D.653 下列关于二叉树遍历的叙述中,正确的是( D) 。 A. 若一个树叶是某二叉树的中序遍历的最后一个结点,则它必是该二叉树的前序遍历最后一个结点 B.若一个点是某二叉树的前序遍历最后一个结点,则它必是该二叉树的中序遍历的最后一个结点 C.若一个结点是某二叉树的中序遍历的最后一个结点,则它必是该二叉树的前序最后一个结点 D.若一个树叶是某二叉树的前序最后一个结点,则它必是该二叉树的中序遍历最后一个结点 k层二叉树的结点总数最多为(A). A.2k-1 B.2K+1 C.2K-1 D. 2k-1 对线性表进行二分法查找,其前提条件是( C). A.线性表以链接方式存储,并且按关键码值排好序 B.线性表以顺序方式存储,并且按关键码值的检索频率排好序 C. 线性表以顺序方式存储,并且按关键码值排好序 D. 线性表以链接方式存储,并且按关键码值的检索频率排好序 对n个记录进行堆排序,所需要的辅助存储空间为(C) A. O(1og2n) B. O(n) C. O(1) D.O(n2) 对于线性表(7,34,77,25,64,49,20,14)进行散列存储时,若选用H(K)=K%7作为散列函数,则散列地址为0的元素有(D)个, A.1 B.2 C.3 D.4 下列关于数据结构的叙述中,正确的是( D). A. 数组是不同类型值的集合 B. 递归算法的程序结构比迭代算法的程序结构更为精炼 C. 树是一种线性结构 D. 用一维数组存储一棵完全二叉树是有效的存储方法 在决定选取何种存储结构时,一般不考虑( A )。 A.各结点的值如何B.结点个数的多少 C.对数据有哪些运算D.所用的编程语言实现这种结构是否方便 需要分配较大空间,插入和删除不需要移动元素的线性表,其存储结构是(B)。A.单链表B.静态链表C.线性链表D.顺序存储结构 设指针变量p指向单链表中结点A,若删除单链表中结点A,则需要修改指针的操作序列为(A)。 A.q=p->next;p->data=q->data;p->next=q->next;free(q); B.q=p->next;q->data=p->data;p->next=q->next;free(q); C.q=p->next;p->next=q->next;free(q);

数据结构与算法复习题及参考答案

复习题集─参考答案 一判断题 (√)1. 在决定选取何种存储结构时,一般不考虑各结点的值如何。 (√)2. 抽象数据类型与计算机部表示和实现无关。 (×)3. 线性表采用链式存储结构时,结点和结点部的存储空间可以是不连续的。 (×)4. 链表的每个结点中都恰好包含一个指针。 (×)5.链表的删除算法很简单,因为当删除链中某个结点后,计算机会自动地将后续的各个单元向前移动。(×)6. 线性表的每个结点只能是一个简单类型,而链表的每个结点可以是一个复杂类型。 (×)7. 顺序表结构适宜于进行顺序存取,而链表适宜于进行随机存取。 (×)8. 线性表在物理存储空间中也一定是连续的。 (×)9. 顺序存储方式只能用于存储线性结构。 (√)10.栈是一种对所有插入、删除操作限于在表的一端进行的线性表,是一种后进先出型结构。 (√)11.对于不同的使用者,一个表结构既可以是栈,也可以是队列,也可以是线性表。 (√)12.栈是一种对所有插入、删除操作限于在表的一端进行的线性表,是一种后进先出型结构。 (√)13.两个栈共享一片连续存空间时,为提高存利用率,减少溢出机会,应把两个栈的栈底分别设在这片存空间的两端。 (×)14.二叉树的度为2。 (√)15.若二叉树用二叉链表作存贮结构,则在n个结点的二叉树链表中只有n—1个非空指针域。 (×)16.二叉树中每个结点的两棵子树的高度差等于1。 (√)17.用二叉链表法存储包含n个结点的二叉树,结点的2n个指针区域中有n+1个为空指针。 (√)18.具有12个结点的完全二叉树有5个度为2的结点。 (√)19.二叉树的前序遍历序列中,任意一个结点均处在其孩子结点的前面。 (×)20.在冒泡法排序中,关键值较小的元素总是向前移动,关键值较大的元素总是向后移动。 (×)21.计算机处理的对象可以分为数据和非数据两大类。[计算机处理的对象都是数据] (×)22.数据的逻辑结构与各数据元素在计算机中如何存储有关。 (×)23.算法必须用程序语言来书写。 (×)24.判断某个算法是否容易阅读是算法分析的任务之一。 (×)25.顺序表是一种有序的线性表。[任何数据结构才用顺序存储都叫顺序表] (√)26.分配给顺序表的存单元地址必须是连续的。 (√)27.栈和队列具有相同的逻辑特性。[它们的逻辑结构都是线性表] (√)28.树形结构中每个结点至多有一个前驱。 (×)29.在树形结构中,处于同一层上的各结点之间都存在兄弟关系。 (×)30.如果表示图的邻接矩阵是对称矩阵,则该图一定是无向图。 (×)31.如果表示图的邻接矩阵是对称矩阵,则该图一定是有向图。 (×)32.顺序查找方法只能在顺序存储结构上进行。 (×)33.折半查找可以在有序的双向链表上进行。

数据结构与算法复习题库含答案

数据结构复习题 第一章概论 一、选择题 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 )。 fori0;im;i++ forj0;jn;j++ a[i][j]i*j; A. Om2 B. On2 C. Om*n D. Om+n 6、算法是( D )。

A. 计算机程序 B. 解决问题的计算方法 C. 排序算法 D. 解决问题的有限运算序列 7、某算法的语句执行频度为(3n+nlog2n+n2+8),其时间复杂度表示( C )。 A. On B. Onlog2n C. On2 D. Olog2n 8、下面程序段的时间复杂度为( C )。 i1; whilein ii*3; A. On B. O3n C. Olog3n D. On3 9、数据结构是一门研究非数值计算的程序设计问题中计算机的数据元素以及它们之间的( B )和运算等的学科。 A. 结构 B. 关系 C. 运算 D. 算法 10、下面程序段的时间复杂度是( A )。 is0; whilesn i++;s+i; A. On B. On2 C. Olog2n D. On3 11、抽象数据类型的三个组成部分分别为( A )。 A. 数据对象、数据关系和基本操作 B. 数据元素、逻辑结构和存储结构 C. 数据项、数据元素和数据类型 D. 数据元素、数据结构和数据类型 12、通常从正确性、易读性、健壮性、高效性等4个方面评价算法的质量,以下解释错误的是(D)。

算法与数据结构试题及答案

数据结构模拟试题... 一、简答题(15分,每小题3分) 1.简要说明算法与程序的区别。 2.在哈希表中,发生冲突的可能性与哪些因素有关?为什么? 3.说明在图的遍历中,设置访问标志数组的作用。 4.说明以下三个概念的关系:头指针,头结点,首元素结点。 5.在一般的顺序队列中,什么是假溢出?怎样解决假溢出问题? 二、判断题(10分,每小题1分) 正确在括号内打√,错误打× ( )(1)广义表((( a ), b), c ) 的表头是(( a ), b),表尾是( c )。 ( )(2)在哈夫曼树中,权值最小的结点离根结点最近。 ( )(3)基数排序是高位优先排序法。 ( )(4)在平衡二叉树中,任意结点左右子树的高度差(绝对值)不超过1。 ( )(5)在单链表中,给定任一结点的地址p,则可用下述语句将新结点s插入结点p的后面:p->next = s; s->next = p->next; ( )(6)抽象数据类型(ADT)包括定义和实现两方面,其中定义是独立于实现的,定义仅给出一个ADT的逻辑特性,不必考虑如何在计算机中实现。 ( )(7)数组元素的下标值越大,存取时间越长。 ( )(8)用邻接矩阵法存储一个图时,在不考虑压缩存储的情况下,所占用的存储空间大小只与图中结点个数有关,而与图的边数无关。 ( )(9)拓扑排序是按AOE网中每个结点事件的最早发生时间对结点进行排序。 ( )(10)长度为1的串等价于一个字符型常量。 三、单项选择题(10分, 每小题1分) 1.排序时扫描待排序记录序列,顺次比较相邻的两个元素的大小,逆序时就交换位置。这是哪种排序方法的基本思想? A、堆排序 B、直接插入排序 C、快速排序 D、冒泡排序 2.已知一个有向图的邻接矩阵表示,要删除所有从第i个结点发出的边,应该: A)将邻接矩阵的第i行删除B)将邻接矩阵的第i行元素全部置为0 C)将邻接矩阵的第i列删除D)将邻接矩阵的第i列元素全部置为0 3.有一个含头结点的双向循环链表,头指针为head, 则其为空的条件是: A.head->priro==NULL B. head->next==NULL C. head->next==head D. head->next-> priro==NULL 4. 在顺序表( 3, 6, 8, 10, 12, 15, 16, 18, 21, 25, 30 ) 中,用折半法查找关键码值11,所需的关键码比

数据结构与算法知识点必备

数据结构与方法 1、算法的基本特征:可行性、确定性、有穷性、拥有足够的情报 2、算法的基本运算与操作:算术运算、逻辑运算、关系运算、数据传输 3、算法的基本控制结构:顺序结构、选择结构、循环(重复)结构 4、算法设计的基本方法:列举法、归纳法、递推、递归、减半递推技术、回溯法 5、算法的复杂度主要包括:时间复杂度、空间复杂度 6、算法的时间复杂度:指执行算法所需要的计算工作量 7、算法的空间复杂度:指执行这个算法所需要的内存空间 8、数据结构主要研究:数据的逻辑结构、数据的存储结构、对各种数据结构进行的运算 9、数据结构研究的目的:提高数据处理的效率 10、数据处理的效率:数据处理的速度、减少处理过程中占用计算机的存储空间 11、数据处理:指对数据集合中的各元素以各种方式进行运算 12、数据元素:指在数据处理中,每一个需要处理的对象都可以抽象成数据元素 13、数据结构:指反映数据元素之间关系的数据元素集合的表示 14、数据的逻辑结构:指反映数据元素之间逻辑关系的数据结构,两要素:数据元素的集合、数据元素在集合上的关系 15、数据的存储结构:指数据的逻辑结构在计算机存储空间的存放形式,常用的存储结构有:顺序、链接、索引等 16、数据结构的图形表示中每个元素加上方框成为结点 17、数据结构一般分为:线性结构、非线性结构 18、线性结构满足:有且仅有一个根结点、每个结点最多有一个前件与后件、在一个线性结构中插入与删除任何一个结点后还就是线性结构 19、线性表定义:线性表就是由n个数据元素a1、a2、a3、a4……an组成的一个有限序列,表中每一个数据元素,除了第一个外,有且仅有一个前件,除了最后一个外,有且仅有一个后件20、非线性表的特征:有且只有一个根节点a1,它无前件、有且只有一个终结点an,它无后件、除了第一个与最后一个外,其她所有结点只有一个前件与一个后件 21、线性表的长度:线性表中的结点的个数n成为线性表的长度,当n=0时,成为空表 22、线性表的顺序存储的特点:所有元素所占的存储空间就是连续的、各数据元素在存储空间中就是按逻辑顺序一次存放的 23、线性表的随机存取地址计算公式:ADD(ai)=ADD(a1)+(i-1)*k 24、线性表的主要操作:插入、删除、查找、排序、分解、合并、复制、逆转 25、栈的定义:栈就是限定在一端进行插入与删除的线性表,它按照“先进后出,后进先出”的原则组织数据 26、栈的顺序存储:在程序设计语言中,一般一维数组S(1:m)作为栈的顺序存储空间,其中m 为栈的最大容量 27、栈的基本运算:入栈、退栈、读栈顶元素 28、入栈运算:首先将栈顶指针(top)加1,然后将新元素插入到栈顶指针指向的位置。当栈顶指针已经指向存储空间的最后一个位置时,说明栈空间已满,称为“上溢”错误 29、退栈运算:首先将栈顶元素赋给一个指定的变量,然后将栈顶指针(top)减1。当栈顶指针为0时,说明栈空,成为“下溢”错误 30、队列的定义:队列就是指允许在一端进行插入,而在另一端进行删除的线性表,它按照“先进先出”的原则组织数据 31、循环队列:在实际应用中,队列的顺序存储结构一般采用循环队列的形式。所谓循环队列,

算法与数据结构习题

《算法与数据结构》习题1 第一部分 一、单项选择题 1.()二叉排序树可以得到一个从小到大的有序序列。 A、先序遍历 B、中序遍历 C、后序遍历 D、层次遍历 2.设按照从上到下、从左到右的顺序从1开始对完全二叉树进行顺序编号,则编号为i 结点的左孩子结点的编号为()。 A、2i+1 B、2i C、i/2 D、2i-1 3.设指针变量p指向单链表中结点A,若删除单链表中结点A,则需要修改指针的操作序 列为()。 A、q=p->next;p->data=q->data;p->next=q->next;free(q); B、q=p->next;q->data=p->data;p->next=q->next;free(q); C、q=p->next;p->next=q->next;free(q); D、q=p->next;p->data=q->data;free(q); 4.设某棵二叉树的中序遍历序列为ABCD,前序遍历序列为CABD,则后序遍历该二叉树得 到序列为()。 A、BADC B、BCDA C、CDAB D、CBDA 5.设某有向图的邻接表中有n个表头结点和m个表结点,则该图中有()条有向边。 A、n B、n-1 C、m D、m-1 6.设二叉排序树中有n个结点,则在二叉排序树的平均平均查找长度为()。 A、O(1) B、O(log2n) C、O(nlog2n) D、O(n2) 7.设有序表中有1000个元素,则用二分查找查找元素X最多需要比较()次。 A、25 B、10 C、7 D、1 二、填空题 1.设指针变量p指向双向链表中的结点A,指针变量s指向被插入的结点X,则在结点A 的后面插入结点X的操作序列为______=p;s->right=p->right;______=s; p->right->left=s;(设结点中的两个指针域分别为left和right)。 2.一个算法的时间复杂度为(n3+n2log2n+14n)/n2,其数量级表示为______。 3.设一棵三叉树中有50个度数为0的结点,21个度数为2的结点,则该二叉树中度数为 3的结点数有______个。 4.后缀算式9 2 3 + - 10 2 / -的值为______。中缀算式(3+4X)-2Y/3对应的后缀算式 为______。 5.设初始记录关键字序列为(K1,K2,…,Kn),则用筛选法思想建堆必须从第______个元 素开始进行筛选。 6.对于一个具有n个顶点和e条边的有向图和无向图,在其对应的邻接表中,所含边结点

数据结构与算法分析习题与参考答案

大学 《数据结构与算法分析》课程 习题及参考答案 模拟试卷一 一、单选题(每题 2 分,共20分) 1.以下数据结构中哪一个是线性结构?( ) A. 有向图 B. 队列 C. 线索二叉树 D. B树 2.在一个单链表HL中,若要在当前由指针p指向的结点后面插入一个由q指向的结点, 则执行如下( )语句序列。 A. p=q; p->next=q; B. p->next=q; q->next=p; C. p->next=q->next; p=q; D. q->next=p->next; p->next=q; 3.以下哪一个不是队列的基本运算?() A. 在队列第i个元素之后插入一个元素 B. 从队头删除一个元素 C. 判断一个队列是否为空 D.读取队头元素的值 4.字符A、B、C依次进入一个栈,按出栈的先后顺序组成不同的字符串,至多可以组成( ) 个不同的字符串? A.14 B.5 C.6 D.8 5.由权值分别为3,8,6,2的叶子生成一棵哈夫曼树,它的带权路径长度为( )。 以下6-8题基于图1。 6.该二叉树结点的前序遍历的序列为( )。 A.E、G、F、A、C、D、B B.E、A、G、C、F、B、D C.E、A、C、B、D、G、F D.E、G、A、C、D、F、B 7.该二叉树结点的中序遍历的序列为( )。 A. A、B、C、D、E、G、F B. E、A、G、C、F、B、D C. E、A、C、B、D、G、F E.B、D、C、A、F、G、E 8.该二叉树的按层遍历的序列为( )。

A.E、G、F、A、C、D、B B. E、A、C、B、D、G、F C. E、A、G、C、F、B、D D. E、G、A、C、D、F、B 9.下面关于图的存储的叙述中正确的是( )。 A.用邻接表法存储图,占用的存储空间大小只与图中边数有关,而与结点个数无关 B.用邻接表法存储图,占用的存储空间大小与图中边数和结点个数都有关 C. 用邻接矩阵法存储图,占用的存储空间大小与图中结点个数和边数都有关 D.用邻接矩阵法存储图,占用的存储空间大小只与图中边数有关,而与结点个数无关 10.设有关键码序列(q,g,m,z,a,n,p,x,h),下面哪一个序列是从上述序列出发建 堆的结果?( ) A. a,g,h,m,n,p,q,x,z B. a,g,m,h,q,n,p,x,z C. g,m,q,a,n,p,x,h,z D. h,g,m,p,a,n,q,x,z 二、填空题(每空1分,共26分) 1.数据的物理结构被分为_________、________、__________和___________四种。 2.对于一个长度为n的顺序存储的线性表,在表头插入元素的时间复杂度为_________, 在表尾插入元素的时间复杂度为____________。 3.向一个由HS指向的链栈中插入一个结点时p时,需要执行的操作是________________; 删除一个结点时,需要执行的操作是______________________________(假设栈不空而 且无需回收被删除结点)。 4.对于一棵具有n个结点的二叉树,一个结点的编号为i(1≤i≤n),若它有左孩子则左 孩子结点的编号为________,若它有右孩子,则右孩子结点的编号为________,若它有 双亲,则双亲结点的编号为________。 5.当向一个大根堆插入一个具有最大值的元素时,需要逐层_________调整,直到被调整 到____________位置为止。 6.以二分查找方法从长度为10的有序表中查找一个元素时,平均查找长度为________。 7.表示图的三种常用的存储结构为_____________、____________和_______________。 8.对于线性表(70,34,55,23,65,41,20)进行散列存储时,若选用H(K)=K %7 作为散列函数,则散列地址为0的元素有________个,散列地址为6的有_______个。 9.在归并排序中,进行每趟归并的时间复杂度为______,整个排序过程的时间复杂度为 ____________,空间复杂度为___________。 10.在一棵m阶B_树上,每个非树根结点的关键字数目最少为________个,最多为________ 个,其子树数目最少为________,最多为________。 三、运算题(每题 6 分,共24分) 1.写出下列中缀表达式的后缀形式: (1)3X/(Y-2)+1 (2)2+X*(Y+3) 2.试对图2中的二叉树画出其: (1)顺序存储表示的示意图; (2)二叉链表存储表示的示意图。 3.判断以下序列是否是小根堆? 如果不是, 将它调 图2 整为小根堆。 (1){ 12, 70, 33, 65, 24, 56, 48, 92, 86, 33 } (2){ 05, 23, 20, 28, 40, 38, 29, 61, 35, 76, 47, 100 } 4.已知一个图的顶点集V和边集E分别为: V={1,2,3,4,5,6,7};

数据结构与算法设计知识点

数据结构与算法设计知识点 试题类型: 本课程为考试科目(闭卷笔试),试题类型包括:概念填空题(10 %),是非判断题(10 %),单项选择题(40 %),算法填空题(10%),算法应用题(20 %),算法设计题(10 %)。 第一章绪论 重点内容及要求: 1、了解与数据结构相关的概念(集合、数据、数据元素、数据项、关键字、元 素之间的关系等)。 数据:所有能被输入到计算机中,且能被计算机处理的符号的 集合。是计算机操作的对象的总称。是计算机处理的信息的某种特定 的符号表示形式。 数据元素:是数据(集合)中的一个“个体”,数据结构中的基本 单位,在计算机程序中通常作为一个整体来考虑和处理。 数据项:是数据结构中讨论的最小单位,数据元素可以是一个或 多个数据项的组合 关键码:也叫关键字(Key),是数据元素中能起标识作用的数 据项。 其中能起到唯一标识作用的关键码称为主关键码(简称主码); 否则称为次关键码。通常,一个数据元素只有一个主码,但可以有多 个次码。 关系:指一个数据集合中数据元素之间的某种相关性。 数据结构:带“结构”的数据元素的集合。这里的结构指元素之 间存在的关系。 数据类型:是一个值的集合和定义在此集合上的一组操作的总

称。 2、掌握数据结构的基本概念、数据的逻辑结构(四种)和物理结构(数据元素 的表示与关系的表示、两类存储结构:顺序存储结构和链式存储结构)。 数据结构包括逻辑结构和物理结构两个层次。 数据的逻辑结构:是对数据元素之间存在的逻辑关系的一种抽象的描述,可以用一个数据元素的集合和定义在此集合上的若干关系来表示 逻辑结构有四种:线性结构、树形结构、图状结构、集合结构数据的物理结构:是其逻辑结构在计算机中的表示或实现,因此又称其为存储结构。 存储结构:顺序存储结构和链式存储结构 顺序存储结构:利用数据元素在存储器中相对位置之间的某种特定的关系来表示数据元素之间的逻辑关系; 链式存储结构:除数据元素本身外,采用附加的“指针”表示数据元素之间的逻辑关系。 3、了解算法分析的基本方法,掌握算法时间复杂度相关的概念。 算法:是为了解决某类问题而规定的一个有限长的操作序列 或处理问题的策略 一个算法必须满足以下五个重要特性:1.有穷性2.确定性3.可行性4.有输入5.有输出 设计算法时,通常还应考虑满足以下目标: 1.正确性, 2.可读性, 3.健壮性 4.高效率与低存储量需求

算法与数据结构练习题

《算法与数据结构》习题1 一、单项选择题 1. 数据结构从逻辑上分为()。 A.动态结构和静态结构 B.内部结构和外部结构 C.紧凑结构和非紧凑结构 D.线性结构和非线性结构 2. 栈和队列的共同点是()。 A.都是先进后出 B.都是后进先出 C.只允许在端点处插入和删除元素 D.没有共同点 3.若按从左到右的顺序读入已知序列a、b、c、d、e、f、g中的元素,然后结合栈的操作,能得到下列序列中的哪些序列?() A.decfbga B.fegdacb C.efdgbca D.dcbefag 4. 在一个单链表中,若q结点是p结点的前驱结点,若在q与p之间插入结点 s,则执行()。 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.算法的计算量的大小称为计算的()。 A.效率 B. 复杂性 C. 现实性 D. 难度 6. 一个算法应该是()。 A.程序 B.问题求解步骤的描述 C.要满足五个基本特性 D.A和C 7. 从逻辑上可以把数据结构分为()两大类。 A.动态结构、静态结构 B.顺序结构、链式结构 C.线性结构、非线性结构 D.初等结构、构造型结构 8. 以下数据结构中,哪一个是线性结构?() A.广义表 B. 二叉树 C. 稀疏矩阵

D. 串 二、多项选择题 1. 以下说法正确的是()。 A. 二叉树的特点是每个结点至多只有两棵子树 B. 二叉树的子树无左右之分 C. 二叉树只能进行链式存储 D. 树的结点包含一个数据元素及若干指向其子树的分支2.在数组上能做的操作有()。 A.插入 B.删除 C.取值操作 D.赋值操作 3. 图的应用算法有()。 A. 克鲁斯卡尔算法 B. 哈弗曼算法 C. 迪杰斯特拉算法 D. 拓扑排序算法 4. 计算机算法必须具备()等特性。 A. 可行性、确定性 B. 可行性、可移植性 C. 输入、输出

北邮算法与数据结构习题参考答案

作业参考答案 一、(带头结点)多项式乘法 C = A×B: void PolyAdd ( list &C, list R) // R 为单个结点 { p=C; while ((!p->next) && (p->next->exp>R->exp)) p=p->next; if ((p->next) || (p->next->expexp)) { R->next=p->next; p->next=R; } else { p->next->inf += R->inf; delete R; if ( ! p->next->inf ) { R=p->next; p->next=R->next; delete R; } } } void PolyMul ( list A, list B, list &C ) { C=new struct node; C->next=NULL; q=B->next; While ( q ) { p=A->next; while ( p ) { r = new struct node; r->exp = p->exp + q->exp; r->inf = p-> inf * q->inf; PolyAdd(C, r); p=p->next; } q=q->next; } } 二、梵塔的移动次数: 已知移动次数迭代公式为: M ( n ) = 2M ( n-1 ) + 1 初值为: M ( 0 ) = 0 则: M ( n ) = 2 ( 2M ( n-2 ) + 1 ) + 1 = 4M ( n-2 ) + 3

= 8M ( n-3 ) + 7 = 2i M ( n-i ) + 2i– 1 若n=i ,则M ( n-n ) = 0,故:M ( n ) = 2n M ( n-n ) + 2n– 1 = 2n– 1 所以,梵塔的移动次数为2n– 1次。 三、简化的背包问题: void Pack ( int m, int i, int t ) // 初始值为: 1 1 t { for ( k=i; k<=n; k++ ) { solution[m] = weight[k]; if ( t == weight[k] ) { for ( j=1; j<=m; j++ ) cout< weight[k] ) Pack ( m+1, k+1, t - weight[k] ); } } 四、判断括号是否配对: int Correct ( string s ) { Inistack(Q); for ( i=0; s[i] == ‘=’; i++ ) // 表达式以‘=’结束 { switch ( s[i] ) { case ‘(’: case ‘[’: case ‘{’: Push ( Q, s[ i ] ); break; case ‘)’: case ‘]’: case ‘}’:

数据结构和C++程序设计_题库

《数据结构》 Part1 一.选择 1. 组成数据的基本单位是() A)数据项B)数据类型C)数据元素D)数据变量 2.算法分析的目的是() A)找出数据结构的合理性B)研究算法的输入/输出关系 C)分析算法的效率以求改进D)分析算法的易读性 3.在一个具有n个结点的有序单链表中插入一个新结点并仍然有序的时间复杂度是()A)O(1) B)0(n) C)O(n^2) D)O(nlog2n) 4.若线性表采用顺序存储结构,每个元素占用4个存储单元,第一个元素的存储地址为100,则第12个元素的存储地址是() A)112 B)144 C)148 D)412 5.下面关于线性表的叙述中,错误的是() A)顺序表使用一维数组实现的线性表B)顺序表必须占用一片连续的存储单元. C)顺序表的空间利用率高于链表D)在单链表中,每个结点只有一个链域. 6.在需要经常查找结点的前驱与后继的情况下,使用()比较合适 A)单链表B)双链表C)顺序表D)循环链表 7.队列通常采用的两种存储结构是() A)顺序存储结构和链式存储结构B)散列方式和索引方式 C)链表存储结构和线性存储结构D)线性存储结构和非线性存储结构 8.在一个单链表中,若删除p所指结点的后继结点,则执行() A)p->next=p->next->next;B)p=p->next;p->nex=p->next->next; C)p->next=p->next;D)p=p->next->next; 9.若某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用()存储方式最节省运算时间 A)单链表B)仅有头指针的单循环链表C)双链表D)仅有尾指针的单循环链表 10.按二叉树的定义,具有三个结点的二元树共有()种形态。 A)3 B)4 C)5 D)6 11.任何一棵二叉树的叶结点在先序、中序和后序遍历序列中的相对次序()A)发生改变B)不发生改变C)不能确定D)以上都不对12.深度为5的二叉树至多有()个结点 A)16 B)32 C)31 D)10 13.在一棵度为3的树中,度为3的结点数为2个,度为2的结点数为1个,度为1的结点数为2个,那么度为0的结点数为()个。 A)4 B)5 C)6 D)7 14.对于一个具有n个顶点的无向图,若采用邻接表表示,则存放表头结点的数组(顶点表)的大小为() A)n B)n+1 C)n-1 D)n/2 15.静态查找表和动态查找表二者的根本差别在于()

数据结构与算法试题

数据结构与算法试题 一、单选题 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

相关文档
最新文档