当前位置:文档之家› 数据结构实用教程习题答案

数据结构实用教程习题答案

数据结构实用教程习题答案
数据结构实用教程习题答案

1 绪论

1.1回答下列概念:数据结构,数据的逻辑结构,数据的存储结构,算法

数据结构:按照某种逻辑关系组织起来的一批数据,用一定的存储方式存储在计算机的存储器中,并在这些数据上定义一个运算的集合,就称为一个数据结构。

数据的逻辑结构:数据元素之间的逻辑关系,是根据实际问题抽象出来的数学模型。

数据的存储结构:是指数据的逻辑结构到计算机存储器的映射。

算法:是指对数据元素进行加工和处理

1.2数据结构研究的三方面内容是什么?它们之间有什么联系和区别?

三方面内容: 数据的逻辑结构、数据的存储结构和数据运算的集合。

联系和区别:数据的逻辑结构是数学模型,数据的存储结构是指逻辑结构到存储区域的映射,运算是定义在逻辑结构上,实现在存储结构上。

1.3简述数据结构中讨论的三种经典结构及其逻辑特征。

三种经典结构:线性表、树和图。

线性表:有且仅有一个开始结点和一个终端结点,其余的内部结点都有且仅有一个前趋结点和一个后继结点,数据元素间存在着一对一的相互关系。

树:有且仅有一个开始结点,可有若干个终端结点,其余的内部结点都有且仅有一个前趋结点,可以有若干个后继结点,数据元素间存在着一对多的层次关系。

图:可有若干个开始结点和终端结点,其余的内部结点可以有若干个前趋结点和若干个后继结点,数据元素间存在着多对多的网状关系。

1.4实现数据存储结构的常用存储方法有哪几种?简述各种方法的基本思想。

常用存储方法有四种:顺序存储、链接存储、索引存储、散列存储。

各种方法的基本思想:

顺序存储:把逻辑上相邻的数据元素存储在物理位置上相邻的存储单元里。

链接存储:通过附加指针域表示数据元素之间的关系。

索引存储:除了存储数据元素,还要建立附加索引表来标识数据元素的地址。

散列存储:根据数据元素的关键字直接计算出该结点的存储地址,称为关键字-地址转换法。

1.5算法的特性是什么?如何定性的评价一个算法的优劣?

算法的特性:有穷性、确定性、可行性、输入、输出。

算法的定性评价标准有:正确性、可读性、健壮性、简单性。

1.6算法的定量评价标准是什么?

算法的定量评价标准有:时间复杂度和空间复杂度。

时间复杂度:是一个算法运行时所耗费的系统时间,也就是算法的时间效率。

空间复杂度:是一个算法运行时所耗费的存储空间,也就是算法的空间效率。

1.7 写出下列程序段中带标号语句的频度,并给出执行各程序段的时间复杂度(n为整数)。

(1)i=1; (2)s=1;

