数据结构复习通docx.docx

上传人:b****6 文档编号:11964315 上传时间:2023-06-03 格式:DOCX 页数:26 大小:255.21KB
下载 相关 举报
数据结构复习通docx.docx_第1页
第1页 / 共26页
数据结构复习通docx.docx_第2页
第2页 / 共26页
数据结构复习通docx.docx_第3页
第3页 / 共26页
数据结构复习通docx.docx_第4页
第4页 / 共26页
数据结构复习通docx.docx_第5页
第5页 / 共26页
数据结构复习通docx.docx_第6页
第6页 / 共26页
数据结构复习通docx.docx_第7页
第7页 / 共26页
数据结构复习通docx.docx_第8页
第8页 / 共26页
数据结构复习通docx.docx_第9页
第9页 / 共26页
数据结构复习通docx.docx_第10页
第10页 / 共26页
数据结构复习通docx.docx_第11页
第11页 / 共26页
数据结构复习通docx.docx_第12页
第12页 / 共26页
数据结构复习通docx.docx_第13页
第13页 / 共26页
数据结构复习通docx.docx_第14页
第14页 / 共26页
数据结构复习通docx.docx_第15页
第15页 / 共26页
数据结构复习通docx.docx_第16页
第16页 / 共26页
数据结构复习通docx.docx_第17页
第17页 / 共26页
数据结构复习通docx.docx_第18页
第18页 / 共26页
数据结构复习通docx.docx_第19页
第19页 / 共26页
数据结构复习通docx.docx_第20页
第20页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

数据结构复习通docx.docx

《数据结构复习通docx.docx》由会员分享,可在线阅读,更多相关《数据结构复习通docx.docx(26页珍藏版)》请在冰点文库上搜索。

数据结构复习通docx.docx

数据结构复习通docx

习题1

1.解释以下概念:

逻辑结构,存储结构,操作,数据结构,数据结构的表示,数据结构的实现,抽象数据类型,算法,算法的时间代价,算法的空间代价,大O表示法。

2.理解以下关系:

算法与数据结构的关系;数据结构与抽象数据类型的关系;算法和数据结构与问题求解的关系。

3.写出下列程序段的平均情况下的时间代价0表示式。

(1)a=b+c;

d=a+e

(2)sum=O;

for(i=0;i〈3;i++)

for(j=0;j

sum++;

(3)x=n;

y=0;

while(x>=(y+1)*(y+1))

y++;

(4)s=0;

if(even(n))

for(i=0;i

sum++;

else

s=s+n;

(5)x=66;n=200;

while(n>0){

if(x>100){x=x-10;

n=n~l;

}else

x=x+l;

}

4.对于给定的n个元素,可以构造出的逻辑结构有,,,四种。

5.按增长率由小到大的顺序排列下列各函数:

3243

2"°,

(2)n,q)n,q)n,if,ii;,ii!

ii,log2n,n/log2n

习题2

2.1已知L是无头结点的单链表,且p结点既不是第一个结点,也不是最后一个结点,试从下列提供的语句中选出合适的语句序列:

2.3试编写一个计算头结点指针为L的单链表长度的算法。

2.4试编写一个将单循环链表逆置的算法。

2.5已知一顺序表A,其元素值非递减有序排列,编写一个算法,删除顺序表中多余的值相同的元素。

习题3

3.1简述栈和线性表的区别。

简述栈和队列的相同点和不同点。

栈有两种存储方式,其中一种是线性存储,而线性表只有线性存储一种方式,可以说线性存储的栈是只在表尾进行插入和删除操作的线性表。

栈、队列相同点:

同为一种特殊的线性表,不同是:

栈是先进后出,队列是先进先出。

3.2如果进栈的数据元素序列为1、2、3、4、5、6,能否得到4、3、5、6、1、2和1、3、5、4、2、6的出栈序列?

并说明为什么得不到或如何得到。

第一组不可以:

因为最后出栈1、2则2必在1前出栈;

而第二组可以:

1进1出,2、3进3出,4、5进5出4出,2出,6进6出;

3.3利用两个栈模拟一个队列的入队、出队和判断队列空的运算。

两个栈共同一个线表,

baseltopi

 

出栈

入栈

 

 

base2top2

topl=top2时栈为空

3.4写一算法,将一个顺序栈中的元素依次取出,并打印元素值。

#include

#include"malloc.h"

#defineMAXSIZE100

