1、数据结构C语言版第三版清华大学出版社习题参考答案让结局不留遗憾,让过程更加完美。附录 习题参考答案习题1参考答案1.1.选择题(1). A. (2). A. (3). A. (4). B.C. (5). A. (6). A. (7). C. (8). A. (9). B. (10.) A.1.2.填空题(1). 数据 关系(2). 逻辑结构 物理结构(3). 线性数据结构 树型结构 图结构(4). 顺序存储 链式存储 索引存储 散列表(Hash)存储(5). 变量的取值范围 操作的类别(6). 数据元素间的逻辑关系 数据元素存储方式或者数据元素的物理关系(7). 关系 网状结构 树结构(8).
2、 空间复杂度和时间复杂度(9). 空间 时间(10). (n)1.3 名词解释如下:数据:数据是信息的载体是计算机程序加工和处理的对象包括数值数据和非数值数据数据项:数据项指不可分割的、具有独立意义的最小数据单位数据项有时也称为字段或域数据元素:数据元素是数据的基本单位在计算机程序中通常作为一个整体进行考虑和处理一个数据元素可由若干个数据项组成数据逻辑结构:数据的逻辑结构就是指数据元素间的关系数据存储结构:数据的物理结构表示数据元素的存储方式或者数据元素的物理关系数据类型:是指变量的取值范围和所能够进行的操作的总和算法:是对特定问题求解步骤的一种描述是指令的有限序列1.4 语句的时间复杂度为:
3、(1) (n2) (2) (n2)(3) (n2)(4) (n-1)(5) (n3)1.5 参考程序:main()int XYZ;scanf(%d %d %d&X&YZ);if (X=Y) if(X=Z) if (Y=Z) printf(%d %d %dXYZ);else printf(%d %d %dXZY);else printf(%d %d %dZXY); else if(Z=X) if (Y=Z) printf(%d %d %dYZX);else printf(%d %d %dZYX);else printf(%d %d %dYXZ);1.6 参考程序:main() int in;fl
4、oat xap;printf(nn=);scanf(%f&n);printf(nx=);scanf(%f&x);for(i=0;i=n;i+)scanf(%f &ai); p=a0;for(i=1;inext=p-next; p-next=s ;(10). s-next 2.3. 解题思路:将顺序表A中的元素输入数组a若数组a中元素个数为n将下标为012.(n-1)/2的元素依次与下标为nn-1. (n-1)/2的元素交换输出数组a的元素参考程序如下:main() int in;float ta;printf(nn=);scanf(%f&n);for(i=0;i=n-1;i+)scanf(%f
5、 &ai); for(i=0;i=(n-1)/2;i+) t=ai; ai =an-1-i; an-1-i=t; for(i=0;i=n-1;i+) printf(%fai);2.4 算法与程序:main() int in;float ta;printf(nn=);scanf(%f&n);for(i=0;in;i+)scanf(%f &ai); for(i=1;ia0 t=ai; ai =a0; a0=t; printf(%fa0);for(i=2;ia1 t=ai; ai =a1; a1=t; printf(%fa0);2.5 算法与程序:main() int ijkn;float xta;
6、printf(nx=);scanf(%f&x);printf(nn=);scanf(%f&n);for(i=0;in;i+)scanf(%f &ai); / 输入线性表中的元素for (i=0; in; i+) / 对线性表中的元素递增排序 k=i; for (j=i+1; jn; j+) if (ajak) k=j; if (kj) t=ai;ai=ak;ak=t; for(i=0;ix) break;for(k=n-1;k=i;i-) / 移动线性表中元素然后插入元素x ak+1=ak; ai=x; for(i=0;i=n;i+) / 依次输出线性表中的元素printf(%fai);2.6
7、 算法思路:依次扫描A和B的元素比较A、B当前的元素的值将较小值的元素赋给C如此直到一个线性表扫描完毕最后将未扫描完顺序表中的余下部分赋给C即可C的容量要能够容纳A、B两个线性表相加的长度有序表的合并算法:void merge (SeqList A SeqList B SeqList *C) int ijk; i=0;j=0;k=0; while ( i=A.last & j=B.last ) if (A.dataidatak+=A.datai+; else C-datak+=B.dataj+;while (idatak+= A.datai+;while (jdatak+=B.dataj+;C
8、-last=k-1; 2.7 算法思路:依次将A中的元素和B的元素比较将值相等的元素赋给C如此直到线性表扫描完毕线性表C就是所求递增有序线性表算法:void merge (SeqList A SeqList B SeqList *C) int ijk; i=0;j=0;k=0; while ( i=A.last)while(jdatak+=A.datai+; C-last=k-1;习题3参考答案3.1.选择题(1). D (2). C (3). D (4). C (5). B (6). C (7). C (8). C (9). B (10).AB (11). D (12). B (13). D
9、 (14). C (15). C (16). D(17). D (18). C (19). C (20). C 3.2.填空题(1) FILO FIFO(2) -1 3 4 X * + 2 Y * 3 / -(3) stack.top stack.sstack.top=x(4) pllink-rlink=p-rlink p-rlink-llink=p-rlink(5) (R-F+M)%M(6) top1+1=top2(7) F=R(8) front=rear(9) front=(rear+1)%n(10) N-13.3 答:一般线性表使用数组来表示的线性表一般有插入、删除、读取等对于任意元素的
10、操作而栈只是一种特殊的线性表栈只能在线性表的一端插入(称为入栈push)或者读取栈顶元素或者称为弹出、出栈(pop)3.4 答:相同点:栈和队列都是特殊的线性表只在端点处进行插入删除操作不同点:栈只在一端(栈顶)进行插入删除操作;队列在一端(top)删除一端(rear)插入3.5 答:可能序列有14种:ABCD; ACBD; ACDB; ABDC; ADCB; BACD; BADC; BCAD; BCDA; BDCA; CBAD; CBDA; CDBA; DCBA3.6 答:不能得到435612最先出栈的是4则按321的方式出不可能得到1在2前的序列可以得到135426按如下方式进行push(
11、1) pop() push(2) push(3) pop() push(4) push(5) pop() pop() pop() push(6) pop() 3.7 答:stack3.8 非递归:int vonvert (int noint a) /将十进制数转换为2进制存放在a并返回位数 int r; SeStack s*p; P=&s; Init_stack(p); while(no) push(pno%2); no/=10; r=0; while(!empty_stack(p) pop(pa+r); r+; return r; 递归算法:void convert(int no) if(n
12、o/20) Convert(no/2); Printf(%dno%2); else printf(%dno); 3.9 参考程序:void view(SeStack s) SeStack *p; /假设栈元素为字符型 char c; p=&s; while(!empty_stack(p) c=pop(p); printf(%cc); printf(n);3.10 答:char3.11 参考程序:void out(linkqueue q) int e; while(q.rear !=q.front ) dequeue(qe); print(e); /打印 习题4参考答案4.1 选择题:(1).
13、A (2). D (3). C (4). C (5). B (6). B (7). D (8). A (9). B (10). D4.2 填空题:(1) 串长相等且对应位置字符相等(2) 不含任何元素的串0(3) 所含字符均是空格所含空格数(4) 10(5) hello boy(6) 13(7) 1066(8) 模式匹配(9) 串中所含不同字符的个数(10) 364.3 StrLength (s)=14 StrLength (t)=4 SubStr( s87)= STUDENT SubStr(t21)=OStrIndex(sA)=3 StrIndex (st)=0 StrRep(sSTUDEN
14、Tq)= I AM A WORKER4.4 StrRep(sY+);StrRep(s+*Y);4.5 空串:不含任何字符;空格串:所含字符都是空格串变量和串常量:串常量在程序的执行过程中只能引用不能改变;串变量的值在程序执行过程中是可以改变和重新赋值的主串与子串:子串是主串的一个子集串变量的名字与串变量的值:串变量的名字表示串值的标识符 4.6 int EQUAl(ST) char *p*q; p=&S; q=&T; while(*p&*q) if(*p!=*q) return *p-*q; p+; q+; return *p-*q; 4.7 (1)6*8*6=288(2)1000+47*6=
15、1282(3)1000+(8+4)*8=1096(4)1000+(6*7+4)*8=13684.8 习题5参考答案5.1 选择(1)C(2)B(3)C(4)B(5)C(6)D(7)C(8)C(9)B(10)C(11)B(12)C(13)C(14)C(15)C(16)B5.2 填空(1)1(2)1036;1040(3)2i(4) 1 ; n ; n-1 ; 2 (5)2k-1;2k-1(6)ACDBGJKIHFE(7)p!=NULL(8)Huffman树(9)其第一个孩子; 下一个兄弟(10)先序遍历;中序遍历5.3 叶子结点:C、F、G、L、I、M、K;非终端结点:A、B、D、E、J;各结点的
16、度:结点: A B C D E F G L I J K M 度: 4 3 0 1 2 0 0 0 0 1 0 0树深:45.4 无序树形态如下:二叉树形态如下:5.5 二叉链表如下:三叉链表如下:5.6 先序遍历序列:ABDEHICFJG中序遍历序列:DBHEIAFJCG后序遍历序列:DHIEBJFGCA5.7 (1) 先序序列和中序序列相同:空树或缺左子树的单支树; (2) 后序序列和中序序列相同:空树或缺右子树的单支树; (3) 先序序列和后序序列相同:空树或只有根结点的二叉树5.8 这棵二叉树为:5.9 先根遍历序列:ABFGLCDIEJMK后根遍历序列:FGLBCIDMJKEA层次遍历
17、序列:ABCDEFGLIJKM5.10 证明:设树中结点总数为n叶子结点数为n0则n=n0 + n1 + . + nm (1)再设树中分支数目为B则B=n1 + 2n2 + 3n3 + . + m nm (2)因为除根结点外每个结点均对应一个进入它的分支所以有n= B + 1 (3)将(1)和(2)代入(3)得n0 + n1 + . + nm = n1 + 2n2 + 3n3 + . + m nm + 1从而可得叶子结点数为:n0 = n2 + 2n3 + . + (m-1)nm + 1 5.11 由5.10结论得n0 = (k-1)nk + 1 又由 n=n0 + nk 得nk= n-n0代
18、入上式得n0 = (k-1)(n-n0)+ 1叶子结点数为:n0 = n (k-1) / k5.12 int NodeCount(BiTree T) /计算结点总数 if(T) if (T- lchild=NULL )&( T - rchild=NULL ) return 1; else return NodeCount(T- lchild ) +Node ( T - rchild )+1; elsereturn 0; 5.13 void ExchangeLR(Bitree bt)/* 将bt所指二叉树中所有结点的左、右子树相互交换 */if (bt & (bt-lchild | bt-rch
19、ild) bt-lchildbt-rchild; Exchange-lr(bt-lchild); Exchange-lr(bt-rchild);/* ExchangeLR */5.14 int IsFullBitree(Bitree T) /* 是则返回1否则返回0*/ Init_Queue(Q); /* 初始化队列*/ flag=0; In_Queue(QT); /* 根指针入队列 按层次遍历*/ while(!Empty_Queue (Q) Out_Queue(Qp); if(!p) flag=1; /* 若本次出队列的是空指针时则修改flag值为1若以后出队列的指针存在非空则可断定不是完
20、全二叉树 */ else if (flag) return 0; /*断定不是完全二叉树 */ else In_Queue(Qp-lchild); In_Queue(Qp-rchild); /* 不管孩子是否为空都入队列*/ /* while */ return 1; /* 只有从某个孩子指针开始之后所有孩子指针都为空才可断定为完全二叉树*/* IsFullBitree */5.15 转换的二叉树为:5.16 对应的森林分别为:5.17 typedef char elemtype; typedef struct elemtype data; int parent; NodeType;(1) 求
21、树中结点双亲的算法:int Parent(NodeType t elemtype x)/* x不存在时返回-2否则返回x双亲的下标(根的双亲为-1 */ for(i=0;iMAXNODE;i+) if(x=ti.data) return ti.parent; return -2;/*Parent*/(2) 求树中结点孩子的算法:void Children(NodeType t elemtype x)for(i=0;i=MAXNODE) printf(x不存在n); else flag=0;for(j=0;jMAXNODE;j+) if(i=tj.parent) printf(x的孩子:%cnt
22、j.data);flag=1; if(flag=0) printf(x无孩子n); /*Children*/5.18 typedef char elemtype;typedef struct ChildNode int childcode; struct ChildNode *nextchild;typedef struct elemtype data; struct ChildNode *firstchild; NodeType;(1) 求树中结点双亲的算法:int ParentCL(NodeType t elemtype x)/* x不存在时返回-2 否则返回x双亲的下标 */ for(i
23、=0;i=MAXNODE) return -2; /* x不存在 */ /*搜索x的双亲*/ for(i=0;inextchild)if(loc=p-childcode) return i; /*返回x结点的双亲下标*/ /* ParentL */(2) 求树中结点孩子的算法:void ChildrenCL(NodeType t elemtype x) for(i=0;inextchild) printf(x的孩子:%cntp- childcode.data); flag=1;if(flag=0) printf(x无孩子n);return; /*if*/ printf(x不存在n); retu
24、rn;/* ChildrenL */5.19 typedef char elemtype;typedef struct TreeNode elemtype data; struct TreeNode *firstchild; struct TreeNode *nextsibling; NodeType;void ChildrenCSL(NodeType *t elemtype x) /* 层次遍历方法 */ Init_Queue(Q); /* 初始化队列 */ In_Queue(Qt); count=0;while(!Empty_Queue (Q)Out_Queue(Qp);if(p-data=x) /*输出x的孩子*/p=p-firstchild;if(!p) printf(无孩子n);else printf(x的第%i个孩子:%cn+count p-data);/*输出第一个孩子*/p=p-nextsibling; /*沿右分支*/ while(p) printf(x的第%i个孩子:%cn +count p-da
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1