while(i

【1】i++; 【1】s=s*i;

(3)s=0; (4)i=1;

for(i=l;i

for (j=n;j>=i;j--) 【1】i++;

【1】s=s+i+j;

(5)i=1;(6)x=1;y=100;

while(i

【1】i=i*2; 【1】x++;y--;

}While(x

答:(1) n-1, O(n) (2)n,O(n) (3)(n+2)(n-1)/2, O(n2)

(4

(5)㏒(n-1)+1,O(n) (6)50,O(1)

2 线性表

2.1 回答下列概念:线性结构,线性表,顺序表,单链表,静态链表

线性结构:设Data_Structure =(D,S),r∈S,相对r,D中有且仅有一个开始结点和一个终端结点,其余的内部结点都有且仅有一个前趋和一个后继,则称Data_Structure是相

对r的线性结构。

线性表:是具有相同属性的n(n≥0)个数据元素的有限序列。

顺序表:顺序表(Sequential List)是采用顺序存储结构的线性表。

单链表:每个结点只附加一个指向后继的指针域,这样的链表称为单链表

(Single Linked List)

静态链表:用数组实现的链表,指针就变换为数组的下标,结点即为数组中的下标变量,由于需要预先分配一个较大的数组空间,因此这种链表称之为静态链表。

2.2 比较顺序表和链表这两种线性表不同存储结构的特点。

1.逻辑关系的表示:顺序表隐含表示关系,链表显示表示关系。

2.存储密度:顺序表的存储密度大,而链表的存储密度小。

3.存储分配方式:顺序表的存储空间是预先静态分配的一块连续存储空间,在程序执行之前必

须明确规定它的存储规模。链表不用事先估计存储规模,动态分配和释放存

储空间,存储空间可连续也可不连续。

4.存取方法:顺序表可以随机存取,链表必须顺序存取。

5.插入、删除操作:在顺序表中做插入、删除时平均移动表中一半的元素;在链表中作插入、

删除时,只要修改指针域,而不需要移动元素。所以顺序表的插入、删除

效率低,链表的插入、删除效率高。

6.实现语言:顺序表容易实现,任何高级语言中都有数组类型。而链表的操作是基于指针的,对于没有提供指针类型的高级语言,必须采用静态链表。

总之,两种存储结构各有长短,选择那一种由实际问题中的主要因素决定。通常“较稳定”的线性表选择顺序存储,而频繁做插入、删除的线性表,即动态性较强的线性表宜选择链接存储。2.3 已知长度为n的线性表A中的元素是整数,写算法求线性表中值大于item的元素个数。分两

种情况编写函数:(1)线性表采用顺序存储;(2)线性表采用单链表存储。

(1)线性表采用顺序存储

#define MAX 1024

typedef int DataType;

typedef struct

{ DataType data[MAX];

int last;

} SeqList;

int LocateElem (SeqList *L, DataType item)

{ int i,j=0;

for(i=0;i<=L->last ;i++)

if( L->data[i] >item ) j++;

return j;}

(2)线性表采用单链表存储

typedef int DataType;

typedef struct Node

{ DataType data;

struct Node *next;

}LinkList;

LinkList *locateElem(LinkList *L, DataType item )

{ LinkList *p=L->next;

int i=0;

while ( p )

{if( p->data >item) i++; p=p->next;}

return i ;

}

2.4 已知长度为n的线性表A中的元素是整数,写算法删除线性表中所有值为item的数据元素。

分两种情况编写函数:(1)线性表采用顺序存储;(2)线性表采用单链表存储。

(1)线性表采用顺序存储

#define MAX 1024

typedef int DataType;

typedef struct

{ DataType data[MAX];

int last;

} SeqList;

int LocateElem (SeqList *L, DataType item)

{ int i=0;

While(i<=L->last)

if( L->data[i] ==item )

{for(j=i+1;j<=L->last;j++) L->data[j-1]=L->data[j]; L->last --; }

Else i++;

}

(2)线性表采用单链表存储

typedef int DataType;

typedef struct Node

{ DataType data;

struct Node *next;

}LinkList;

int deleteDupNode(LinkList *L, DataType item)

{ LinkList *p,*q,*r;

q= L; p=L->next;

while (p)

if (p->data==item) {q->next=p->next; free(p); p=q->next;}

else { q=p; p=p->next; }

}

2.5 设长度为Max的顺序表L中包含n个整数且递增有序。试写一算法,将x 插入到顺序表的适

当位置上,以保持表的有序性,并且分析算法的时间复杂度。

#define MAX 1024

typedef int DataType;

typedef struct

{ DataType data[MAX];

int last;

} SeqList;

int inserts(SeqList *L, DataType x)

{int i;

if (L->last ==Max-1) {printf(“full”); return 0;}

i= L->last;

while(i>=0&& L->data[i] >x)

L->data [i+1]= L->data [i--];

L->data [i+1]=x; L->last ++; return 1;

}

2.6 设带头结点的单链表L中的数据元素是整型数且递增有序。试写一算法,将x 插入到单链表

的适当位置上,以保持表的有序性,并且分析算法的时间复杂度。

typedef int DataType;

typedef struct Node

{ DataType data;

struct Node *next;

}LinkList;

void InsertList(LinkList *L,datetype x)

{LinkList *p,*s;

s=(LinkList *)malloc(sizeof(Linklist));

s->data=x;

p=L;

while((p->next)&&(p->next->data

p=p->next;

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

}

2.7 试写一算法实现对不带头结点的单链表H进行就地逆置。

typedef int DataType;

typedef struct Node

{ DataType data;

struct Node *next;

}LinkList;

LinkList * Reverse(LinkList *H)

{ L inkList *p,*q;

if (!H) return;

p=H->next; q=H->next; H->next=NULL;

While(q)

{q=q->next; p->next= H; H =p; p=q;}

return H;

}

2.8 若带头结点的单链表L中的数据元素是整型数,编写算法对单链表L进行排序。

typedef int DataType;

typedef struct Node

{ DataType data;

struct Node *next;

}LinkList;

void InsertList(LinkList *L)

{LinkList *p,*q,*s;

if (!L->next ||!L->next->next) return;

q= L->next->next; L->next->next= NULL;

while(q)

{s=q; q=q->next;

p=L;

while((p->next)&&(p->next->data< s->data )) p=p->next;

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

}

}

2.9 设单链表X和单链表Y分别存储了两个字符串,设计算法找出X中第一个不在Y中出现的字符。

typedef char DataType;

typedef struct Node

{ DataType data;

struct Node *next;

}LinkList;

linklist *search(linklist *x, linklist *y)

{linklist *p,*q;

p=x; q=y;

while(p&&q)

{if(p->data!=q->data) q=q->next;

else {p=p->next; q=y;}

} return p; }

2.10 已知递增有序的两个单链表A和B各存储了一个集合。设计算法实现求两个集合的交集运算

C=A∩B。

typedef int DataType;

typedef struct Node

{ DataType data;

struct Node *next;

}LinkList;

LinkList *union(LinkList *A,LinkList *B)

{ LinkList *C, *p,*q,*s*r;

p=A->next;q=B->next;

C=A; r=C;

while (p&&q)

{ if (p->data==q->data)

{ r->next=p; r=p;

p=p->next;

q=q->next;

}

else if (p->datadata) p=p->next;

else q=q->next;

}

r->next= NULL ;

free(B); return C;

}

2.11 已知递增有序的两个单链表A和B,编写算法将A、B归并成一个递增有序的单链表C。

typedef int DataType;

typedef struct Node

{ DataType data;

struct Node *next;

}LinkList;

LinkList *union(LinkList *A,LinkList *B)

{ LinkList *C, *p,*q,*s*r;

p=A->next;q=B->next;

C=A; r=C;

while (p&&q)

{ if (p->data<=q->data)

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

else

{ s=q; q=q->next;}

r->next=s;r=s;

}

if (!q) r->next=q;

else r->next=p;

free(B);

return C;

}

3 栈和队列

3.1 回答下列概念:栈,队列,顺序栈,链队列

栈:栈(Stack)是运算受限的线性表,限制它的插入和删除操作仅在表的一端进行。

队列:只允许在表的一端进行插入,而在表的另一端进行删除,将这种线性表称为队或队列(Queue)。

顺序栈:采用顺序方式存储的栈称为顺序栈(Sequential Stack)。

链队列:采用链接方法存储的队列称为链队列(Linked Queue)。

3.2 栈和队列各有什么特点?简述栈、队列和线性表的差别。

栈(Stack)是运算受限的线性表,限制它的插入和删除操作仅在表的一端进行,又称为后进先出的线性表(Last In First Out),简称LIFO表。

只允许在表的一端进行插入,而在表的另一端进行删除,将这种线性表称为队或队列(Queue),又叫先进先出的线性表,简称为FIFO(First In First Out)表。

这三种结构有很多的相似之处,其差别主要体现在运算上,具有不同的运算特点。同线性表的运算相比,栈和队列在操做上受到限制。线性表可以在元素序列的任何位置上进行插入、删除操作,查找运算往往是线性表上使用频率最高的操作。查找、插入、删除的时间复杂度一般为O(n)。栈和队列的插入和删除运算都限制在线性表的表端完成,在栈和队列上不需要查找运算。栈和队列的插入及删除运算时间复杂度都可以为O(1)。

3.3 设有编号为1,2,3,4的四辆车,顺序进入一个栈式结构的站台,试写出这四辆车开出车站的

所有可能的顺序。

1 2 3 4 2 1 3 4 3 2 1 4 4 3 2 1

1 2 4 3 2 1 4 3 3 2 4 1

1 3

2 4 2

3 1

4 3 4 2 1

1 3 4

2 2

3

4 1

1 4 3

2 2 4

3 1

3.4 若数列1、2、3、4、5、6顺序进栈,假设P表示入栈操作,S表示出栈操作,例如:操作序列

PSPSPSPSPSPS,可得到出栈序列为:123456。依此类推,请回答:

(1)能否得到出栈序列325641?若能,请写出对应的操作序列。

(2)能否得到出栈序列154623?若能,请写出对应的操作序列。

(3)对应操作序列:PPSSPPSPSPSS,得到的出栈序列是什么?

(4)对应操作序列:PPPPSPSSPSSS,得到的出栈序列是什么?

(5)从上面的结果中你能总结出什么结论?

(1)能得到325641。在123依次进栈后,3和2出栈,得部分输出序列32;然后4,5入栈,5出栈,得部分出栈序列325;6入栈并出栈,得部分输出序列3256;最后退栈,直到栈空。得输出序列325641。其操作序列为PPPSSPPSPSSS。

(2)不能得到输出顺序为154623的序列。部分合法操作序列为ADAAAADDAD,得到部分输出序列1546后,栈中元素为23,3在栈顶,故不可能2先出栈,得不到输出序列154623。

(3)214563

(4)453621

(5)借助栈由输入序列12……n得到输出序列p1p2……p n,则在输出序列中不可能存在这样的情形:存在着i

3.5 对于循环顺序队列,判断队空、队满的条件是什么?写出求队列长度的公式。

判断队空的条件是:sq->front=sq->rear

判断队满的条件是:(sq->rear+1)% MAXSIZE= = sq->front

求队列长度的公式为:m =(sq->rear - sq->front+ MAXSIZE)% MAXSIZE;

3.6 通常称正读和反读都相同的字符序列为“回文”,例如,“abcdeedcba”、“abcdcba”是回文。

若字符序列存储在一个单链表中,编写算法判断此字符序列是否为回文。(提示:将一半字符先依次进栈)

#define maxsize 100

typedef char datatype1;

typedef struct

{datatype1 data[maxsize];

int top;

} seqstack;

typedef int datatype;

typedef struct node

{datatype data;

struct node *next;

} Linklist;

Duichen(Linklist *head)

{int i=1;

Linklist *p;

seqstack *s;

s=initSeqStack();

p= head->next;n=0;

while(p){n++; p=p->next;}

p=head->next;

while(i<=n/2)

{push(s, p->data); i++; }

if (n%2!=0) p=p->next;

while(p&&p->data==pop(s))

p=p->next;

if (p) return 0 else return 1;

}

3.7 两个栈共享数组a[m]空间,栈底分别设在两端,此时栈空、栈满的条件是什么?试写出两个栈

公用的算法:Top(i), Push(i,x)和Pop(i),其中i为栈的序号0或1。

#define m 100

typedef char datatype;

typedef struct node

{datatype a[m];

int top0 , top1;

} seqstack;

Seqstack ss,*s=&ss;

int push(int i, datatype x)

{ if (s->top1 == s->top0+1) {printf(“full”); return 0;}

if(i==0) {s->top0++; s->a[s->top0]=x;}

else {s->top1--; s->a[s->top1]=x;}

return 1;

}

datatype pop(int i)

{if(i==0)

{ if (s->top0== -1) {printf(“empty”); return 0;}

s->top0--;

return s->a[s->top0+1];

}

else { if (s->top1== m) {printf(“empty”); return 0;}

s->top1++;

return s->a[s->top1-1];

}

}

datatype top(int i)

{if(i==0)

{ if (s->top0== -1) {printf(“empty”); return 0;}

return s->a[s->top0];

}

else { if (s->top1==m) {printf(“empty”); return 0;}

return s->a[s->top1];

}

}

3.8 假设以数组a[m]存放循环队列的元素,同时设变量rear 和length分别作为队尾指针和队中元素个数,试给出判别此循环队列的队满条件,并写出相应入队和出队的算法(在出队的算法中要返回队头元素)。

#define m 100

int enqueue(int a[], int rear, int length, int x)

{ if(length == m)

{printf(“queue is full”); return 0;}

rear=(rear+1)% m;

a[rear]=x;

length ++;

return length;

}

int dequeue(int a[], int rear, int length, int *x)

{ if(length ==0)

{printf(“queueempty”); return 0;}

*x= a [(rear- length +m)%m];

length --;

return length;

4 多维数组及广义表

4.1回答下列概念:三元组表、广义表、十字链表

三元组表:稀疏矩阵中的非零元素三元组组成的线性表。

广义表:也称为列表(Lists)是n(n≥0)个元素a1,a2,…,a i,…,a n的有限序列,元素a i可以是原子或者是子表(子表亦是广义表)。

十字链表:稀疏矩阵(即三元组表)的一种链接存储结构。稀疏矩阵中每个非零元素都用一个包含五个域的结点来表示,存储非零元素所在行的行号域i,存储非零元素

所在列的列号域j,存储非零元素值的值域v,以及行指针域right和列指针域

down,分别指向同一行中的下一个非零元素结点和同一列中的下一个非零元素

结点。

4.2二维数组在采用顺序存储时,元素的排列方式有哪两种?

行优先和列优先。

4.3 矩阵压缩存储的目的是什么?请写出对称阵压缩存储四种方式的地址公式。

压缩存储的目的:节省矩阵的存储空间。

将对称矩阵的下(上)三角存储在数组长度为n(n+1)/2的数组sa中,设矩阵中的某一个元素a ij在数组中的下标为k,则对称阵压缩存储四种方式下k的计算公式如下:

(1)行优先顺序存储下三角

i(i+1)/2+j i≥j (下三角)

k=

j(j+1)/2+i i<j(上三角)

(2)列优先顺序存储下三角

j(2n-j+1)/2+i-j i≥j (下三角)

k=

i(2n-i+1)/2+j-i i<j (上三角)

(3)行优先顺序存储上三角

i(2n-i+1)/2+j-i i≤j (上三角)

k=

j(2n-j+1)/2+i-j i>j (下三角)

(4)列优先顺序存储上三角

j(j+1)/2+i i≤j (上三角)

k=

i(i+1)/2+j i>j (下三角)

4.4 在特殊矩阵和稀疏矩阵中,哪一种经过压缩存储后会失去随机存取的特性?

稀疏矩阵。

4.5 设有一个10阶的对称矩阵A,以行优先顺序存储下三角元素,其中a00为第一元素,其存储地

址为1,每个元素占一个字节,则a85的地址为多少?若a11为第一元素,那么a85的地址又会是多少?

若a00为第一元素,则a85的地址为:41

若a11为第一元素,则a85的地址为:32

4.6 请给出图4.10中稀疏矩阵A6×7的三元组顺序表和十字链表存储结构图示。

矩阵A6×7的三元组顺序表:

0 1 2 3 4

i

j

v

矩阵A6×7及十字链表表示:

4.7 广义表分几类?它们之间有什么关系?

广义表分为:线性表、纯表、再入表和递归表四种。

它们之间的关系满足:递归表?再入表?纯表?线性表。

4.8 分别求出下列广义表的表头、表尾及表长、表深。

A=(a)

表头:a 表尾:()

表长:1 表深:1

B=((a,b),(c,d))

表头:(a,b)表尾:((c,d))

表长:2 表深:2

C=(a,(b,c),d,e)

表头:a 表尾:((b,c),d,e)

表长:4 表深:2

D=(a,b,(c,d),((e,(f,g))))

表头:a 表尾:(b,(c,d),((e,(f,g))))表长:4 表深:4

4.9 请画出下列广义表的图形表示。

A=(a,b,c)

B=(A,d)

C=(x ,A , B)

A B

C

5 树

5.1 回答下列概念:树、二叉树、满二叉树、完全二叉树、哈夫曼树 树:可以用二元组或递归两种方法定义树。树的二元组定义如下:

设tree=(D ,S ),其中D 是数据元素的集合,S 是D 中数据元素之间关系的集合。设 关系r ∈S ,相对r ,满足下列条件:

(1)D 中有且仅有一个开始结点,该结点被称为树的根(Root ); (2)除树根结点外,D 中其余的结点有且仅有一个前趋结点; (3)从根到其余结点都有路径①。 则称tree 是相对r 的树形结构。

二叉树:二叉树(Binary Tree )是n (n≥0)个结点的有限集合,满足:

(1)当n=0时,为空二叉树。

(2)当n >0时,是由一个根结点和两棵互不相交的分别称作这个根的左子树和右子

树的二叉树组成。

满二叉树:每层结点数都达到最大值的二叉树。

完全二叉树:除最下面一层外其余各层的结点数都达到最大值,并且最下一层上的结点都集

中在最左边的若干位置上的二叉树。

哈夫曼树:又称最优二叉树,是在含有n 个叶子结点,权值分别为w 1,w 2,……,w n 的所

有二叉树中,带权路径长度WPL 最小的二叉树。

5.2 对于图5.37给出的树,回答下列问题:

(1)写出它的二元组表示;

(2)根结点、叶结点和分支结点分别都为哪些; (3)结点F 的度数和层数分别为多少; (4)结点B 的兄弟和孩子分别为哪些?

(5)从结点B 到结点N 是否存在路径?若存在请写出具体路径。 (6)从结点C 到结点L 是否存在路径?若存在请写出具体路径。

B G C

D A

J F E

M I N L

H K

(1)该树采用二元组表示如下:

设tree =(D,S),r∈S

D = {A,B,C,D,E,F,G,H,I,J,K,L,M,N }

R = {} (2)根结点:A

分支结点:B,D,F,G,H,I,M

叶结点:C,E,L,N,J,K

(3)结点F的度数为1,层数为3。

(4)结点B的兄弟为:C,D;孩子为E,F,G。

(5)结点B到N存在路径,路径为:BFIMN。

(6)结点C到L不存在路径。

5.3 画出包含三个结点的树和二叉树的所有不同形态,说明树和二叉树之间的区别与联系。

包含三个结点的树:包含三个结点的二叉树:

5.4 判断下列说法是否正确:

(1)二叉树是度为2的有序树。(×)

(2)二叉树中至少有一个结点的度为2。(×)

(3)完全二叉树一定存在度为1的结点。(×)

5.5 设树T的度为4,其中度为1,2,3和4的结点个数分别为4,2,1,1 则T中的叶子数为多少?

叶子数为8。

5.6 结点数为n的二叉树,高度最大是多少?最小是多少?将其扩充成完全二叉树时最多需要附加

多少个虚点?

结点数为n的二叉树,高度最大是n,最小是

2

log1

n

??+

??或

(1)

2

log n+

??

??。

将其扩充成完全二叉树时最多需要附加的虚点个数:2n-1-n。

5.7 分别画出图5.38中的二叉树的顺序存储结构和二叉链表存储结构的图示。

A

F

G

E

C

B

D

H

J

I

顺序存储结构的图示:

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ……27 28 29

二叉链表存储结构的图示:

5.8 分别写出图5.38中二叉树的前序、中序和后序遍历序列。

前序遍历序列:ABDEGCFHIJ

中序遍历序列:DBGEACIHJF

后序遍历序列:DGEBIJHFCA

5.9 找出满足下面条件的二叉树:

(1)前序遍历与中序遍历结果相同

(2)前序遍历和后序遍历结果相同

(3)中序遍历和后序遍历结果相同

(1)只有右分支的单分支树。

(2)只有一个根结点的二叉树。

(3)只有左分支的单分支树。

5.10 以二叉链表为存储结构,请写出前序遍历的非递归算法。

#define MAXSIZE 100

typedef char DataType;

typedef struct Node /* 二叉链表存储结构*/

{ DataType data;

struct Node *lchild,*rchild;

}BiTree;

typedef BiTree* SElemType ; /* 栈中数据元素类型,栈中保存结点指针*/

typedef struct

{ SElemType data[MAXSIZE];

int top;

}SeqStack; /* 栈的类型定义,顺序栈*/

/* 栈的基本操作的实现*/

SeqStack *initSeqStack() /*初始化栈*/

{ SeqStack *s; /*首先建立栈空间,然后初始化栈顶指针*/

s=(SeqStack*)malloc(sizeof(SeqStack));

s->top= -1;

return s;

}

int push (SeqStack *s, SElemType x)

{ if (s->top==MAXSIZE-1) /*栈满不能入栈*/

{ printf("overflow"); return 0;

}

s->top++;

s->data[s->top]=x;

return 1;

}

void pop (SeqStack *s) /*出栈,假设栈不空*/

{ s->top--;

}

int empty (SeqStack *s)

{ if (s->top== -1)

return 1;

else return 0;

}

SElemType top (SeqStack *s) /*设栈不空*/

{ return (s->data[s->top] );

}

void PreOrderFei(BiTree *p) /* 前序遍历二叉树的非递归算法*/

{ SeqStack *s;

s=initSeqStack();

while(1)

{ while(p)

{ printf("%c", p->data); push(s,p); p=p->lchild;} /*先访问结点,后压栈*/

if (empty(s)) break;

p=top(s); pop(s); p=p->rchild;

}

}

5.11 引入线索二叉树的目的是什么?n个结点的线索二叉树上含有多少条线索?

有效利用空指针域,提高遍历运算的效率,简化遍历算法。

n个结点的线索二叉树上含有n+1条线索。

5.12 设一棵二叉树的中序、后序遍历序列分别为:G L D H B E I A C J F K和L G H D I E B J K F

C A,请回答:

(1)画出二叉树逻辑结构的图示。

(2)画出上题中二叉树的中序线索二叉树。

(3)画出中序线索二叉链表存储结构图示并给出C语言描述。

(4)给出利用中序线索求结点中序后继的算法。

(1)

A

B C

H E

D F

G I K

J

L

(2)

(3)

(4)

typedef char DataType;

typedef struct Node

{ DataType data;

struct Node *lchild,*rchild;

int ltag,rtag;

}BiThrTree;

BiThrTree * InOrderNext(BiThrTree *p) /* 求中序后继*/

{ if(p->rtag==1) p=p->rchild; /*分两种情况查找结点后继*/ else{

p=p->rchild;

while(p->ltag==0) p=p->lchild;

}

return p;

}

5.13 以二叉链表为存储结构,设计一个求二叉树高度的算法。

typedef char DataType;

typedef struct Node /* 二叉链表存储结构*/

{ DataType data;

struct Node *lchild,*rchild;

}BiTree;

int height(BiTree *T) /* 求树高*/

{ int i,j;

if(!T) return 0;

i=height(T->lchild); /*求左子树的高度*/

j=height(T->rchild); /*求右子树的高度*/

return i>j?i+1:j+1; /*二叉树的高度为左右子树中较高的高度加1*/

}

5.14 试设计一个算法,根据二叉树的前序序列和中序序列创建一棵二叉树。

算法思想:

(1)确定二叉树的根节点。树根是二叉树前序遍历的第一个元素。

(2)求解二叉树的左右子树。找出根结点在中序遍历中的位置,根左边的所有元素是左子树,根右边的所有元素是右子树。若根结点左边或右边为空,则该方向子树为空;若根结点

左边和右边都为空,则此结点为叶子节点。

(3)递归求解树。将左子树和右子树分别看成一棵二叉树,重复(1)(2)(3)步,直到所有的结点完成定位。

typedef char DataType;

typedef struct Node /* 二叉链表存储结构*/

{ DataType data;

struct Node *lchild,*rchild;

}BiTree;

char pre[50] = "ABDHLEKCFG"; //全局变量--前序序列

char mid[50] = "HLDBEKAFCG"; //中序序列

int position(char c){

/*求解字符在中序遍历序列中的位置*/

return strchr(mid,c)-mid;

/* strchr()

#include

功能:查找字符串s中首次出现字符c的位置(指针),如果s中不存在c则返回NULL。

*/

}

void preMidCreateTree(BiTree *p, int i, int j, int len){

/* i: 子树的前序序列的首字符在pre[]中的下标

j: 子树的中序序列的首字符在mid[]中的下标

len: 子树的遍历序列长度,即子树中的字符数

*/

int m;

if(len <= 0) return;

p = (BiTree *)malloc(sizeof(BiTree)); p->data = pre[i]; m = position(pre[i]);

preMidCreateTree(p->left, i+1, j, m-j); //m-j 为左子树字符数

preMidCreateTree(p->right, i+(m-j)+1, m+1, len-1-(m-j)); //len-1-(m-j)为右子树字符数

}

void main(){

BiTree *root = NULL;

preMidCreateTree(root, 0, 0, strlen(mid)); }

5.15 请画出5.37中的树对应的二叉树。

A B

G

F C E M I D

J N

L H K

5.16 请画出5.39中的各二叉树对应的森林。

A

F

G E

C

B

D

A

C

B

A

A

B C

H J

I (a )

(b )

(c )

(d )

图5.39

A

A B C

(a )

(b )

(c )

(d )

A

B

C

A

G E B D

H

J

C F I

5.17 设森林F 对应的二叉树为B ,它有m 个结点,B 的根为p ,p 的右子树结点个数为n ,森林F

中第一棵树的结点个数是多少? m-n 。

5.18 假设用于通信的电文由字符集{a ,b ,c ,d ,e ,f ,g ,h}中的字母构成,这8个字母在电文中

出现的概率分别为{0.07,0.19,0.02,0.06,0.32,0.03,0.21,0.10}。 (1)为这8个字母设计Huffman 编码。 (2)求出哈夫曼树的带权路径长度WPL 。

(3)若用三位二进制数对这8个字母进行等长编码,则Huffman 编码的平均码长是等长编码的百分之几?

(1)哈夫曼树:

1

对应的哈夫曼编码:

(2)带权路径长度为:

1

n

i i

i W P L w l

==

∑=0.07×4+0.19×2+0.02×5+0.06×4+0.32×2+0.03×5+0.21×2+0.10×4=2.61

(3)2.61/3*100%=87%

6 图

6.1 回答下列概念:完全图、子图、连通分量、网络、最小生成树、拓扑序列

完全图:任意两个顶点之间都有边的图。

子图:设有图G=(V,E),若V'是V的子集(V'?V),E'是E的子集(E'?E),且E'中的边所邻接的点均在V'中出现,则G'=(V',E')也是一个图,并且称之为G的子图。

连通分量:无向图G的极大连通子图。

网络:边上带权的图。

最小生成树:连通网络的所有生成树中边上权值之和最小的生成树。

拓扑序列:有向无环图中所有顶点按照拓扑排序的思想排成的一个线性序列。

6.2 n个顶点的无向图,若采用邻接矩阵为存储结构,如何求边的条数?如何求某个顶点的度?如

果该图为有向图呢?

无向图的邻接矩阵是对称的,“1”的个数则是图中边的条数的2倍,第i行或第i列上“1”的个数都是序号为i的顶点的度。

有向图中,“1”的个数则是图中边的条数,第i行“1”的个数是序号为i的顶点的出度,第i列上“1”

的个数是序号为i的顶点的入度。

6.3 对于一个具有n个顶点和e条边的无向图,若采用邻接表为存储结构,所有边表中的结点总数

为多少?如何求某个顶点的度?当该图为有向图时,所有边表中的结点总数为多少?如何求某个顶点的入度和出度?

(1)无向图的边表中的结点总数为:2*e;

某个顶点的度:该顶点的边表中的结点个数。

(2)若该图为有向图,且采用邻接表(通常称为出边表)为存储结构,则所有边表中的结点总数为e;

出边表中,顶点v i对应的边表结点的个数即为顶点v i的出度;

求顶点v i的入度,需要遍历整个出边表,求边表结点中adjvex域的值为i的结点个数。

6.4 设一个有向图为G=(V,E),其中V={ v1,v2,v3,v4},E={< v2,v1>,< v2,v3>,< v4,v1>,< v1,v4>,< v4,v2>},

请回答下列各问:

(1)画出该有向图,求出每个顶点的入度和出度。

(2)画出该图的邻接矩阵存储结构图示并给出C语言描述。

(3)画出该图的邻接表和逆邻接表的存储结构图示并给出C语言描述。

(4)写出从顶点v2出发的DFS序列和BFS序列。

(1)有向图如下:

顶点v1的入度是2,出度是1;

顶点v2的入度是1,出度是2;

数据结构试题库答案

数据结构试题及答案 一、单项选择题 (1)一个算法应该就是()。 A)程序???B)问题求解步骤得描述 C)要满足五个基本属性??D) A与C (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)数据变量 (7)下列程序得时间复杂度为() i=0;s=0; while(s

经典数据结构面试题(含答案)

栈和队列的共同特点是__________________________ .栈通常采用的两种存储结构是______________________ .用链表表示线性表的优点是_______________________ 8.在单链表中,增加头结点的目的是___________________ 9.循环链表的主要优点是________________________- 12.线性表的顺序存储结构和线性表的链式存储结构分别是 __________________________ 13.树是结点的集合,它的根结点数目是_____________________ 14.在深度为5的满二叉树中,叶子结点的个数为_______________ 15.具有3个结点的二叉树有(_____________________ 16.设一棵二叉树中有3个叶子结点,有8个度为1的结点,则该二叉树中总的结点数为____________________ 17.已知二叉树后序遍历序列是dabec,中序遍历序列是debac,它的前序遍历序列是 ____________________________ 18.已知一棵二叉树前序遍历和中序遍历分别为ABDEGCFH和DBGEACHF,则该二叉树的后序遍历为______________________ 19.若某二叉树的前序遍历访问顺序是abdgcefh,中序遍历访问顺序是dgbaechf,则其后序遍历的结点访问顺序是_______________________ 20.数据库保护分为:安全性控制、完整性控制、并发性控制和数据的恢复。 在计算机中,算法是指_______________________ 算法一般都可以用哪几种控制结构组合而成_____________________ .算法的时间复杂度是指______________________ 5. 算法的空间复杂度是指__________________________ 6. 算法分析的目的是__________________________

2017年数据结构期末考试题及答案A

2017年数据结构期末考试题及答案 一、选择题(共计50分,每题2分,共25题) 1 ?在数据结构中,从逻辑上可以把数据结构分为 C 。 A. 动态结构和静态结构B?紧凑结构和非紧凑结构 C.线性结构和非线性结构 D .内部结构和外部结构 2?数据结构在计算机内存中的表示是指 A ° A. 数据的存储结构 B.数据结构 C.数据的逻辑结构 D .数据元 素之间的关系 3.在数据结构中,与所使用的计算机无关的是数据的 A 结构。 A. 逻辑B?存储 C.逻辑和存储 D.物理 4 .在存储数据时,通常不仅要存储各数据元素的值,而且还要存储 C ° A.数据的处理方法B?数据元素的类型 C.数据元素之间的关系 D.数据的存储方法 5. 在决定选取何种存储结构时,一般不考虑 A ° A.各结点的值如何B?结点个数的多少 C?对数据有哪些运算 D.所用的编程语言实现这种结构是否方便。 6. 以下说法正确的是D ° A. 数据项是数据的基本单位 B. 数据元素是数据的最小单位 C. 数据结构是带结构的数据项的集合 D. —些表面上很不相同的数据可以有相同的逻辑结构 7. 在以下的叙述中,正确的是B ° A. 线性表的顺序存储结构优于链表存储结构 B. 二维数组是其数据元素为线性表的线性表 C?栈的操作方式是先进先出 D.队列的操作方式是先进后出

8. 通常要求同一逻辑结构中的所有数据元素具有相同的特性,这意味着 A. 数据元素具有同一特点 B. 不仅数据元素所包含的数据项的个数要相同,而且对应的数据项的类型要一致 C. 每个数据元素都一样 D. 数据元素所包含的数据项的个数要相等 9 ?链表不具备的特点是 A 。 A.可随机访问任一结点 B.插入删除不需要移动元素 C?不必事先估计存储空间 D.所需空间与其长度成正比 10. 若某表最常用的操作是在最后一个结点之后插入一个结点或删除最后一 个结点,则采用 D 存储方式最节省运算时间。 A.单链表B ?给出表头指针的单循环链表 C.双链表D ?带头结点 的双循环链表 11. 需要分配较大空间,插入和删除不需要移动元素的线性表,其存储结构是 B 。 A.单链表B .静态链表 C.线性链表 D .顺序存储结构 12 .非空的循环单链表head的尾结点(由p所指向)满足C 。 A. p—>next 一NULL B. p — NULL C. p—>next == head D. p = = head 13 .在循环双链表的p所指的结点之前插入s所指结点的操作是 D 。 A .p—> prior-> prior=s B .p—> prior-> n ext=s C.s —> prior—> n ext = s D.s —> prior—> prior = s 14 .栈和队列的共同点是C 。 A.都是先进后出 B .都是先进先出 C.只允许在端点处插入和删除元素 D .没有共同点

《数据结构》题库及答案

《数据结构》题库及答案 一、选择题 1.线性表的顺序存储结构是一种 的存储结构,线性表的链式存储结构是一种 的存储结构。 a. 随机存储; b.顺序存储; c. 索引存取; d. HASH 存取 2.一个栈的入栈序列是a,b,c,d,e ,则栈的不可能的输出序列是 。 a. edcba; b. decba; c. dceab; d.abcde 3.一个队列的入队序列是1,2,3,4,则队列的输出序列是 。 a. 4,3,2,1; b. 1,2,3,4; c. 1,4,3,2; d.3,2,4,1 4.在一个单链表中,已知p 结点是q 结点的直接前驱结点,若在p 和q 之间插入结点s ,则执行的操作是 。 a. s->nxet=p->next; p->next=s; b. p->next=s->next; s->next=p; c. q->next=s; s->next=p; d. p->next=s; s->next=q; 5.设有两个串p,q ,求q 在p 中首次出现的位置的运算称作 。 a.联接 b.模式匹配 c.求子串 d.求串长 6.二维数组M 的成员是6个字符(每个字符占一个存储单元)组成的串,行下标i 的范围从0到8,列下标j 的范围从1到10,则存放M 至少需要 个字节。 a. 90 b.180 c.240 d.540 7.在线索二叉树中,结点p 没有左子树的充要条件是 。 a. p->lch==NULL b. p->ltag==1 c. p->ltag==1且p->lch=NULL d. 以上都不对 8.在栈操作中,输入序列为(A ,B ,C ,D ),不可能得到的输出序列为:______ A 、(A , B , C , D ) B 、(D ,C ,B ,A ) C 、(A ,C ,D ,B ) D 、(C ,A ,B ,D ) 9.已知某二叉树的后序序列是dabec ,中序序列是debac ,则它的先序序列是 。 A 、acbed B 、decab C 、deabc D 、cedba 10.设矩阵A 是一个对称矩阵,为了节省存储空间,将其下三角部分(见下图)按行序存放在一维数组B[1..n(n-1)/2]中,对任一上三角部分元素)(j i a ij ,在一维数组B 的存放位置是 。

数据结构模拟卷(含答案)经典习题培训讲学

数据结构模拟卷(含答案)经典习题

练习题 一、单项选择题 1. 若将数据结构形式定义为二元组(K,R),其中K是数据元素的有限集合,则R是K上( ) A. 操作的有限集合 B. 映象的有限集合 C. 类型的有限集合 D. 关系的有限集合 2. 在长度为n的顺序表中删除第i个元素(1≤i≤n)时,元素移动的次数为( ) A. n-i+1 B. i C. i+1 D. n-i 3. 若不带头结点的单链表的指针为head,则该链表为空的判定条件是( ) A. head==NULL B. head->next==NULL C. head!=NULL D. head->next==head 4. 引起循环队列队头位置发生变化的操作是( ) A. 出队 B. 入队 C. 取队头元素 D. 取队尾元素 5. 若进栈序列为1,2,3,4,5,6,且进栈和出栈可以穿插进行,则不.可能出现的出栈序列是( ) A. 2,4,3,1,5,6 B. 3,2,4,1,6,5 C. 4,3,2,1,5,6 D. 2,3,5,1,6,4

6. 字符串通常采用的两种存储方式是( ) A. 散列存储和索引存储 B. 索引存储和链式存储 C. 顺序存储和链式存储 D. 散列存储和顺序存储 7. 数据结构是() A.一种数据类型 B.数据的存储结构 C.一组性质相同的数据元素的集合 D.相互之间存在一种或多种特定关系的数据元素的集合 8. 算法分析的目的是() A.辨别数据结构的合理性 B.评价算法的效率 C.研究算法中输入与输出的关系 D.鉴别算法的可读性 9. 在线性表的下列运算中,不.改变数据元素之间结构关系的运算是 () A.插入B.删除 C.排序D.定位10. 下列图示的顺序存储结构表示的二叉树是( )

数据结构考试题库

数据结构考试题库

绪论 一、填空题 1.数据的逻辑结构被分为集合、(线性结构)、(树形结构)和(图状结构)四种。 2.物理结构是数据结构在计算机中的表示,又称为(存储结构)。 3.数据元素的逻辑结构包括( 线性)、(树)和图状结构3种类型,树形结构和图状结构合称为(非线性结构)。 4.(数据元素)是数据的基本单位,(数据项)是数据不可分割的最小单位。 5.线性结构中元素之间存在(一个对一个)关系,树形结构中元素之间存在(一个对多个)关系,图状结构中元素之间存在(多个对多个)关系。 ?6.数据结构是一门研究非数值计算的程序设计问题中:计算机的(数据元素)以及它们之间的(关系)和(运筹)等的学科。 7.算法的五个重要特性为有穷性、确定性、(输入)、(输出)和(可行性)。 二、选择题 1.数据的不可分割的基本单位是(D)。 A.元素 B.结点 C.数据类型 D.数据项 *2.线性表的逻辑顺序与存储顺序总是一致的,这种说法(B)。 A.正确 B.不正确 C.不确定 D.无法选择 3.线性结构是指数据元素之间存在一种(D)。 精心整理,用心做精品2

A.一对多关系 B.多对多关系 C.多对一关系 D.一对一关系 4.在数据结构中,从逻辑上可以把数据结构分成(A)。 A.动态结构和静态结构 B.紧凑结构和非紧凑结构 C.线性结构和非线性结构 D.内部结构和外部结构 5.线性表若采用链式存储结构时,要求内存中可用存储单元的 地址( D)。 A.必须是连续的 B.部分地址必须是连续的 C.一定是不连续的 D.连续不连续都可以 三、简答题 1.算法的特性是什么。 答:有穷性确定性可行性有0或多个输入有1或多个输出线性结构 一、填空题 1.在一个长度为n的线性表中删除第i个元素(1≤i≤n)时,需向前移动(n-i)个元素。 2.从循环队列中删除一个元素时,其操作是(先移动队首指针,后取出元素)。 3.在线性表的单链接存储中,若一个元素所在结点的地址为p,则其后继结点的地址为(p->next)。 4.在一个单链表中指针p所指向结点的后面插入一个指针q所指向的结点时,首先把(p->next)的值赋给q->next,然后(q->date)的值赋给p->next。 5.从一个栈删除元素时,首先取出(栈顶元素),然后再使(栈顶指针)减1。 6.子串的定位操作通常称做串的(模式匹配)。 精心整理,用心做精品3

数据结构课后习题及解析第二章

第二章习题 1.描述以下三个概念的区别:头指针,头结点,首元素结点。 2.填空: (1)在顺序表中插入或删除一个元素,需要平均移动元素,具体移动的元素个数与有关。 (2)在顺序表中,逻辑上相邻的元素,其物理位置相邻。在单链表中,逻辑上相邻的元素,其物理位置相邻。 (3)在带头结点的非空单链表中,头结点的存储位置由指示,首元素结点的存储位置由指示,除首元素结点外,其它任一元素结点的存储位置由指示。3.已知L是无表头结点的单链表,且P结点既不是首元素结点,也不是尾元素结点。按要求从下列语句中选择合适的语句序列。 a. 在P结点后插入S结点的语句序列是:。 b. 在P结点前插入S结点的语句序列是:。 c. 在表首插入S结点的语句序列是:。 d. 在表尾插入S结点的语句序列是:。 供选择的语句有: (1)P->next=S; (2)P->next= P->next->next; (3)P->next= S->next; (4)S->next= P->next; (5)S->next= L; (6)S->next= NULL; (7)Q= P; (8)while(P->next!=Q) P=P->next; (9)while(P->next!=NULL) P=P->next; (10)P= Q; (11)P= L; (12)L= S; (13)L= P; 4.设线性表存于a(1:arrsize)的前elenum个分量中且递增有序。试写一算法,将X插入到线性表的适当位置上,以保持线性表的有序性。 5.写一算法,从顺序表中删除自第i个元素开始的k个元素。 6.已知线性表中的元素(整数)以值递增有序排列,并以单链表作存储结构。试写一高效算法,删除表中所有大于mink且小于maxk的元素(若表中存在这样的元素),分析你的算法的时间复杂度(注意:mink和maxk是给定的两个参变量,它们的值为任意的整数)。 7.试分别以不同的存储结构实现线性表的就地逆置算法,即在原表的存储空间将线性表(a1, a2..., an)逆置为(an, an-1,..., a1)。 (1)以一维数组作存储结构,设线性表存于a(1:arrsize)的前elenum个分量中。 (2)以单链表作存储结构。 8.假设两个按元素值递增有序排列的线性表A和B,均以单链表作为存储结构,请编写算法,将A表和B表归并成一个按元素值递减有序排列的线性表C,并要求利用原表(即A 表和B表的)结点空间存放表C。

数据结构试题及答案(10套最新)

单选题(每题2分,共20分) 1. 1. 对一个算法的评价,不包括如下(B )方面的内容。 A .健壮性和可读性 B .并行性 C .正确性 D .时空复杂度 2.2. 在带有头结点的单链表HL 中,要向表头插入一个由指针 p 指向 的结点,则执行(A )。 A. p->next=HL->next; HL->next=p; B. p->next=HL; HL=p; 都具有相同的(A )。 A.行号 B .列号 C .元素值 D .非零元素个数 9. 快速排序在最坏情况下的时间复杂度为(D )。 A. O(log 2n) B . O(nlog 2n) C . 0(n) D 10.10. 从二叉搜索树中查找一个元素时,其时间复杂度大致 为 A. O(n) B. O(1) C. O(log 2 n) D. O(n 二、 运算题(每题6分,共24分) 1. 1. 数据结构是指数据及其相互之间的 _________________ 。当结点之 间存在M 对N (M N)的联系时,称这种结构为 __________________________ 。 2. 2. 队列的插入操作是在队列的_ _尾 ________ 行,删除操作是在队 列的 ____ 首 _____ 行。 3. 3. 当用长度为N 的数组顺序存储一个栈时,假定用top==N 表示栈 C. p->next=HL; p=HL; 3. 3. A. C. D. HL=p; p-> next=HL; 对线性表,在下列哪种情况下应当采用链表表示? 经常需要随机地存取元素 B. 表中元素需要占据一片连续的存储空间 一个栈的输入序列为1 2 3, 4. 4. 列的是(C ) A. 2 3 1 C. 3 1 2 AOV 网 是一种(D ) 有向 图 B .无向图 (B ) 经常需要进行插入和删除操作 D.表中元素的个数不变 则下列序列中不可能是栈的输出序 B. 3 2 1 5. 5. 6. .无向无环图 D .有向无环图 采用 开放定址法处理散列表的冲突时,其平均查找长度( B. 高于链接法处理冲突 D .高于二分查找 7. 8. 6. A.低于链接法处理冲突 .与链接法处理冲突相同 7. 参数。 A.值 8. B)。 若需要利用形参直接访问实参时,应将形参变量说明为( B .函数 C .指针 D .引用 在稀疏矩阵的带行指针向量的链接存储中,每个单链表中的结点 9. .0(n 2) (C )。 2 )

数据结构模拟卷(含答案)经典习题

练习题 一、单项选择题 1. 若将数据结构形式定义为二元组(K,R),其中K是数据元素的有限集合,则R是K上( ) A. 操作的有限集合 B. 映象的有限集合 C. 类型的有限集合 D. 关系的有限集合 2. 在长度为n的顺序表中删除第i个元素(1≤i≤n)时,元素移动的次数为( ) A. n-i+1 B. i C. i+1 D. n-i 3. 若不带头结点的单链表的指针为head,则该链表为空的判定条件是( ) A. head==NULL B. head->next==NULL C. head!=NULL D. head->next==head 4. 引起循环队列队头位置发生变化的操作是( ) A. 出队 B. 入队 C. 取队头元素 D. 取队尾元素 5. 若进栈序列为1,2,3,4,5,6,且进栈和出栈可以穿插进行,则不.可能出现的出栈序列是( ) A. 2,4,3,1,5,6 B. 3,2,4,1,6,5 C. 4,3,2,1,5,6 D. 2,3,5,1,6,4 1

6. 字符串通常采用的两种存储方式是( ) A. 散列存储和索引存储 B. 索引存储和链式存储 C. 顺序存储和链式存储 D. 散列存储和顺序存储 7. 数据结构是() A.一种数据类型 B.数据的存储结构 C.一组性质相同的数据元素的集合 D.相互之间存在一种或多种特定关系的数据元素的集合 8. 算法分析的目的是() A.辨别数据结构的合理性 B.评价算法的效率 C.研究算法中输入与输出的关系 D.鉴别算法的可读性 9. 在线性表的下列运算中,不.改变数据元素之间结构关系的运算是 () A.插入B.删除 C.排序D.定位 10. 下列图示的顺序存储结构表示的二叉树是( ) 2

数据结构期末考试试题及答案

数据结构期末考试试题及答案 、选择题 评价一个算法时间性能的主要标准是()。1. A、算法易于调试 B、算法易于理解 C、算法的稳定性和正确性 D、算法的时间复杂度 )等五个特性。计算机算法具备有输入、输出、 2. A、可行性、可移植性和可扩充性 B、可行性、确定性和有穷性 C、确定性、有穷性和稳定性 D、XX、稳定性和XX 。带头结点的单链表head为空的判定条件是()3. A、h ead==NULL B、h ead->next==NULL C、head->next==head D、head!=NULL 以下关于线性表的说法不正确的是()。4. A、线性表中的数据元素可以是数字、字符、记录等不同类型。 B、线性表中包含的数据元素个数不是任意的。

C、线性表中的每个结点都有且只有一个直接前趋和直接后继。 D、存在这 样的线性表:表中各结点都没有直接前趋和直接后继。 在顺序表中,只要知道(),就可在相同时间内求出任一结点的存储地址。 5.A、基地址 B、结点大小 C、向量大小 D、基地址和结点大小 ()运算中,使用顺序表比链表好。6. A、插入 B、删除 C、根据序号查找 D、根据元素值查找一个长度为n的顺序表中,向第i个元素之前插入一个新元素时,需要向后移动()个元素7.A、n-i B、n-i+1 C、n-i-1 D、i ()适合作为经常在首尾两端操作线性表的存储结构。8. A、顺序表 B、单链表 C、循环链表 D、双向链表

栈和队列的共同点是() 9. A、都是先进后出 B、都是先进先出 C、只允许在端点处插入和删除元素 D、没有共同点 一个队列的入列序列是1234,则队列的输出序列是()。10. A 、4321 B 、12 3 4 C 、1432 D 、 3241队列与一般的线性表的区别在于()。11. A、数据元素的类型不同 B、运算是否受限制 C、数据元素的个数不同 D、逻辑结构不同 假上溢”现象会出现在()中。12. A、循环队列 B、队列 C、链队列 、顺序队列D.二、填空

算法与数据结构题库与答案

一、单项选择题 1 某算法的时间复杂度是O(n 2 ) ,表明该算法()。 A 问题规模是n2 B 问题规模与n2成正比 C 执行时间等于n2 D 执行时间与n2成正比 2、关于数据结构的描述,不正确的是()。 A数据结构相同,对应的存储结构也相同。 B数据结构涉及数据的逻辑结构、存储结构和施加其上的操作等三个方面。 C数据结构操作的实现与存储结构有关。 D定义逻辑结构时可不考虑存储结构。 3、按排序策略分来,起泡排序属于()。 A插入排序B选择排序C交换排序D归并排序 4、利用双向链表作线性表的存储结构的优点是()。 A便于进行插入和删除的操作 B 提高按关系查找数据元素的速度 C节省空间D便于销毁结构释放空间 5、一个队列的进队顺序为1,2,3,4,则该队列可能的输出序列是()。 A 1,2,3,4 B 1,3,2,4 C 1,4,2,3 D 4,3,2,1 6、 Dijkstra算法是按()方法求出图中从某顶点到其余顶点最短路径的。 A按长度递减的顺序求出图的某顶点到其余顶点的最短路径 B按长度递增的顺序求出图的某顶点到其余顶点的最短路径 C通过深度优先遍历求出图中从某顶点到其余顶点的所有路径 D通过广度优先遍历求出图的某顶点到其余顶点的最短路径 7、字符串可定义为n( n≥ 0)个字符的有限()。其中,n是字符串的长度,表明字符串中字符的个数。 A集合B数列C序列D聚合 8、在二维数组A[9][10]中,每个数组元素占用 3 个存储单元,从首地址SA 开始按行连续存放。在这种情况下,元素A[8][5]的起始地址为()。 A SA+141 B SA+144 C SA+222 D SA+255 9、已知广义表为L(A(u,v,(x,y),z),C(m,(),(k,l,n),(())),((())),(e,(f,g),h)),则它的长度是()。 A2B3C4D5 10.对于具有n(n>1)个顶点的强连通图,其有向边条数至少有_____。 A. n+1 B. n C. n-1 D. n-2 11.一个递归算法必须包括 __________ 。 A. 递归部分 B . 结束条件和递归部分 C. 迭代部分 D. 结束条件和迭代部分 12.从逻辑上看可以把数据结构分为__________两大类。 A.动态结构、静态结构B.顺序结构、链式结构 C.线性结构、非线性结构D.初等结构、构造型结构 13、若在长度为n 的顺序表的表尾插入一个新元素的渐进时间复杂度为()。 A O(n) B O(1) C O(n 2) D O(log 2n) 14.采用顺序搜素方式搜索长度为 n 的线性表时,在等概率情况下,搜索成功时的平均搜索 长度为 __________。 A. n B. n/2 C . (n+1)/2 D. (n-1)/2 15、非空的循环单链表first的链尾结点(由p 所指向)满足()。 A p->link==NULL; B P==NULL;

经典数据结构上机题_答案解析

数据结构上机实验题目 实验一线性表的顺序存储结构 实验学时 2学时 背景知识:顺序表的插入、删除及应用。 目的要求: 1.掌握顺序存储结构的特点。 2.掌握顺序存储结构的常见算法。 实验容 1.输入一组整型元素序列,建立顺序表。 2.实现该顺序表的遍历。 3.在该顺序表中进行顺序查找某一元素,查找成功返回1,否则返回0。4.判断该顺序表中元素是否对称,对称返回1,否则返回0。 5.实现把该表中所有奇数排在偶数之前,即表的前面为奇数,后面为偶数。 6.输入整型元素序列利用有序表插入算法建立一个有序表。 7.利用算法6建立两个非递减有序表并把它们合并成一个非递减有序表。 8. 利用该顺序结构实现循环队列的入队、出队操作。 8.编写一个主函数,调试上述算法。 #include #include

#define OVERFLOW 0 #define MAXSIZE 100 typedef int ElemType; typedef struct list {ElemType elem[MAXSIZE]; int length; }Sqlist; void Creatlist(Sqlist &L) {int i; printf("请输入顺序表的长度:"); //输入一组整型元素序列,建立一个顺序表。 scanf("%d",&L.length); for(i=0;i

《数据结构》期末考试题及答案

2011-2012学年第一学期期末考查 《数据结构》试卷 (答案一律写在答题纸上,在本试卷上做答无效) 一、选择(每题1分,共10分) 1.长度为n的线性表采用顺序存储结构,一个在其第i个位置插入新元素的算法时间复杂度为(D) A.O(0) B.O(1) C.O(n) D.O(n2) 2.六个元素按照6,5,4,3,2,1的顺序入栈,下列哪一个是合法的出栈序列?(D) A.543612 B.453126 C.346512 D.234156 3.设树的度为4,其中度为1、2、3、4的结点个数分别是4、2、1、2,则树中叶子个数为(B ) A.8 B.9 C.10 D.11 4.设森林F对应的二叉树B有m个结点,B的右子树结点个数为n,森林F中第一棵树的结点个数是( B ) A. m-n B.m-n-1 C.n+1 D.m+n 5.若一棵二叉树具有10个度为2的结点,5个度为1的结点,则度为0的结点个数是(B) A.9 B.11 C.15 D.不确定 6.下列哪一个方法可以判断出一个有向图是否有环。(A) A.深度优先遍历 B.拓扑排序 C.求最短路径 D.求关键路径 7.第7层有10个叶子结点的完全二叉树不可能有(B )个结点。 A.73 B.234 C.235 D.236 8.分别用以下序列构造二叉排序树,与用其他三个序列构造的结果不同的是(B) A.(100,80,90,60,120,110,130) B.(100, 120, 110,130,80, 60,90) C.(100,60,80,90,120,110,130) D.(100,80, 60,90, 120, 130,110) 9.对一组数据(84,47,25,15,21)排序,数据的排列次序在排序过程中变化如下:(1)84 47 25 15 21 (2)15 47 25 84 21 (3)15 21 25 84 47(4)15 21 25 47 84则采用的排序方法是(B ) A.选择排序 B.起泡排序 C.快速排序 D.插入排序 10.对线性表进行折半查找时,要求线性表必须(D) A.以顺序方式存储 B.以顺序方式存储,且数据元素有序

数据结构例题解析(1)

I Single Choice(10 points) 1. ( a )For the following program fragment the running time(Big-Oh) is . i = 0; s = 0; while(s <( 5*n*n + 2)) { i++; s = s + i; } a. O(n) b. O(n2) c. O(n1/2) d. O(n3) 2. ( c )Which is non-linear data structure_____. a. queue c. tree d. sequence list 3.( b )The worst-time for removing an element from a sequence list (Big-Oh) is . a. O(1) b. O(n) c. O(n2) d. O(n3) 4.( d )In a circular queue we can distinguish(区分) empty queues from full queues by .

a. using a gap in the array b. incrementing queue positions by 2 instead of 1 a count of the number of elements d. a and c 5.( b )A recursive function can cause an infinite sequence of function calls if . a.the problem size is halved at each step b.the termination condition is missing c.no useful incremental computation is done in each step d.the problem size is positive 6.( c )The full binary tree with height 4 has nodes. a. 15 b. 16 7. ( b )Searching in an unsorted list can be made faster by using . a.binary search

数据结构经典题目c语言代码

《数据结构》课程设计题目 (程序实现采用C语言) 题目1:猴子选王(学时:3) 一堆猴子都有编号,编号是1,2,3 ...m,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。 要求:m及n要求从键盘输入,存储方式采用向量及链表两种方式实现该问题求解。 //链表 #include #include // 链表节点 typedef struct _RingNode { int pos; struct _RingNode *next; }RingNode, *RingNodePtr; // 创建约瑟夫环,pHead:链表头指针,count:链表元素个数 void CreateRing(RingNodePtr pHead, int count) { RingNodePtr pCurr = NULL, pPrev = NULL; int i = 1; pPrev = pHead; while(--count > 0)

{ pCurr = (RingNodePtr)malloc(sizeof(RingNode)); i++; pCurr->pos = i; pPrev->next = pCurr; pPrev = pCurr; } pCurr->next = pHead; // 构成环状链表 } void KickFromRing(RingNodePtr pHead, int n) { RingNodePtr pCurr, pPrev; int i = 1; // 计数 pCurr = pPrev = pHead; while(pCurr != NULL) { if (i == n) { // 踢出环 printf("\n%d", pCurr->pos); // 显示出圈循序 pPrev->next = pCurr->next; free(pCurr); pCurr = pPrev->next; i = 1; } pPrev = pCurr;

数据结构考试及答案()

数据结构考试及答案()

作者: 日期: 2

数据结构试题 一、单选题 1、在数据结构的讨论中把数据结构从逻辑上分为(C) A 内部结构与外部结构 B 静态结构与动态结构 C 线性结构与非线性结构 D 紧凑结构与非紧凑结构。 2、采用线性链表表示一个向量时,要求占用的存储空间地址(D) A 必须是连续的B部分地址必须是连续的 C 一定是不连续的D可连续可不连续 3、采用顺序搜索方法查找长度为n的顺序表时,搜索成功的平均搜索长度为 (D )。 An B n/2 C (n-1)/2 D (n+1)/2 4、在一个单链表中,若q结点是p结点的前驱结点,若在q与p之间插入结点s,则执行(D )o 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 )o 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 + n) % 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 (i nt i=0;i

数据结构第一章课后习题与答案

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

2. 选择题 ⑴ 顺序存储结构中数据元素之间的逻辑关系是由( )表示的,链接存储结构中的数据元素之间的逻辑关系是由( )表示的。 A 线性结构 B 非线性结构 C 存储位置 D 指针 【解答】C,D 【分析】顺序存储结构就是用一维数组存储数据结构中的数据元素,其逻辑关系由存储位置(即元素在数组中的下标)表示;链接存储结构中一个数据元素对应链表中的一个结点,元素之间的逻辑关系由结点中的指针表示。 ⑵ 假设有如下遗产继承规则:丈夫和妻子可以相互继承遗产;子女可以继承父亲或母亲的遗产;子女间不能相互继承。则表示该遗产继承关系的最合适的数据结构应该是( )。 A 树 B 图 C 线性表 D 集合 【解答】B 【分析】将丈夫、妻子和子女分别作为数据元素,根据题意画出逻辑结构图。 ⑶ 算法指的是( )。 A 对特定问题求解步骤的一种描述,是指令的有限序列。 B 计算机程序 C 解决问题的计算方法 D 数据处理 【解答】A 【分析】计算机程序是对算法的具体实现;简单地说,算法是解决问题的方法;数据处理是通过算法完成的。所以,只有A是算法的准确定义。 ⑷ 下面( )不是算法所必须具备的特性。 A 有穷性 B 确切性 C 高效性 D 可行性 【解答】C 【分析】高效性是好算法应具备的特性。 ⑸ 算法分析的目的是( ),算法分析的两个主要方面是( )。 A 找出数据结构的合理性 B 研究算法中输入和输出的关系 C 分析算法的效率以求改进 D 分析算法的易读性和文档性 E 空间性能和时间性能 F 正确性和简明性 G 可读性和文档性 H 数据复杂性和程序复杂性

数据结构试题及答案(10套最新)

一、单选题(每题 2 分,共20分) 1. 1.对一个算法的评价,不包括如下(B )方面的内容。 A.健壮性和可读性B.并行性C.正确性D.时空复杂度 2. 2.在带有头结点的单链表HL中,要向表头插入一个由指针p指向的结 点,则执行(A )。 A. p->next=HL->next; HL->next=p; B. p->next=HL; HL=p; C. p->next=HL; p=HL; D. HL=p; p->next=HL; 3. 3.对线性表,在下列哪种情况下应当采用链表表示?( B ) A.经常需要随机地存取元素 B.经常需要进行插入和删除操作 C.表中元素需要占据一片连续的存储空间 D.表中元素的个数不变 4. 4.一个栈的输入序列为1 2 3,则下列序列中不可能是栈的输出序列的是 ( C ) A. 2 3 1 B. 3 2 1 C. 3 1 2 D. 1 2 3 5. 5.AOV网是一种(D )。 A.有向图B.无向图C.无向无环图D.有向无环图 6. 6.采用开放定址法处理散列表的冲突时,其平均查找长度(B)。 A.低于链接法处理冲突 B. 高于链接法处理冲突 C.与链接法处理冲突相同D.高于二分查找 7.7.若需要利用形参直接访问实参时,应将形参变量说明为(D )参数。 A.值B.函数C.指针D.引用 8.8.在稀疏矩阵的带行指针向量的链接存储中,每个单链表中的结点都具 有相同的( A )。 A.行号B.列号C.元素值D.非零元素个数 9.9.快速排序在最坏情况下的时间复杂度为(D )。 A.O(log2n) B.O(nlog2n) C.0(n) D.0(n2) 10.10.从二叉搜索树中查找一个元素时,其时间复杂度大致为( C )。 A. O(n) B. O(1) C. O(log2n) D. O(n2) 二、运算题(每题 6 分,共24分) 1. 1.数据结构是指数据及其相互之间的______________。当结点之间存在M 对N(M:N)的联系时,称这种结构为_____________________。 2. 2.队列的插入操作是在队列的_ _尾______进行,删除操作是在队列的____ 首______进行。 3. 3.当用长度为N的数组顺序存储一个栈时,假定用top==N表示栈空,则 表示栈满的条件是___top==0___(要超出才为满)_______________。 4. 4.对于一个长度为n的单链存储的线性表,在表头插入元素的时间复杂度 为_________,在表尾插入元素的时间复杂度为____________。

数据结构经典例题

数据结构经典例题 1.设计一个算法将L拆分成两个带头节点的单链表L1和L2。 void split(LinkList *&L,LinkList *&L1,LinkList *&L2) { LinkList *p=L->next,*q,*r1; //p指向第1个数据节点 L1=L; //L1利用原来L的头节点 r1=L1; //r1始终指向L1的尾节点 L2=(LinkList *)malloc(sizeof(LinkList));//创建L2的头节点 L2->next=NULL; //置L2的指针域为NULL while (p!=NULL) { r1->next=p; //采用尾插法将*p(data值为ai)插入L1中 r1=p; p=p->next; //p移向下一个节点(data值为bi) q=p->next; //由于头插法修改p的next域,故用q保存*p的后继节点 p->next=L2->next; //采用头插法将*p插入L2中 L2->next=p; p=q; //p重新指向ai+1的节点 } r1->next=NULL; //尾节点next置空 } 2.查找链表中倒数第k个位置上的节点(k为正整数)。若查找成功,算法输出该节点的data域的值,并返回1;否则,只返回0。 typedef struct LNode {int data; struct LNode *link; } *LinkList; int Searchk(LinkList list,int k) { LinkList p,q; int count=0; p=q=list->link; while (p!=NULL) { if (countlink; p=p->link; } if (count

相关主题
文本预览
相关文档 最新文档