1、数据结构实用第二版答案徐孝凯课案 第一章绪习 题 一1.有下列几种用二元组表示的数据结构,试画出它们分别对应的图形表示(当出现多个关系时,对每个关系画出相应的结构图),并指出它们分别属于何种结构。 A=(K,R)其中K=a1,a2,a3.,anR= B=(K,R)其中K=a,b,c,d,e,f,g,hR=rr=, C=(K,R)其中K=a,b,c,d,f,g,hR=rr=, D=(K,R)其中K=1,2,3,4,5,6R=rr=(1,2),(2,3),(2,4),(3,4),(3,5),(3,6),(4,5),(4,6) E=(K,R)其中K=48,25,64,57,82,36,75,43R=
2、r1,r2,r3r1=,r2=,r3=,解:是集合结构;是线性结构;是树型结构;散列结构。只作为参考。2.设计二次多项式ax2+bx+c的一种抽象数据类型,假定起名为QIAdratic,该类型的数据部分分为三个系数项a、b和c,操作部分为:(请写出下面每一个操作的具体实现)。 初始化数据成员ab和c(假定用记录类型Quadratie定义成员),每个数据成员的默认值为0。Quadratic InitQuadratic(float aa=0,float bb=0,float cc=0);解:Quadratic InitQuadratic(float aa,float bb,float cc)Qua
3、dratic q;q.a=aa;q.b=bb;q.c=cc;return q; 做两个多项式加法,即使对应的系数相加,并返回相加的结果。Quadratic Add(Quadratic q1,Quadratic q2);解:Quadratic Add(Quadratic q1,Quadratic q2);Quadratic q;q.a=q1.a+q2.a;q.b=q1.b+q2.b;q.c=q1.c+q2.c;return q; 根据给定x的值计算多项式的值。float Eval(Quadratic q,float x);解:float Eval(Quadratic q,float x)retu
4、rn(q.a*x*x+q.b*x+q.c); 计算方程ax2+bx+c=0的两个实数根,对于有实根、无实根和不是实根方程(即a=0)这三种情况要返回不同的整数值,以便于工作调用函数做不同的处理。int Root(Quadratic q,float& r1,float& r2);解:int Root(Quadratic q,float& r1,float& r2)if(q.a=0)return -1;float x=q.b*q.b-4*q.a*q.c;if(x=0)r1=(float)(-q.b+sqrt(x)/(2*q.a);r2=(float)(-q.b-sqrt(x)/(2*q.a);re
5、turn 1;elsereturn 0; 按照ax*2+bx+c的格式(x2用x*2表示)输出二次多项式,在输出时要注意去掉系数为0的项,并且当b和c的值为负时,其前不能出现加号。void Print(Quadratic q)解:void Print(Quadratic q)if(q.a) coutq.a0)cout+q.bx;elsecoutq.b0)cout+q.c;elsecoutq.c;coutx2,x1=x2和x1=和x2) return;else if(x1=x2) return =;else return;其时间复杂度为O(1) 将一个字符串中的所有字符按相反方的次序重新放置。解
6、:void Reverse(char*p)int n=strlen(p);for(int i=0;in/2;i+)char ch;ch=pipi=pn-i-1;pn-i-1=ch;其时间复杂度为O(n) 求一维double型数组an中的所有元素之乘积。解:double product(double a,int n)double p=1;for(int i=0;in;i+)p*=ai;return p;其时间复杂度为O(n) 计算ni=0xi/i+1的值。解:double Accumulate(double x,int n)double p=1,s=1;for(int i=1;i=n;i+)p*
7、=x;s+=p/(i+1);return s;其时间复杂度为O(n) 假定一维数组an中的每个元素值均在0,200区间内,分别统计出落在0,20),20,50),50,80),80,130),130,200等各区间的元素个数。解:int Count(int a,int n,int c5)/用数组c5保存统计结果int d5=20,50,80,130,201;/用来保存各统计区间的上限int i,j;for(i=0;i5;i+)ci=0;/给数组c5中的每个元素赋初值0for(i=0;in;i+)if(ai200)return 0;/返回数值0表示数组中数据有错,统计失败for(j=0;j5;j
8、+)/查找ai所在区间if(ai=n和N=n的条件,Lin和Col为引用/形参,它是对应实参的别名,其值由实参带回Lin=0;Col=0;for(int i=0;im;i+)for(int j=0;jaLinCol)Lin=i;Col=j;其时间复杂度为O(m*n)4.指出下列各算法的功能并求出其时间复杂度。 int prime(int n)int i=2;int x=(int)sqrt(n);while(ix)return 1;elsereturn 0;解:判断n是否是一个素数,若是则返回数值1,否则返回0。该算法的时间复杂度为O(n1/2)。 int sum1(int n)int p=1,
9、s=0;for(int i=1;i=n;i+)p*=i;s+=p;return s;解:计算i!(上标为n,下标为i=1)的值,其时间的复杂度为O(n)。 int sum2(int n)int s=0;for(int i=1;i=n;i+)int p=1;for(int j=1;j=i;j+)p*=j;s+=p;return s;解:计算i!的值,时间复杂度为O(n2) int fun(int n)int i=1,s=1;while(sn)s+=+i;return i;解:求出满足不等式1+2+3.+in的最小i值, 其时间复杂度为O(n1/2)。 void UseFile(ifstream&
10、 inp,int c10)/假定inp所对应的文件中保存有n个整数for(int i=0;ix)i=x%10;ci+;解:利用数组c10中的每个元素ci对应统计出inp所联系的整数文件中个位值同为i的整数个数,时间复杂度为O(n) void mtable(int n)for(int i=1;i=n;i+)for(int j=i;j=n;j+)couti*j=setw(2)i*j;coutend1;解:打印出一个具有n行的乘法表,第i行(1in)中有n-i+1个乘法项,每个乘法项为i与j(ijn)的乘积,时间复杂度为O(n2)。 void cmatrix(int aMN,int d)/M和N为全
11、局整型常量for(int i=0;iM;i+)for(int j=0;jN;j+)aij*=d;解:使数组aMN中的每一个元素均详细以d的值,时间复杂度为O(M*N) void matrimult(int aMN,int bNL,int cML)/int i,j,k;for(i=0;iM;i+)for(j=0;jL;j+)cij=0;for(i=0;iM;i+)for(j=0;jL;j+)for(k=0;kN;k+)cij+=aik*bkj;解:矩阵相乘,即aMNbNLcML,时间复杂度为O(MNL)。5.题目略解:void InitSet(Set& s)for(int i=1;i=SETSI
12、ZE;i+)s.mi=0;解:void InitSet(Set& s,int a,int n)fot(int i=0;in;i+)s.mai=1;解:Set operator + (Set s1,Set s2)Set s;InitSet(s);for(int i=1;i=SETSIZE;i+)if(s1.mi=1)|s2.mi=1)s.mi=1;return s;解:Set operator*(Set s1,Set s2)Set s;InitSet(s);for(int i=1;i=SETSIZE;i+)if(s1.mi=1)&(s2.mi=1)s.mi=1;return s;解:Boolea
13、n operator(int elt,Set s)if(s.melt=1)return True;elsereturn False;解:void Inisert(Set& s,int n)s.mn=1;解:void Delete(Set& s,int n)s.mn=0;解:ostream& operator(ostream& ostr,Set& s)ostrfor(int i=1;i=SETSIZE;i+)if(s.mi=1)ostri,;ostrend1;return ostr;第二章 线性表 习题 二1.解:(79,62,34,57,26,48)解:(26,34,48,57,62,79)解
14、:(48,56,57,62,79,34)解:(56,57,79,34)解:(26,34,39,48,57,62)2.解:为了排版方便,假定采用以下输出格式表示单链接表的示意图;每个括号内的数据表示一个元素结点,其中第一个数据为元素值,第二个数据为后继结点的指针,第一个元素结点前的数值为表头指针。(7(79,6),(62,5),(34,4),(57,3),(26,2),(48,0)(3(26,5),(34,2),(48,4),(57,6),(62,7),(79,0)(2(48,8),(56,4),(57,6),(62,7),(79,5),(34,0)(8(56,4),(57,7),(79,5),
15、(34,0)3.对于List类型的线性表,编写出下列每个算法。 从线性表中删除具有最小值的元素并由函数返回,空出的位置由最后一个元素填补,若线性表为空则显示出错信息并退出运行。解: ElemType DMValue(List&L)/从线性表中删除具有最小值的元素并由函数返回,空出的位置/由最后一个元素填补,若线性表为空则显示出错信息并退出运行if(ListEmpty(L)cerrList is Empty!end1;exit(1);ElemType x;x=L.list0;int k=0;for(int i=1;iL.size;i+)ElemType y=L.listi;if(yx)x=y;k
16、=i;L.listk=L.listL.size-1;L.size-;return x; 从线性表中删除第i个元素并由函数返回。解:int Deletel(List& L,int i)/从线性表中删除第i个元素并由函数返回if(iL.size)cerrIndex is out range!end1;exit(1);ElemType x;x=L.listi-1;for(int j=i-1;jL.size-1;j+)L.listj=L.listj+1;L.size-;return x; 向线性表中第i个元素位置插入一个元素。解:void Inser1(List& L,int i,ElemType x
17、)/向线性表中第i个元素位置插入一个元素if(iL.size+1)cerrIndex is out range!end1;exit(1);if(L.size=MaxSize)cerrList overflow!i-1;j-)L.listj+1=L.listj;L.listi-1=x;L.size+; 从线性表中删除具有给定值x的所有元素。解:void Delete2(List& L,ElemType x)/从线性表中删除具有给定值x的所有元素int i=0;while(iL.size)if(L.listi=x)for(int j=i+1;jL.sizr;j+)L.listj-1=L.listj
18、;L.size-;elsei+; 从线性表中删除其值在给定值s和t之间(要求s小于t)的所有元素。解:void Delete3(List& L,ElemType s,ElemType t)/从线性表中删除其值在给定值s和t之间的所有元素int i=0;while(i=s)&(L.listi=t)for(int j=i+1;jL.size;j+)L.listj-i=L.listj;L.size-;elsei+; 从有序表中删除其值在给定值s和t之间(要求s小于t)的所有元素。解:void Delete4(List& L,ElemType s,ElemType t)/从有序表中删除其值在给定值s和
19、t之间的所有元素int i=0;while(iL.size)/从有序表L中查找出大于等于s的第一个元素if(L.listis)i+;else break;if(iL.size)While(i+jL.size)&(L.listi+j=t)j+;/求出s和t之间元素的个数for(int k=i+j;kMaxSize)cerrList overflow!end1;exit(1);int i=0,j=0,k=0;while(iL1.size)&(jL2.size)if(L1.listi=L2.listj) /将L1中的元素赋给LL.listk=L1.listi;i+;else /将L2中的元素赋给LL
20、.listk=L2.listj;j+;k+;while(iL1.size) /将L1中剩余的元素赋给LL.listk=L1.listi;i+;k+;while(jL2.size) /将L2中剩余的元素赋给LL.listk=L2.listj;j+;k+;L.size=k; 从线性表中删除所有其值重复的元素,使其所有元素的值均不同,如对于线性表(2,8,9,2,5,5,6,8,7,2),则执行此算法后变为(2,8,9,5,6,7)。解:void Delete5(List& L)/从线性表中删除所有其值重复的元素,使其所有元素的值均不同int i=0;while(iL.size)int j=i+1;
21、while(jL.size) /删除重复值为L.listi的所有元素if(L.listj=L.listi)for(int k=j+1;knext; /p指向下一个待逆序的结点/将q结点插入到已陈序单链表的表头q-next=HL;HL=q; 删除单链表中的第i个结点。解:void Delete1(LNode*&HL,int i)/删除单链表中的第i个结点if(i1|HL=NULL)cerrIndex is out range!next;j+;if(cp=NULL)cerrIndex is out range!next;elseap-next=cp-next;delete cp; 从单链表中查找出
22、所有元素的最大值,该值由函数返回,若单链表为空,则显示出错信息并停止运行。解:ElemType MaxValue(LNode*HL)/从单链表中查找出所有元素的最大值,该值由函数返回if(HL=NULL)cerrLinked list is empty!data;LNode*p=HL-next;while(p!=NULL)if(maxdata) max=p-data;p=p-next;return max; 统计出单链表中结点的值等于给定值x的结点数。解:int Count(LNode*HL,ElemType x)/统计出单链表中结点的值等于给定值x的结点数int n=0;while(HL!=NULL)if(HL-data=x) n+;HL=HL-next;return n; 根据一
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1