typedefstruct(

intdate[MAXSIZE];

inttop;

Jseqstack;

voidposeqstack(seqstack*s)(

while(s->top!

=-l)

printf("%d",s->date[s->top-]);

voidmain()

inti;

seqstack*s;

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

for(i=0;i<6;i++)

s->date[i]=i+10;

s->top=5;

poseqstack(s);

3.5写一算法,将一个非负十进制整数转换成二进制。

#include

#include"malloc.h"

#defineMAXSIZE100

typedefstruct(

intdate[MAXSIZE];

inttop;

Jseqstack;

voidposeqstack(seqstack*s)(

while(s->top!

=-l)

printf("%d",s->date[s->top—]);

printf(”\n”);

}voidmain()

{

inti=0,n;

seqstack*s;

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

scanf("%d",&n);

while(n){

s->date[i++]=n%2;

n=n/2;

s->top=i-l;

poseqstack(s);

}

3.6写一算法,将一个链式队列中的元素依次取出,并打印元素值。

#include

#include"malloc.h"

#defineNULL0

typedefstructnode(

intdate;

structnode*next;

}qnode;

typedefstruct(

qnode*front;

qnode*rear;

}lqueue;

voidqueuetraval(lqueue*s)(

qnode*p;

p=s->front;

p=p->next;

while(p!

=NULL)(

printf("%d",p->date);

p=p->next;

voidmain()

inti=0,n;

Iqueue*q;qnode*p;

q=(lqueue*)malloc(sizeof(lqueue));

p=(qnode*)malloc(sizeof(qnode));

p->next=NULL;

q->front=p;

q->rear=p;

for(i=0;i<6;i++)(

p=(qnode*)malloc(sizeof(qnode));

p->date=i+10;

q->rear->next=p;

q->rear=p;

p->next=NULL;

queuetraval(q);

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

辆车开出站台的所有可能的顺序。

法一:

#include

#include"malloc.h"

#defineMAXSIZE50

typedefstruct(

intdate[MAXSIZE];

inttop;

Jseqstack;

voidmain()

intendl,k,i,j,a[50][8]={0},s[50]={0},end=l,begin=0;

a[0][0]=l;s[0]=l;

seqstack*T;

T=(seqstack*)malloc(sizeof(seqstack));

T->top=-l;

for(j=l;j<8;j++)(

i=begin;

endl=end;

while(i

if(s[i]<4&&2*s[i]>j)(

a[i]U]=l;

s[end]=s[i];

s[i]++;

for(k=0;k

a[end][k]=a[i][k];

end++;

else

if(s[i]==4)begin++;

else(

a[i][j]=l;

s[i]++;

i++;

for(i=0;i

k=l;

for(j=0;j<8;j++)

if(a[i][j])

T->date[++T->top]=k++;

else

printf("%d",T->date[T->top-]);

法二:

#include

#include"malloc.h"

#defineMAXSIZE50

typedefstruct(

intdate[MAXSIZE];

inttop;

Jseqstack;

voidpopu(seqstack*m,seqstack*n)(

if(m->top!

=-l)

n->date[++n->top]=m->date[m->top-];

voidintravel(seqstack*c)(

inti=0;

while(i<=c->top)

printf("%d",c->date[i++]);

voidtravel(seqstack*b)(

intn;

n=b->top;

while(n!

=-l)

printf("%d",b->date[n-]);

printf("\n");

voidpp(seqstack*a,seqstack*b,seqstack*c)(

int

n=b->top+l;

if(a->top!

=-l)

for(i=0;i<=n;i++)(

for(j=0;j

popu(b,c);

popu(a,b);

pp(a,b,c);

if(a->top==-l)(

intravel(c);

travel(b);

popu(b,a);

for(j=0;j

popu(c,b);

voidmain()

inti;

seqstack*a,*b,*c;

a=(seqstack*)malloc(sizeof(seqstack));

b=(seqstack*)malloc(sizeof(seqstack));

c=(seqstack*)malloc(sizeof(seqstack));

a->top=-l;b->top=-l;c->top=-l;

for(i=4;i>0;i-)

a->date[++a->top]=i;

pp(a,b,c);

3.8写一个算法,借助于栈将一个单链表逆置。

#include

#include"malloc.h"

#defineMAXSIZE100

typedefstructnode(

intdate;

structnode*next;

}qnode;

typedefstruct(

intdate[MAXSIZE];

inttop;

Jseqstack;

voidmain()

inti=l;

qnode*head,*p;

seqstack*s;

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

s->top=-l;

head=(qnode*)malloc(sizeof(qnode));

p=head;

for(i=0;i<5;i++)(

p->next=(qnode*)malloc(sizeof(qnode));

p=p->next;

p->date=i+10;

p->next=NULL;

p=head->next;

while(p!

=NULL)(

s->date[++s->top]=p->date;

p=p->next;

p=head->next;

while(s->top!

=-l)(

p->date=s->date[s->top—];

p=p->next;

/*打印*/

p=head->next;

do(

printf("%-4d",p->date);

p=p->next;

}while(p!

=NULL);

习题4

4.1空串和空格串有什么区别?

4.2两个字符串相等的充要条件是什么?

4.3串的三种机内表小方法是什么?

4.4设S=*1amastudent*,T=,good,,Q=,worker,。

求:

(l)StrLength(S)

⑵SubString(&Sub,S,8,7)

(3)SubString(&Sub,T,2,1)

(4)Index(S,'a',1)

(5)Index(S,T,1)

⑹Replace(&S,'Student',Q)

(7)Concat(&N,SubString(&V,S,6,2),Concat(&P,T,SubString(&W,S,7,8)))

4.5设A=,This,,F=fasample1,C='good',D="e',B=”,G='is'。

求:

(1)Coneat(&S,A,Concat(&Z,SubString(&Y,F,2,7),Concat(&X,B,

SubString(A,3,2))))

(2)Concat(&U,SubString(&X,C,3,1),D)

(3)Concat(&V,S,Concat(&Z,B,Concat(&Y,F,Concat(&X,B,U))))

⑷StrLength(S)

(5)Index(V,G,1)

(6)Index(U,G,1)

⑺Replace(&F,SubString(&X,F,3,6),C)

4.6利用C的库函数strlen>strcpy(或strcat)写一个算法voidStrDelete(char*S,inti,intm),删除串S中从位置i开始连荟的m个字符。

若i^strlen(S),则没有字符被删除;若i+mNstrlen(S),则S中从位置i开始直至末尾的字符均被删去.。

4.7采用顺序结构存储串,编写一个函数,求串s和串t的一个最长的公共子串。

提示:

需要采用三重循环来实现。

习题5

1.假设按行优先存储整数数组A[9][3][5][8]时,第一个元素的字节地址是100,每个整数占4个字节。

问下列元素的存储地址是什么?

(1)Qoooo100

(2)ami776(3)3.31251784(4)382474416

2.假设一个准对角矩阵

IlS

21。

22

<>33弓34

43^44

a2m~\2m\a2m\,2m

a2mOm\a2m^m

、J

按以下方式存储于一维数组B[4m]中:

0123564m~l4m

a11

a12

a2l

a22

%

•••

«ij

写出由一对下标(ij)求k的转换公式。

i+j-l-i%2;

3.现有如下的稀疏矩阵A,要求画出三元组表示法。

r

0

0

0

22

0

-15

0

13

3

0

0

0

0

0

0

-6

0

0

A=

0

0

0

0

0

0

91

0

0

0

0

0

0

0

28

0

0

0

i

J

V

1

1

4

22

2

1

6

-15

3

2

2

13

4

2

3

3

5

3

4

-6

6

5

1

91

7

6

3

28

习题6

1.对于如图6-21所示的二叉树,试给出:

(1)它的顺序存储结构示意图。

(2)它的二叉链表存储结构示意图。

(3)它的三叉链表存储结构示意图。

图6-21题1图

2.证明:

在结点数多于1的哈夫曼树中不存在度为1的结点。

3.证明:

若哈夫曼树中有〃个叶结点,则树中共有2〃-1个结点。

4.已知一棵度为m的树中有为个度为1的结点,&个度为2的结点,……,个度为力的结点,问该树中共有多少个叶子结点?

有多少个非终端结点?

5.设高度为A的二叉树上只有度为0和度为2的结点,问该二叉树的结点数可能达到的最人值和最小值。

6.求表达式(a+8*(c-J))-eV的波兰式(前缀式)和逆波兰式(后缀式)。

7.画出和下列已知序列对应的二叉树。

(1)二叉树的先序次序访问序列为:

GFKDAIEBCHJo

(2)二叉树的中序访问次序为:

DIAEKFCJHBG。

8.画出和下列已知序列对应的二叉树。

(1)二叉树的后序次序访问序列为:

CFEGDBJLKIHA,

(2)二叉树的中序访问次序为:

CBEFDGAJIKLH。

9.画出和下列已知序列对应的二叉树。

(1)二叉树的层次序列为:

ABCDEFGHIJ.

(2)二叉树的中序次序为:

DBGEHJACIF。

10.假设用于通讯的电文仅由8个字母组成,字母在电文中出现的频率分别为7,19,2,6,32,3,21,10。

试为这8个字母设计赫夫曼编码。

使用0〜7的二进制表示形式是另一种编码方案。

对于上述实例,比较两种方案的优缺点。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

A

B

C

D

E

F

G

H

二、叶子结点多于一,如果存在度为一的结点,则应将孩子结点与双亲结点相联,而将度为一的结点去除。

三、度数为2的结点数为n2,又对于任意一棵二叉树而言,.・.

n=n2+1,・••总数结点数为n2+n=2n-1;

四、叶子结点数为:

n2*l+n3*2+n4*3++nm*(m-l)+l

非终端结点数为:

nl+n2*2+n3*3+nm*m

五、最大值:

2虹1最小值:

2h-l

六、波兰式:

-+a*b-cd/ef逆波兰式:

abcd-*+ef/-

七、先GFKDAIEBCHJ

中DIAEKFCJHBG

G

F

KB

DC

AH

IEJ

八、后CFEGDBJLKIHA

中CBEFDGAJIKLH

EG

F

九、层ABCDEFGHIJ

中DBGEHJACIF

A

B

DE

GH

J

十、1010

00

10000

1001

11

10001

01

1011

用哈夫曼编码之后长度比二进制要短,

而哈夫曼编码却没有二进制编码容易解码。

11.一棵度为2的树与一棵二叉树有何区别?

树与二叉树之间有何区别?

解:

树有多个分枝,而二叉树最多有两个分支;

 

下标

0

1

2

3

4

5

6

7

8

9

10

11

12

Date

A

B

c

G

F

E

D

I

H

J

K

M

N

Parent

-1

0

0

1

1

2

2

2

4

5

5

6

7

Child13591112

24610

13.画出下图所示的森林经转换后所对应的二叉树,并指出在二叉链表中某结点所对应的森林中结点为叶子结点的条件。

14.将如图所示的二叉树转换成相应的森林。

15.在具有n(n>l)个结点的各棵树中,其中深度最小的那棵树的深度是多少?

它共有多少叶子和非叶子结点?

其中深度最大的那棵树的深度是多少?

它共有多少叶子和非叶子结点?

16.画出和下列已知序列对应的树T:

树的先根访问序列为:

GFKDAIEBCHJ;

树的后根访问序列为:

DIAEKFCJHBGo

17.画出和下列已知序列对应的森林F:

森林的先序访问序列为:

ABCDEFGHIJKL;

森林的中序访问序列为:

CBEFDGAJIKLH。

18.对以孩子一兄弟链表表示的树编写计算树的深度的算法。

#include"iostream"

usingnamespacestd;

inti=0;

typedefstructstu{

chardata;

structstu*lchild;

structstu*rchild;

}NODE;

〃先序初始化。

voidchuo(NODE**q,chars[]){

NODE*p;

if(s[i]!

=\O')(

if(s[i]!

=''){

p=(NODE*)malloc(sizeof(NODE));p->data=s[i++];

p->lchild=NULL;p->rchild=NULL;

*q=p;

chuo(&p->lchild,s);

chuo(&p->rchild,s);

}

else

i++;

intlenpre(NODE*L){

if(!

L)

return0;

else{

intt,n=0;

while(L){

t=lenpre(L->lchild)+l;

if(t>n)n=t;

L=L->rchild;

returnn;

voidmain(){

NODE*L,*p;

chars[81]={"ABCDEGF"};

intn;

//gets(s);

chuo(&L,s);

n=lenpre(L);

cout«n«endl;

习题7

4

V5

1

2

4

A

5

V6

2

5

A

(4)逆邻接表。

序号

vertex

firstedge

0

Vl

2

5

A

1

V2

5

6

A

2

V3

2

A

3

V4

1

3

5

A

4

V5

3

6

A

5

V6

3

A

(5)强连通分量。

 

序号

vertex

firstedge

0

VO

Vl

V2

A

1

Vl

VO

V3

A

2

V2

VO

V3

A

3

V3

Vl

V2

V4

V5

A

4

V4

V3

V6

A

5

V5

V3

V6

A

6

V6

V4

V5

A

(3)该图的多重邻接表。

⑷从V。

出发的“深度优先”遍历序列。

VOvlv3v2v4v6v5

(5)从vo出发的“广度优先”遍历序列。

Vovlv2v3v4v5v6

3请对下边的无向带权图,

(1)写出它的邻接矩阵,并按普里姆算法求其最小生成树;

abbddedeeffheg

2

3

2

2

3

1

2

1

2

4

2

1

2

4

1

2

1

2

2

3

1

3

(2)写出它的邻接表,并按克鲁斯卡尔算法(cdeffhabbddeeg)求其最小

 

4对下图所示的带权有向图G,试回答以下问题:

 

(1)求出G中从结点vl出发按深度优先搜索遍历G所得到结点序列;

V1v2v3v8v5v7v4v6

(2)求出G中从结点vl出发按广度优先搜索遍历G所得的结点序列;

VIv2v4v6v3v5v7v8

5对于下图所示的带权图

(1

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2