1、第一章 绪论1 (第18页,第(5)题)确定下列各程序段的程序步,确定划线语句的执行次数,计算它们的渐近时间复杂度。(1) i=1; k=0;do k=k+10*i; i+; while(i=(y+1)*(y+1) y+;划线语句的执行次数为 n 。第二章 线性表1第37页 习题(2).2 在类LinearList 中增加一个成员函数,将顺序表逆置,实现该函数并分析算法的时间复杂度。不利用类SeqList 提供的操作直接实现。template void SeqList:Invert()T e;for (int i=1;ivoid SingleList:invert() Node *p=firs
2、t,*q;first=NULL;while (p)q=p-link; p-link=first;first=p; p=q;3 (第 37 页,第 7 题) 单链表中结点按元素值递增链接,在类 SingleList 中增加一个成员函数,直接实现删除结点值在 a 至 b 之间的结点(ab)。template void SingleList:DeleteAb(T a,T b)/第 37 页,习题(7)Node *p=first,*q=first;while (p else if (q=first)q=p-link;delete p;p=first=q;elseq-link=p-link;delete
3、 p;p=q-link;4.(第 37 页,第 8 题) 在类 CircularList 中增加一个成员函数,在不增加新结点的情况下,直接实现两个链表合并为一个链表的算法,并分析其时间复杂度。templatevoid Merge(CircularList while (p-link!=b.first) p=p-link;p-link=a.first-link;a.first-link=b.first-link;b.first-link=b.first;b.length=0;templatevoid Merge1(CircularList b.first-data=b.first-link-da
4、ta;b.first-link=a.first-link;a.first-link=p-link;p-link=p;b.first=p;第三章 栈与队列1第50页 习题(1)设A、B、C、D、E五个元素依次进栈(进栈后可立即出栈),问能否得到下列序列。若能得到,则给出相应的push和pop序列;若不能,则说明理由。1)A,B,C,D,E 2) A,C,E,B,D 3) C,A,B,D,E 4) E,D,C,B,A答:2)和3)不能。对2)中的E,B,D而言,E最先出栈,则表明,此时B和D均在栈中,由于,B先于D进栈,所以应有D先出栈。同理3) 。2. 第50页 习题(9)利用栈可以检查表达式中
5、括号是否配对,试编写算法实现之。bool match(char a,int n)int top=-1;for (int i=0;i-1) top-;else return true;if (top-1) return true;return false;3. 第50页 习题(10)声明并实现链式队列类 LinkedQueue。template class LinkedStack: public Stack public:LinkedStack();LinkedStack();virtual bool IsEmpty() const;virtual bool IsFull() const;vir
6、tual bool GetTop(Tvirtual bool Push(const T x);virtual bool Pop();virtual void SetNull();private:Node *top;template LinkedStack:LinkedStack() top=NULL;template LinkedStack:LinkedStack() Node *q;while (top) q=top-link;delete top;top=q;template bool LinkedStack:IsEmpty() const return !top;template boo
7、l LinkedStack:IsFull() const return false;template bool LinkedStack:GetTop(T return true;template bool LinkedStack:Push(const T x) Node *q=new Node;q-data=x;q-link=top;top=q;return true;template bool LinkedStack:Pop() Node *q=top;if (IsEmpty() coutlink;delete q;return true;template void LinkedStack:
8、SetNull() Node *q;while (top) q=top-link;delete top;top=q;第四章 数组与字符串1. 给出三维数组元素 Aijk的存储地址 loc(Aijk)。答: 设有三维数组声明为 An1n2n3,每个元素占 k 个存储单元,则loc(Aijk)=loc(A000)+k*(i*n2*n3+j*n3+k)2 (第 68 页,第 5 题)给出下列稀疏矩阵的顺序三元组的行优先和列优先表示。答:3 (第 68 页,第 6 题)对题图 4-5 的稀疏矩阵执行矩阵转置时数组 num和 k的值。答:4 (第 69 页,第 15 题(2) )在顺序串类 String
9、 中增加一个成员函数,实现统计该串中出现的字符、字符个数和每个字符出现的次数。void String:count(char ch,int for (int i=0;iint SeqList:Search4(const Treturn Sch4(x,0);templateint SeqList:Sch4(const Tp-lchild=p-rchild;p-rchild=q;Exch(p-lchild);Exch(p-rchild);4. 第 107 页,第 10 题将图题 6-24 中的树转换成二叉树,并将图 6-23 中的二叉树转换成森林。5. 第 107 页,第 11 题给出对图 6-24
10、 中的树的先序遍历和后序遍历的结果。答:先序:A,D,E,F,J,G,M,B,L,H,C,K后序:J,G,F,E,D,M,H,L,K,C,B,A6. 第 107 页,第 12 题分别以下列数据为输入,构造最小堆。(1) 10,20,30,40,50,60,70,80(2) 80,70,60,50,40,30,20,10(3) 80,10,70,20,60,30,50,40(1)(2)(3)7. 第 107 页,第 13 题分别以上题的数据为输入,从空的优先权队列开始,依此插入这些元素,求结果优先权队列的状态。8. 第 108 页,第 14 题第(1) 、 (2)小题设 S=A,B,C,D,E,
11、F,W=2,3,5,7,9,12,对字符集合进行哈夫曼编码,W 为各字符的频率。(1) 画出哈夫曼树(2)计算带权路径长度第七章 集合与搜索树1第 137 页,第(5),建立 37,45,91,25,14,76,56,65 为输入时的二叉搜索树,再从该树上依此删除76,45,则树形分别如何?2 第137页,第(6)试写一个判定任意给定的二叉树是否二叉搜索树算法。int k=-; bool fail=false;template void BTree:IsBiTree(BTNode *p,int if(kelement) k=p-element;else fail=true;IsBiTree(p
12、-rchild,k,fail);3 第137页,第(8)以下列序列为输入,从空树开始构造AVL搜索树。(1)A,Z,B,Y,C,X(2)A,V,L,T,R,E,I,S,O,K4 第137页,第(12)5阶B-树的高度为2时,树中元素个数最少为多少?答: 55 第137页,第(13)题从空树开始,以关键字序列:a,g,f,b,k,d,h,m,j,e,s,i,r,x ,建立(1) 4阶B-树;(2) 5阶B-树。(1) 4阶B-树(2) 5阶B-树6 第137页,第(14)题从上题的4阶B-树上依次删除a,e,f,h。第八章 散列与跳表1 第154页,第(3)题设散列表ht11,散列函数h(key
13、)=key % 11。采用线性探查法解决冲突,试用关键字值序 列:70,25,80,35,60,45,50,55 建立散列表。2 第154页,第(6)题给出用拉链方法解决冲突的散列表搜索操作的C+函数实现。templatebool LinkedHashTable:Search(const K HNode* p=hti;/元素结点类型 Hnodewhile (p)if(p-element=k)return true;p=p-nextsynonym;return false;3 第154页,第(3)题设散列表ht11,散列函数h(key)=key % 11。采用二次探查法解决冲突,试用关键字值序列
14、:70,25,80,35,60,45,50,55 建立散列表。4 第154页,第(4)题对上题的例子,若采用双散列法,试以散列函数h 1(key)=key % 11,h 2(key)= key % 9+1建立散列表。第九章 图1 第188页,第(1)题对下面的有向图求(1) 每个顶点的入度和出度;(2) 强连通分量(3) 邻接矩阵2 第188页,第(2)题当以边1,0 , 1,3 , 2,1 , 2,4 , 3,2 , 3,4 , 4,0 , 4,1 , 4,5 ,5,0的次序从只有 6 个顶点没有边的图开始,通过依此插入这些边,建立邻接表结构。画出该邻接表。3 第188页,第(4)题已知有向
15、图的邻接表,试写出计算各顶点的入度的算法。templatevoid LinkedGraph:Degree()int *d=new intn;int i;ENode* p;for ( i=0;iadjvex+;p=p-nextarc;for ( i=0;ivoid MGraph:DFS(int v,bool visited)visitedv=true;cout void SingleList:select_sort() Node *p,*r,*small; p=first-link;if(p)for(; p-link; p=p-link) for(small=p,r=p-link; r; r=r
16、-link) if(small-datar-data) small=r;if(small!=p) swap(p-data, small-data);直接插入排序:template /用带表头节点的单链表存储void SingleList:DirInsert() Node *head,*q,*p1,*p2;if(first-link) head=first-link-link; /head 是待插入元素的链表头 first-link-link=NULL; /first 是只有一个节点的有序链表while(head) q=head; head=head-link;/从待插入链中取下一个节点p1=f
17、irst; p2=first-link; /p1 是 p2 的直接前驱节点while(p2 p2=p2-link; if(p2) /q 插入在 p1 和 p2 之间 q-link=p2; p1-link=q; else /q 插入在 p2 之后,即有序链的最后 q-link=NULL; p1-link=q; 104template void sort(T a,int n) int i,j,k=0,m=-1,s,t;T x;while (kai+1) x=ai; ai=ai+1; ai+1=x; s=i; m=s;t=m;for (j=m;jk;j-) /从下向上冒泡if (aj /方法一void sort(T a,int n)int i=0,j=n-1;T x=a0;while (i=0 /找负数if (ji) ai+=aj; while (aivoid Merge(T A,T Temp,int i1,int j1,int i2,int j2,int int i1,i2,j1,j2,i,k,size=1;while (sizen-1) j2=n-1; else j2=j1+size;Merge(A,Temp,i1,j1,i2,j2,k);i1=j2+1;for (i=0;in;i+) Ai=Tempi;size*=2;delete Temp;(2)计算带权路径长度