数据结构实用教程第二版答案-徐孝凯_第1页
数据结构实用教程第二版答案-徐孝凯_第2页
数据结构实用教程第二版答案-徐孝凯_第3页
数据结构实用教程第二版答案-徐孝凯_第4页
数据结构实用教程第二版答案-徐孝凯_第5页
已阅读5页,还剩121页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第一章绪习题一1.有以下几种用二元组表示的数据结构,试画出它们分别对应的图形表示〔当出现多个关系时,对每个关系画出相应的结构图〕,并指出它们分别属于何种结构。⑴A=(K,R)其中K={a1,a2,a3...,an}R={}⑵B=(K,R)其中K={a,b,c,d,e,f,g,h}R={r}r={<a,b>,<b,c>,<c,d>,<d,e>,<e,f>,<f,g>,<g,h>}⑶C=(K,R)其中K={a,b,c,d,f,g,h}R={r}r={<d,b>,<d,g>,<b,a>,<b,c>,<g,e>,<g,h>,<e,f>}⑷D=(K,R)其中K={1,2,3,4,5,6}R={r}r={(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,43}R={r1,r2,r3}r1={<48,25>,<25,64>,<64,57>,<57,82>,<82,36>,<36,75>,<75,43>}r2={<48,25>,<48,64>,<64,57>,<64,82>,<25,36>,<82,75>,<36,43>}r3={<25,36>,<36,43>,<43,48>,<48,57>,<57,64>,<64,75>,<75,82>}解:⑴是集合结构;⑵是线性结构;⑶⑷是树型结构;⑸散列结构。只作为参考。2.设计二次多项式ax2+bx+c的一种抽象数据类型,假定起名为QIAdratic,该类型的数据局部分为三个系数项a、b和c,操作局部为:(请写出下面每一个操作的具体实现)。⑴初始化数据成员ab和c(假定用记录类型Quadratie定义成员),每个数据成员的默认值为0。QuadraticInitQuadratic(floataa=0,floatbb=0,floatcc=0);解:QuadraticInitQuadratic(floataa,floatbb,floatcc){Quadraticq;q.a=aa;q.b=bb;q.c=cc;returnq;}⑵做两个多项式加法,即使对应的系数相加,并返回相加的结果。QuadraticAdd(Quadraticq1,Quadraticq2);解:QuadraticAdd(Quadraticq1,Quadraticq2);{Quadraticq;q.a=q1.a+q2.a;q.b=q1.b+q2.b;q.c=q1.c+q2.c;returnq;}⑶根据给定x的值计算多项式的值。floatEval(Quadraticq,floatx);解:floatEval(Quadraticq,floatx){return(q.a*x*x+q.b*x+q.c);}⑷计算方程ax2+bx+c=0的两个实数根,对于有实根、无实根和不是实根方程(即a==0)这三种情况要返回不同的整数值,以便于工作调用函数做不同的处理。intRoot(Quadraticq,float&r1,float&r2);解:intRoot(Quadraticq,float&r1,float&r2){if(q.a==0)return-1;floatx=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);return1;}elsereturn0;}⑸按照ax**2+bx+c的格式(x2用x**2表示)输出二次多项式,在输出时要注意去掉系数为0的项,并且当b和c的值为负时,其前不能出现加号。voidPrint(Quadraticq)解:voidPrint(Quadraticq){if(q.a)cout<<q.a<<"x**2";if(q.b)if(q.b>0)cout<<"+"<<q.b<<"x";elsecout<<q.b<<"x";if(q.c)if(q.c>0)cout<<"+"<<q.c;elsecout<<q.c;cout<<end1;}3.用c++函数描述以下每一个算法,并分别求出它们的时间复杂度。⑴比拟同一简单类型的两个数据x1和x2的大小,对于x1>x2,x1=x2和x1<x2这三种不同情况分别返回'>''='和'<'字符。假定简单类型用SimpleType表示,它可通过typedef语句定义为任一简单类型。解:charcompare(SimpleTypex1,SimpleTypex2){if(x1>x2)return'>';elseif(x1==x2)return'=';elsereturn'<';}其时间复杂度为O(1)⑵将一个字符串中的所有字符按相反方的次序重新放置。解:voidReverse(char*p){intn=strlen(p);for(inti=0;i<n/2;i++){charch;ch=p[i]p[i]=p[n-i-1];p[n-i-1]=ch;}}其时间复杂度为O(n)⑶求一维double型数组a[n]中的所有元素之乘积。解:doubleproduct(doublea[],intn){doublep=1;for(inti=0;i<n;i++)p*=a[i];returnp;}其时间复杂度为O(n)⑷计算Σni=0xi/i+1的值。解:doubleAccumulate(doublex,intn){doublep=1,s=1;for(inti=1;i<=n;i++){p*=x;s+=p/(i+1);}returns;}其时间复杂度为O(n)⑸假定一维数组a[n]中的每个元素值均在[0,200]区间内,分别统计出落在[0,20),[20,50),[50,80),[80,130),[130,200]等各区间的元素个数。解:intCount(inta[],intn,intc[5])//用数组c[5]保存统计结果{intd[5]={20,50,80,130,201};//用来保存各统计区间的上限inti,j;for(i=0;i<5;i++)c[i]=0;//给数组c[5]中的每个元素赋初值0for(i=0;i<n;i++){if(a[i]<0||a[i]>200)return0;//返回数值0表示数组中数据有错,统计失败for(j=0;j<5;j++)//查找a[i]所在区间if(a[i]<d[j])break;c[j]++;//使统计相应区间的元素增1}return1;//返回数值1表示统计成功}其时间复杂度为O(n)⑹从二维整型数组a[m][n]中查找出最大元素所在的行、列下标。解:voidfind(inta[M][N],intm,intn,int&Lin,int&Col)//M和N为全局常量,应满足M>=n和N>=n的条件,Lin和Col为引用//形参,它是对应实参的别名,其值由实参带回{Lin=0;Col=0;for(inti=0;i<m;i++)for(intj=0;j<n;j++)if(a[i][j]>a[Lin][Col]){Lin=i;Col=j;}}其时间复杂度为O(m*n)4.指出以下各算法的功能并求出其时间复杂度。⑴intprime(intn){inti=2;intx=(int)sqrt(n);while(i<=x){if(n%i==0)break;i++;}if(i>x)return1;elsereturn0;}解:判断n是否是一个素数,假设是那么返回数值1,否那么返回0。该算法的时间复杂度为O(n1/2)。⑵intsum1(intn){intp=1,s=0;for(inti=1;i<=n;i++){p*=i;s+=p;}returns;}解:计算Σi!(上标为n,下标为i=1)的值,其时间的复杂度为O(n)。⑶intsum2(intn){ints=0;for(inti=1;i<=n;i++){intp=1;for(intj=1;j<=i;j++)p*=j;s+=p;}returns;}解:计算Σi!的值,时间复杂度为O(n2)⑷intfun(intn){inti=1,s=1;while(s<n)s+=++i;returni;}解:求出满足不等式1+2+3...+i≥n的最小i值,其时间复杂度为O(n1/2)。⑸voidUseFile(ifstream&inp,intc[10])//假定inp所对应的文件中保存有n个整数{for(inti=0;i<10;i++)c[i]=0;intx;while(inp>>x){i=x%10;c[i]++;}}解:利用数组c[10]中的每个元素c[i]对应统计出inp所联系的整数文件中个位值同为i的整数个数,时间复杂度为O(n)⑹voidmtable(intn){for(inti=1;i<=n;i++){for(intj=i;j<=n;j++)cout<<i<<"*"<<j<<"="<<setw(2)<<i*j<<"";cout<<end1;}}解:打印出一个具有n行的乘法表,第i行(1≤i≤n)中有n-i+1个乘法项,每个乘法项为i与j(i≤j≤n)的乘积,时间复杂度为O(n2)。⑺voidcmatrix(inta[M][N],intd)//M和N为全局整型常量{for(inti=0;i<M;i++)for(intj=0;j<N;j++)a[i][j]*=d;}解:使数组a[M][N]中的每一个元素均详细以d的值,时间复杂度为O(M*N)⑻voidmatrimult(inta[M][N],intb[N][L],intc[M][L])//{inti,j,k;for(i=0;i<M;i++)for(j=0;j<L;j++)c[i][j]=0;for(i=0;i<M;i++)for(j=0;j<L;j++)for(k=0;k<N;k++)c[i][j]+=a[i][k]*b[k][j];}解:矩阵相乘,即a[M][N]×b[N][L]→c[M][L],时间复杂度为O(M×N×L)。5.题目略⑴解:voidInitSet(Set&s){for(inti=1;i<=SETSIZE;i++)s.m[i]=0;}⑵解:voidInitSet(Set&s,inta[],intn){fot(inti=0;i<n;i++)s.m[a[i]]=1;}⑶解:Setoperator+(Sets1,Sets2){Sets;InitSet(s);for(inti=1;i<=SETSIZE;i++)if((s1.m[i]==1)||s2.m[i]===1))s.m[i]=1;returns;}⑷解:Setoperator*(Sets1,Sets2){Sets;InitSet(s);for(inti=1;i<=SETSIZE;i++)if((s1.m[i]==1)&&(s2.m[i]==1))s.m[i]=1;returns;⑸解:Booleanoperator^(intelt,Sets){if(s.m[elt]==1)returnTrue;elsereturnFalse;}⑹解:voidInisert(Set&s,intn){s.m[n]=1;}⑺解:voidDelete(Set&s,intn){s.m[n]=0;}⑻解:ostream&operator<<(ostream&ostr,Set&s){ostr<<'{'for(inti=1;i<=SETSIZE;i++)if(s.m[i]==1)ostr<<i<<',';ostr<<'}'<<end1;returnostr;}第二章线性表习题二1.⑴解:(79,62,34,57,26,48)⑵解:(26,34,48,57,62,79)⑶解:(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),(34,0))3.对于List类型的线性表,编写出以下每个算法。⑴从线性表中删除具有最小值的元素并由函数返回,空出的位置由最后一个元素填补,假设线性表为空那么显示出错信息并退出运行。解:ElemTypeDMValue(List&L)//从线性表中删除具有最小值的元素并由函数返回,空出的位置//由最后一个元素填补,假设线性表为空那么显示出错信息并退出运行{if(ListEmpty(L)){cerr<<"ListisEmpty!"<<end1;exit(1);}ElemTypex;x=L.list[0];intk=0;for(inti=1;i<L.size;i++){ElemTypey=L.list[i];if(y<x){x=y;k=i;}}L.list[k]=L.list[L.size-1];L.size--;returnx;}⑵从线性表中删除第i个元素并由函数返回。解:intDeletel(List&L,inti)//从线性表中删除第i个元素并由函数返回{if(i<1||i>L.size){cerr<<"Indexisoutrange!"<<end1;exit(1);}ElemTypex;x=L.list[i-1];for(intj=i-1;j<L.size-1;j++)L.list[j]=L.list[j+1];L.size--;returnx;}⑶向线性表中第i个元素位置插入一个元素。解:voidInser1(List&L,inti,ElemTypex)//向线性表中第i个元素位置插入一个元素{if(i<1||i>L.size+1){cerr<<"Indexisoutrange!"<<end1;exit(1);}if(L.size==MaxSize){cerr<<"Listoverflow!"<<end1;exit(1);}for(intj=L.size-1;j>i-1;j--)L.list[j+1]=L.list[j];L.list[i-1]=x;L.size++;}⑷从线性表中删除具有给定值x的所有元素。解:voidDelete2(List&L,ElemTypex)//从线性表中删除具有给定值x的所有元素{inti=0;while(i<L.size)if(L.list[i]==x){for(intj=i+1;j<L.sizr;j++)L.list[j-1]=L.list[j];L.size--;}elsei++;}⑸从线性表中删除其值在给定值s和t之间(要求s小于t)的所有元素。解:voidDelete3(List&L,ElemTypes,ElemTypet)//从线性表中删除其值在给定值s和t之间的所有元素{inti=0;while(i<L.size)if((L.list[i]>=s)&&(L.list[i]<=t)){for(intj=i+1;j<L.size;j++)L.list[j-i]=L.list[j];L.size--;}elsei++;}⑹从有序表中删除其值在给定值s和t之间(要求s小于t)的所有元素。解:voidDelete4(List&L,ElemTypes,ElemTypet)//从有序表中删除其值在给定值s和t之间的所有元素{inti=0;while(i<L.size)//从有序表L中查找出大于等于s的第一个元素if(L.list[i]<s)i++;elsebreak;if(i<L.size){While((i+j<L.size)&&(L.list[i+j]<=t))j++;//求出s和t之间元素的个数for(intk=i+j;k<L.size;k++)L.list[k-j]=L.list[k];L.size-=j;}}⑺将两个有序表合并成一个新的有序表并由变量返回。解:voidMerge(List&L1,List&L2,List&L3)//将两个有序表合并成一个新的有序表并由变量返回{if(L1.size+L2.size>MaxSize){cerr<<"Listoverflow!"<<end1;exit(1);}inti=0,j=0,k=0;while((i<L1.size)&&(j<L2.size)){if(L1.list[i]<=L2.list[j]){//将L1中的元素赋给LL.list[k]=L1.list[i];i++;}else{//将L2中的元素赋给LL.list[k]=L2.list[j];j++;}k++;}while(i<L1.size){//将L1中剩余的元素赋给LL.list[k]=L1.list[i];i++;k++;}while(j<L2.size){//将L2中剩余的元素赋给LL.list[k]=L2.list[j];j++;k++;}L.size=k;}⑻从线性表中删除所有其值重复的元素,使其所有元素的值均不同,如对于线性表(2,8,9,2,5,5,6,8,7,2),那么执行此算法后变为(2,8,9,5,6,7)。解:voidDelete5(List&L)//从线性表中删除所有其值重复的元素,使其所有元素的值均不同{inti=0;while(i<L.size){intj=i+1;while(j<L.size){//删除重复值为L.list[i]的所有元素if(L.list[j]==L.list[i]){for(intk=j+1;k<L.size;k++)L.list[k-1]=L.list[k];L.size--;}elsej++;}i++;}}4.对于结点类型为LNode的单链接表,编写出以下每个算法。⑴将一个单链接表按逆序链接,即假设原单链表中存储元素的次序为a1,a2,...,an,那么逆序链接后变为an,an-1,...a1。解:voidContrary(LNode*&HL)//将一个单多办实事有按逆序链接{LNode*p=HL;//p指向待逆序的第一个结点,初始指向原表头结点HL=NULL;//HL仍为逆序后的表头指针,禄始值为空while(p!=NULL){//把原单链表中的结点依次进行逆序链接LNode*q=p;//q指向待处理的结点p=p->next;//p指向下一个待逆序的结点//将q结点插入到已陈序单链表的表头q->next=HL;HL=q;}}⑵删除单链表中的第i个结点。解:voidDelete1(LNode*&HL,inti)//删除单链表中的第i个结点{if(i<1||HL==NULL){cerr<<"Indexisoutrange!"<<end1;exit(1);}LNode*ap,*cp;ap=NULL;cp=HL;//cp指向当前结点,ap指向其前驱结点intj=1;while(cp!=NULL)if(j==i)break;//cp结点即为第i个结点else{//继续向后寻找ap=cp;cp=cp->next;j++;}if(cp==NULL){cerr<<"Indexisoutrange!"<<end1;exit(1);}if(ap==NULL)HL=HL->next;elseap->next=cp->next;deletecp;}⑶从单链表中查找出所有元素的最大值,该值由函数返回,假设单链表为空,那么显示出错信息并停止运行。解:ElemTypeMaxValue(LNode*HL)//从单链表中查找出所有元素的最大值,该值由函数返回{if(HL==NULL){cerr<<"Linkedlistisempty!"<<end1;exit(1);}ElemTypemax=HL->data;LNode*p=HL->next;while(p!=NULL){if(max<p->data)max=p->data;p=p->next;}returnmax;}⑷统计出单链表中结点的值等于给定值x的结点数。解:intCount(LNode*HL,ElemTypex)//统计出单链表中结点的值等于给定值x的结点数{intn=0;while(HL!=NULL){if(HL->data==x)n++;HL=HL->next;}returnn;}⑸根据一维数组a[n]建立一个单链表,使单链表中元素的次序与a[n]中元素的次序相同,并使该算法的时间复杂度为O(n)。解:voidCreate(LNode*&HL,ElemTypea[],intn)//根据一维数组a[n]建立一个单链表{InitList(HL);for(inti=n-1;i>=0;i--)InsertFront(HL,a[i];}⑹将一个单链表重新链接成有序单链表。解:voidOrderList(LNode*&HL)//将一个单链表重新链接成有序单链表{LNode*p=HL;//p指向待处理的第一个结点,初始指向原表头结点HL=NULL;//HL仍为待建立的有序表的表头指针,禄始值为空while(p!=NULL){//把原单链表中的结点依次进行有序链接LNode*q=p;//q指向待处理的结点p=p->next;//p指向下一个待处理的结点LNode*ap=NULL,*cp=HL;//cp指向有序表中待比拟的结点,ap指向其前驱结点while(cp!=NULL){//为插入q结点寻找插入位置if(q->data<cp->data)break;else{ap=cp;cp=cp->next;}}//将q结点插入到ap和cpxfhkoppujq->next=cp;if(ap==NULL)HL=q;elseap->next=q;}}⑺将两个有序单链表合并成一个有序单链表,合并后使原有单链表为空。解:LNode*Mergel(LNode*&p1,LNode*&p2)//将两个有序单链表合并成一个有序单链表{LNodea;//a结点作为结果的有序单链表的表头附加结点,这样便于处理,处理//结束后返回a结点的镄针域的值LNode*p=&a;//p指向结果的有序单链表的表尾结点p->next=NULL;//初始指向表头附加结点while((p1!=NULL)&&(p2!=NULL)){//处理两个表非空的情况if(p1->data<p2->data){p->next=p1;p1=p1->next;}else{p->next=p2;p2=p2->;}p=p->next;}if(p1!=NULL)p->next=p1;if(p2!=NULL)p->next=p2;p1=p2=NULL;returna.next;}⑻根据两个有序单链表生成一个新的有序单链表,原有单链表保持不变。如假定两个有序单链表中的元素为(2,8,10,20)和(3,8,9,15,16),那么生成的新单链表中的元素为(2,3,8,8,9,10,15,16,20)。解:LNode*Merge2(LNode*p1,LNode*p2)//根据两个有序单链表生成一个新的有序单链表{LNodea;//用a作为新的有序单链表的表头附加结点LNode*p=&a;//p指向结果有序单链表的表尾结点p->next=NULL;//初始指向表头附加结点while((p1!=NULL&&(p2!=NULL)){//处理两个表非空时的情况LNode*newptr=newLNode;if(p1->data<p2->data){//由p1->data建立新结点,然后p1指针后移newptr->data=p1->data;p1=p1->next;}else{//由p2->data建立新结点,然后p2指针后移newptr->data=p2->data;p2=p2->next;}//将newptr结点插入到结果的有序表的表尾p->next=newptr;p=newptr;}while(p1!=NULL){//继续处理p1单链表中剩余的结点LNode*newptr=newLNode;newptr->data=p1->data;p1=p1->next;p->next=newptr;p=newptr;}while(p2!=NULL){//继续处理p2单链表中剩余的结点LNode*newptr=newLNode;newptr->data=p2->data;p2=p2->next;p->next=newptr;p=newptr;}p->next=NULL;returna.next;}⑼根据一个元素类型为整型的单链表生成两个单链表,使得第一个单链表中包含原单链表中所有元素值为奇数的结点,使得第二个单链表中包含原单链表中所有元素值为偶数的结点。原有单链表保持不变。解:voidSeparate(LNode*HL,LNode*&p1,LNode*&p2)//根据一个单链表HL按条件拆分生成两个单链表p1和p2{LNodea,b;//a和b结点分别作为p1和p2单链表的表头附加结点LNode*t1=&a,*t2=&b;//t1和t2分别作为指向p1和p2单链表的//表尾结点,初始指向表头附加结点Lnode*p=HL;while(p!=NULL){//每循环一次产生一个新结点,并把它参加到p1或p2单链表//的未尾LNode*newptr=newLNode;if(p->data%2==1){newptr->data=p->data;t1->next=newptr;t1=newptr;}else{newptr->data=p->data;t2->next=newptr;t2=newptr;}p=p->next;}t1->next=t2->next=NULL;p1=a.next;p2=b.next;//把指向两个单链表的表头结点的指针分别赋给//p1和p2返回}6.编写一个算法,使用表头附加结点的循环单链表解决约瑟夫(Josephus)问题。其问题是:设有n个人围坐在一张圆桌周围,现从某个人开始从1报数,数到m的人出列(即离开坐位,不参加以后的报数),接着从出列的下一个人开始重新从1报数,数到m的人又出列,如此下去直到所有人都出列为止,试求出它们的出列次序。假设,当n=8、m=4时,假设从第一个人(假定每个人的编号依次为1,2...,n)开始报数,那么得到的出列次序为:4,8,5,2,1,3,7,6。此算法要求以n、m和s(假定从第s个人开始第一次报数)作为值参。解:voidJosephus(intn,intm,ints)//使用带表头附加结点的循环单链表解决约瑟夫问题{//生成表头附加结点,此时循环单链表为空LNode*HL=newLNode;HL->next=HL;inti;//生成含有n个结点、结点依次为1,2,...n的带表头结点的循环单链表for(i=n;i>=1;i--){//生成新的结点LNode*newptr=newLNode;newptr->data=i;//把新的结点插入到表头newptr->next=HL->next;HL->next=newptr;}//从表头开始顺序查找出第s个结点,对应第一个开始报数的人LNode*ap=HL,*cp=HL->next;for(i=1;i<s;i++){//ap和cp指针后移一个位置ap=cp;cp=cp->next;//假设cp指向了表头附加结点,那么仍需后移ap和cp指针,使之指向表头结点if(cp==HL){ap=HL;cp=HL->next;}}//依次使n-1个人出列for(i=1;i<n;i++){//顺序查找出待出列的人,即为循环结束后cp所指向的结点for(intj=1;j<m;j++){ap=cp;cp=cp->next;if(cp==HL){ap=HL;cp=HL->next;}}//输出cp结点的值,即出列的人cout<<cp->data<<"";//从单链表中删除cp结点ap->next=cp->next;deletecp;//使cp指向被删除结点的后继结点cp=ap->next;//假设cp指向了表头附加结点,那么后移ap和cp指针if(cp==HL){ap=HL;cp=HL->next;}}//使最后一个人出列cout<<HL->next->data<<end1;//删除表头结点和表头附加结点deleteHL->next;deleteHL;}7.对于在线性表抽象数据类型中定义的每一个操作,写出结点类型为LNode的带头附加结点的循环单链表上实现的对应算法。⑴初始化单链表解:voidInitList(LNode*HL){HL->next=HL;//将单链表置空}⑵删除单链表中的所有结点,使之成为一个空表voidClearList(LNode*HL){LNode*cp,*np;cp=HL->next;//将指向第一个结点的指针赋给cpwhile(cp!=HL)//遍历单链表,向系统交回每一个结点。{np=cp->next;//保存下一个结点的指针。deletecp;//删除当前结点。cp=np;//使下一个结点成为当前结点。}HL->next=HL;//置单链表为空}⑶得到单链表的长度intListSize(LNode*HL){LNode*p=HL->next;inti=0;while(p!=HL){i++;p=p->next;}returni;}⑷检查单链表是否为空intListEmpty(LNode*hl){return(HL->next==HL);}⑸得到单链表中第pos个结点中的元素ElemTypeGetElem(LNode*HL,intpos){if(pos<1){cerr<<"posisoutrange!"<<end1;exit(1);}LNode*p=HL->next;inti=0;while(p!=HL){i++;if(i==pos)break;p=p->next;}if(p!=HL)returnp->data;else{cerr<<"posisoutrange!"<<end1;exit(1);}}⑹遍历单链表voidTraverseList(LNode*HL){LNode*p=HL->next;while(p!=HL){cout<<p->data<<"";p=p->next;}cout<<end1;}⑺从单链表查找具有给定值的第一个元素intFind(LNode*HL,ElemType&item){LNode*p=HL->next;while(p!=HL)if(p->data==item){item=p->data;return1;}elsep=p->next;return0;}⑻更新单链表中具有给定值的第一个元素intUpdata(LNode*HL,constElemType&item){LNode*p=HL->next;while(p!=HL)//查找元素if(p->data==item)break;elsep=p->next;if(p==HL)return0;else{//更新元素p->data=item;return1;}}⑼向单链表的未尾插入一个元素voidInsertRear(LNode*HL,constElemType&item){LNode*newptr;newptr=newLNode;newptr->data=item;//把新元素赋给动态结点*newptr的值域。LNode*p=HL;while(p->next!=HL)//从表头开始遍历到最后一个结点为止。p=p->next;newptr->next=HL;p->next=newptr;//把新结点链接到表尾。}⑽向单链表的表头插入一个元素voidInsertFront(LNode*HL,constElemType&item){LNode*newptr;newptr=newLNode;newptr->data=item;newptr->next=HL->next;HL->next=newptr;}(11)向单链表中插入一个元素voidInsert(LNode*HL,constElemType&item){LNode*newptr;newptr=newLNode;newptr->data=item;LNode*ap,*cp;ap=HL;cp=HL->next;while(cp!=HL)if(item<cp->data)break;else{ap=cp;cp=cp->next;}newptr->next=cp;ap->next=newptr;}(12)从单链表中删除表头元素ElemTypeDeleteFront(LNode*HL){if(HL->next==HL){cerr<<"Deleteingfromanemptylist!"<<end1;exit(1);}LNode*p=HL->next;HL->next=p->next;ElemTypetemp=p->data;deletep;returntemp;}(13)从单链表中删除等于给定值的第一个元素intDelete(LNode*HL,constElemType&item){LNode*ap=HL,*cp=HL->next;while(cp!=HL)if(cp->data==item)break;else{ap=cp;cp=cp->next;}if(cp==HL){cerr<<"Deletedelementisnotexitst!"<<end1;return0;}else{ap->next=cp->next;deletecp;return1;}}(14)利用单链表进行数据排序voidLinkSort(ElemTypea[],intn){LNode*head=newLNode;InitList(head);inti;for(i=0;i<n;i++)Insert(head.a[i]);LNode*p=head->next;i=0;while(p!=head){a[i++]=p->data;p=p->next;}ClearList(head);deletehead;}*8.对于结点类型为DNode的双向链表,编写出以下每一个算法。⑴向双向链表的未尾插入一个值为x的结点。解:voidInsertRear(DNode*&DL,ElemTypex){//建立值为x的结点DNode*newptr=newDNode;newptr->data=x;newptr->left=newptr->right=newptr;//当链表为空时完成插入if(DL==NULL){DL=newptr;return;}//当链表不为空时完成插入DNode*p=DL->left;newptr->right=p->right;DL->left=newptr;newptr->left=p;p->right=newptr;}⑵向双向循环表的第i个结点位置插入一个值为x的结点。解:voidInsert(DNode*&DL,inti,ElemTypex){//i值越界,退出执行if(i<=0){cerr<<"iisoutrange!"<<end1;exit(1);}//建立值为x的新结点DNode*newptr=newDNode;newptr->data=x;newptr->left=newptr->right=newptr;//当链表为空同时i等于1时进行插入,i不为1那么退出if(DL==NULL)if(i==1){DL=newptr;return;}else{out<<"iisrange!"<<end1;exit(1);}//实现i等于1时的插入if(i==1){newptr->right=DL;newptr->left=DL->left;DL->left->right=newptr;DL->left=newptr;DL=newptr;return;}//查找第i个结点intk=1;DNode*p=DL->right;while(p!=DL){k++;if(k==i)break;p=p->right;}//i值越界,退出执行if(i>k+1){cerr<<"iisoutrange!"<<end1;exit(1);}//把newptr结点插入到p结点之前newptr->right=p;newptr->left=p->left;p->left->right=newptr;p->left=newptr;return;}⑶从双向循环链表中删除值为x的结点。解:boolDelete(DNode*&DL,ElemTypex){if(DL==NULL)return0;//当表头结点为x时那么删除之DNode*p=DL;if(DL->data==x){DL=DL->right;p->left->right=DL;DL->left=p->left;deletep;return1;}//查找值为x的结点p=p->right;while(p!=DL){if(p->data==x)break;elsep=p->right;}//不存在值为x的结点那么返回0if(p==DL)return0;//删除值为x的结点p->left->right=p->right;p->right->left=p->left;deletep;return1;}9.假定有一种带头附加结点的链表,每个结点含三个域:data、next和range,其中data为整型值域,next和range均为指针域,现在所有结点已经由next域链接起来,试编一算法,利用range域把所有结点按照其值从小到大的顺序链接起来,当然由此域链接得到的单链表的表头指针保存在表头附加结点的range域中。解:voidOrderList(SLNode*SL)//假定SLNode类型为按题目要求所定义的结点类型,SL为指向表头附加结点的指针{SL->range=NULL;for(SLNode*p=SL->next;p!=NULL;p=p->next){//每循环一次把p所指向的结点按序插入到以range域链接的有序表中SLNode*ap,*cp;//为p结点寻找适宜的插入位置ap=SL;cp=ap->range;while(cp!=NULL)if(p->data<cp->data)break;else{ap=cp;cp=cp->range;}//插入位置在ap和cp之间,把结点插入其中p->range=cp;ap->range=p;}}10.编一程序,实现以下功能:⒈按照9题对结点的要求生成一个具有10个整数元素结点的带表头附加结点的根据next域链接的链表,元素值由随机函数产生;⒉按照next域链接的次序输出链表中每个结点的值;⒊调用按第9题要求编写的操作算法;⒋按照range域链接的次序输出链表中每个结点的值。解://lx2-7.cpp#include<isotream.h>#include<stdlib.h>typedefintElemType;//规定元素类型为整型structSLNode//定义单链表结点{ElemTypedata;SLNode*next;SLNode*range;};voidOrderList(SLNode*SL){SL->range=NULL;for(SLNode*p=SL->next;p!=NULL;p=p->next){SLNode*ap,*cp;//为p结点寻找适宜的插入位置ap=SL;cp=ap->range;while(cp!=NULL)if(p->data<cp->data)break;else{ap=cp;cp=cp->range;}//插入位置在ap和cp之间,把p结点插入其中p->range=cp;ap->range=p;}}voidmain(){//按next域链接生成具有10个整数元素结点的链表SLNode*a=newSLNode;a->next=NULL;inti;SLNode*p;for(i=0;i<10;i++){p=newSLNode;p->data=range()%30;//假定产生30以内的随机整数p->next=a->next;a->next=p;}//按next域链接的次序输出单链表for(p=a->next;p!=NULL;p=p->next)cout<<p->data<<"";cout<<end1;//调用按第9题要求编写的操作算法orderList(a);//按range域链接的次序输出单链表for(p=a->range;p!=NULL;p=p->range)cout<<p->data<<"";cout<<end1;}稀疏距阵和广义表1.一个稀疏矩阵如以下图所示:0400000000-3001800000000050000-7000200006000图3-1具有6行×7列的一个稀疏矩阵⑴写出它的三元组线性表;解:((1,2,4),(2,4,-3),(2,7,1),(3,1,8),(4,4,5),(5,,2,-7),(5,6,2),(6,4,6))⑵给出它的顺序存储表示;解:下标12345678...MaxTermsrow(行号)12234556col(列号)24714264val(元素值)4-3185-726⑶给出它的转置矩阵的三元组线性表和顺序存储表示;解:((1,3,8),(2,1,4),(2,5,-7),(4,2,-3),(4,4,5),(4,6,6),(6,5,2),(7,2,1))⑷给出对它进行快速转置时,num向量中各分量的值;⑸给出对它进行快速转置前和转置后,pot向量中各分量的值。解:Col1234567Num[col]1203011pot[col](前)1244778pot[col](后)24477892.采用顺序存储方式实现稀疏矩阵M1和M2相加的运算,运算结果由变量M返回。解:voidAdd(SMatrix&M1,SMatrix&M2,SMatrix&M)//采用顺序存储方式实现稀疏矩阵M1和M2相加的运算,运算结果由变量M返回{InitMatrix(M);//假设两个矩阵尺寸不同,那么给出错误信息并停止运行if((M1.m!=M2.m)||(M1.n!=M2.n)){cerr<<"towmatrixmeasurenentsaredifferent!"<<end1;exit(1);}M.m=M1.m;M.n=M1.n;//假设两个矩阵均为零矩阵,那么无须计算if(M1.t==0)&&(M2.t==0))return;inti=1,j=1;//用i,j分别指示M1.smtM2.sm数组中待比拟元素的下标,初值均//为1intk=1;//用k指示M.sm数组中待写入元素的下标,初值为1while((i<=M1.t)&&(j<=M2.t)){//把行号较小元素写入到结果矩阵中,假设行号相同进行列号的比拟,使列号//较小的元素写入到结果矩阵中,假设行、列号均相等,那么当相应元素的//和不为0时才把这个和写入到结果矩阵中if(M1.sm[i].row<M2.sm[j].row){M.sm[k]=M1.sm[i];i++;k++;}elseif(M1.sm[i].row>M2.sm[j].row){M.sm[k]=M2.sm[j];j++;k++;}else{if(M1.sm[i].col<M2.sm[j].col){M.sm[k]=M1.sm[i];i++;k++;}elseif(M1.sm[i].col>M2.sm[i].col{M.sm[k]=M2.sm[j];j++;k++;}else{//此时相应元素的行列号必然相等if(M.sm[i].val+M2.sm[j].val!=0){M.sm[k].row=M1.sm[i].row;M.sm[k].col=M1.sm[i].col;M.sm[k].val=M1.sm[i].val+M2.sm[j].val;k++;}i++;j++;}}}while(i<=M1.t){//把M1中的剩余元素写入到结果矩阵M中M.sm[k]=M1.sm[i];i++;k++;}while(j<=M2.t){//把M2中的剩余元素写入到结果矩阵M中M.sm[k]=M2.sm[j];j++;k++;}M.t=k-1;//把写入到结果矩阵M中元素的个数赋给M中保存元素个数的//变量域return;}3.画出以下每个广义表的带表头附加结点的链接存储结构图并分别计算出它们的长度和深度。⑴A=(())⑵B=(a,b,c)⑶C=(a,(b,(c)))⑷D=((a,b),(c,d))⑸E=(a,(b,(c,d)),(e))⑹F=((a,(b,(),c),((d)),e)))解:每题的长度和深度如下表示。题号123456长度132231深度2132344.编写一个建立广义表链接存储结构的算法,假定广义表由字符串值提供。解:voidCreate(GLNode*&GL,char*a)//根据在字符串a中保存的广义表生成其对应的存储结构{staticinti=0;//定义静态变量i指示a中待处理的字符串位置,每处理一//个字符后i值增1if(a[i]=='\0')return;//当字符串处理结束后返回if(a[i]=='#'){GL=NULL;i++;}elseif(a[i]=='('){GL=newGLNode;GL->tag=True;i++;Create(GL->sublist,a);}if(GL=newGLNode;GL->tag=False;GL->data=a[i];i++;}else{GL=newGLNode;GL->tag=False;GL->data=a[i];i++;}if(GL==NULL)//此时的a[i]必然为')'字符i++;elseif(a[i]==','){i++;Create(GL->next,a);}elseif((a[i]==')')||(a[i]==',')){i++;GL->next=NULL;}}5.编写一个广义表中查找元素字等于给定值的算法,假设查找成功那么返回数值1,否那么返回数值0。解:intFind(GLNode*GL,charch)//从广义表GL中查找单元素字符等于ch的算法,假设查找成功,那么返回数值1,//否那么返回数值0{while(GL!=NULL){if(GL->tag==0){//处理单元素结点if(GL->data==ch)return1;//查找成功返回1elseGL=GL->next;//否那么继续向后查找}else{//处理子表结点intx=Find(GL->sublist,ch);//向子表中继续查找if(x)//假设在子表中查找成功那么返回1,否那么继续向后查找return1;elseGL=GL->next;}}return0;//当查找到表为空时返回0}栈和队列.习题四1.假定有四个元素A、B、C、D,按所列次序进栈,试写出所有可能的出栈列,注意,每一个元素进栈后都允许出栈,如ACDB就是一种出栈序列。解:ABCDABDCACBDADCBBACDBADCBCADBCDABDCACBADCDBADCBA2.在一个数组空间stack[StackMaxSize]中可以同时存放两个顺序栈,栈底分别在数组的两端,当第一个栈的栈顶指针top1等于-1时那么栈1为空,当第二个栈的栈顶指针top2等于StackMaxSize时栈2为空。两个栈均向中间增长,当向栈1插入元素时,使top1增1得到新的栈顶位置,当向栈2插入元素时,那么使top2减1才能够得到新的栈顶位置。当top1等于top2-1或者top2等于top1+1时,存储空间用完,无法再向任一栈插入元素。用于双栈操作的顺序存储类型可定义为:structBothstack{ElemTypestack[stackMaxSize];inttop1,top2;};双栈操作的抽象数据类型可定义为:DATBSTACKisData:采用顺序结构存储的双栈,其存储类型为Bothstackoperations:voidInitStack(Bothstack&BS,intk);//初始化栈。当k=1或2时对应置栈1或栈2为空,k=3时置两个格均为空voidClearstack(BothStack&BS,intk)//去除栈。当k=1或2时对应栈1或栈2被去除,k=3时两个栈均被去除intStackEmpty(BothStack&BS,intk)//判断栈是否为空。当k=1或2时判断对应的栈1或栈是否为空,k=3时//判断两个栈是否同时为空。假设判断结果为空那么返回1,否那么返回0ElemTypePeek(BothStack&BS,intk)//取栈顶元素。当k=1或2时对应返回栈1或栈2的栈顶元素voidPush(BothStack&Bs,intk,constElemType&item)//进栈。当k=1或2时对应向栈1或栈2的顶端压入元素itemEndBSTACK1.试写出上述抽象数据类型中每一种操作的算法。解:voidInitStack(BothStack&BS,intk){if(k==1)BS.top1=-1;elseif(k==2)BS.top2=StackMaxSize;elseif(k==3){BS.top1=-1;BS.top2=StackMaxSize;}}voidClearStack(BothStack&BS,intk){//函数体同上}intStackEmpty(BothStack&BS,intk){if(k==1)returnBS.top1==-1;elseif(k==2)returnBS.top2==StackMaxSize;elseif(k==3)return(BS.top1==-1)&&(BS,top2==StackMaxSize);else{cerr<<"k的值不正确!"';exit(1);}}ElemTypepeek(BothStack&BS,intk){if(k==1){if(BS.top1==-1){cerr<<"Stack1isempty!"<<end1;exit(1);}returnBS,stack(bs,top1);}elseif(k==2){if(BS.top2==StackMaxSize){cerr<<"Stack2isempty!"<<end1;exit(1);}returnBS,stack[BS,top2];}else{cerr<<"k的值不正确!";exit(1);}}voidpush(BothStack&BS,intk,constElemType&item){if(BS.top1==BS.top2-1){cerr<<"Stackoverflow!"<<end1;exit(1);}if(k==1){BS.top1++;Bs.stack[BS.top1]=item;}elseif(k==2){BS.top1--;BS.stack[BS.top2]=item;}}ElemTypepop(BothStack&BS,intk]{if(k==1){if(BS.top==-1){cerr<<"Stack1isempty!"<<end1;exit(1);}BS.top--;returnBS,stack[BS.top1+1];}elseif(k==2){if(BS.top==StackMaxSize){cerr<<"Stack2isempty!"<<end1;exit(1);}BS.top2++;returnBS.stack[BS,top2-1];}else{cerr<<"k的值不正确!";exit(1);}}2.假定上述所有操作的算法已存于头文件"bstack.h"中,试编写一个程序,让计算机随机产生出100以内的20个正整数并输出,同时把它们中的偶数依次存入到第一个栈中,奇数依次存入到第二个栈中,接着按照存入每个栈中元素的次序分别输出每个栈中的所有元素(此操作不改变栈的状态),然后按照后进先出的原那么输出每个栈中的所有元素。解:#include<iostream.h>#include<stdlib.h>constintStackMaxSize=50;typedefintElemType;structBothStack{ElemTypestack[StackMaxSize];inttop1,top2;};#include"bstack.h"voidmain(){BothStacka;InitStack(a,3);//初始化两个栈inti,j,k;//计算机产生20个随机数并输出,同时按奇偶数不同分别放入不同的栈中for(i=0;i<20;i++){j=rand()%100;cout<<j<<"";if(j%2==0)push(a,1,j);elsepush(a,2,j);}cout<<end1;//按照存入栈1中元素的次序输出栈1中的所有元素cout<<"栈1:";for(i=0;i<=a.top1;i++)cout<<a.stack[i]<<"";cout<<end1;//按照存入栈2中元素的次序输出栈2中的所有元素cout<<"栈2:";for(i=StackMaxSize-1;i>=a.top2;i--)cout<<a.stack[i]<<"";cout<<end1;//按照后进先出的原那么输出每个栈中的所有元素for(k=1;k<=2;k++){if(k==1)cout<<"栈1:";elsecout<<"栈2:";while(!StackEmpty(a,k))cout<<Pop(a,k)<<"";cout<<end1;}}该程序输入并运行后将得到如下结果(由于机器系统和C++版本不同,你得到的结果可能与此不同):416734069247858625458127619195422736栈1:34024785862644236栈2:416769545812761919527栈1:36426462587824034栈2:2795916127814556967413.设用第二章定义的类型为AlinkList的一维数组MS[MaxSize]建立三个链接堆栈,其中前三个元素的next域用来存储三个栈顶指针,从下标为3的元素起作为空闲元素提供应三个栈共同使用,试编写一个算法把从键盘上输入的n个整数按照以下条件分别进入不同的栈:⑴假设输入的整数x小于60,那么进第一个栈;⑵假设输入的整数x大于等于60同时小于100,那么进第二个栈;⑶假设输入的整数大于100,那么进第三个栈。解:voidMoreStack(ALinkListMS,intn)//把从键盘上输入的n个整数按不同条件分别进入到三个不同的链接栈中{if(n>MaxSize-3){cerr<<"存储空间缺乏!";exit(1);}inti,x,av;for(i=0;i<3;i++)MS[i].next=0//置空栈,即给三个栈顶指针赋0av=3;//av指向可利用元素的下标,赋初值为3cout<<"输入"<<n<<"个整数:"<<end1;for(i=0;i<n;i++){//从键盘读入一个整数并把它赋给av元素的值域cin>>x;MS[av].data=x;//按条件把av元素压入不同的栈,即链接到相应栈的栈顶if(x<60){Ms[av].next=MS[0].next;MS[0].next=av;}elseif(x>=60&&x<=100){MS[av].next=MS[1].next;MS[1].next=av;}else{MS[av].next=MS[2].next;MS[2].next=av;}//使av指向下一个可利用元素av++;}}4.编写一个程序,首先调用上题算法,然后分别打印出每个栈中的内容。解:#include<iostream.h>#include<stdlib.h>constintMaxSize=50;//要至少定义为比输入的整数个数大3typedefintElemType;structALNode{ElemTypedata;intnext;};typedefALNodeALinkList[MaxSize];voidMoreStack(ALinkListMS,intn){//函数体在此省略}voidmain(){ALinkLista;intn;cout<<"从键盘输入的整数个数(1~47):";cin>>n;MoreStack(a,n);for(inti=0;i<3;i++){//依次将每个栈中的元素全部出栈并打印出来intj=a[i].next;while(j!=0){cout<<a[j].data<<"";j=a[j].next;}cout<<end1;}}一次输入和运行结果如下:从键盘上输入的整数个数为(1~47):12输入12个整数:3864971207833452148825143602545333860887897641432141205.一个中缀算术表达式为:3+4/(25-(6+15))*8@⑴写出对应的后缀算术表达式。解:3425615+-/8*+@⑵画出在转换成后缀表达式的过程中运算符栈的变化。解:略6.一个后缀算术表达式为:248+3*4107-*/@⑴写出对应的中缀算术表达式。解:(24+8)*3/(4*(10-7))⑵画出在进行后缀算术表达式求值的过程中数值栈的变化。解:略7.为了计算表达式的值:把栈Stack类型定义为带模板的类型,该类型中包含顺序存储的栈和对栈的每一种基本操作的实现。解:把进行后缀表达式求值的Compute算法改写为使用Stack类的算法。解:把进行中缀表达式转换为后缀表达式的Change算法改写为使用Stack类的算法。解:写出计算C(n,k)的递归算法。解:利用二维数组写出计算C(n,k)的非递归算法。解:分析递归算法和非递归算法的时间复杂度和空间复杂度。解:template<classElemType>classStack{ElemTypestack[StackMaxSize];inttop;public:voidInitStack()//初始化栈对象,即把它置为空{top=-1;}voidClassStack()//去除栈对象中的所有元素,使之成为一个空栈{top=-1;}intStackEmpty()//判断栈对象是否为空,假设是那么返回1,否那么返回0{returntop==-1;}ElemTypepeek()//返回栈对象的栈顶元素,但不移动栈顶指针{if(top==-1){cerr<<"Stackisempty!"<<end1;exit(1);}returnstack[top];}voidpush(constElemType&item)//元素item进栈,即插入到栈顶if(top==StackMaxSize-1){cerr<<"Stackoverflow!"<<end1;exit(1);}top++;stack[top]=item;}ElemTypePop()//删除栈顶元素并返回之{if(top==-1){cerr<<"Stackisempty!"<<end1;exit(1);}ElemTypetemp=stack[top];top--;returntemp;}}floatCompute(char*str){Stack<float>s;//定义元素类型为float的栈S.InitStack();istrstreamins(str);charch;floatx;ins>>ch;while(ch!='@'){//扫描每一个字符并进行相应处理switch(ch){cass'+':X=S.Pop()+S.Pop();break;cass'-':X=S.Pop();X=S.Pop()-X;break;cass'*':X=S.Pop()*S.Pop();break;cass'/':X=S.Pop();if(X!=0.0)X=S.Pop()/X;else{cerr<<"Divideby0!"<<end1;exit(1);}break;ins.putback(ch);ins<<X;}S.Push(X);ins>>ch;}if(!S.StackEmpty()){x=s.Pop();if(!S.StackEmpty())returnX;else{cerr<<"expressionerror!"<<end1;exit(1);}}else{cerr<<"Stackisempty!"<<end1;exit(1);}}voidChange(char*s1,char*s2){Stack<char>R;//定义元素类型为char的栈R.InitStack();R.push('@');inti,j;i=0;j=0;charch=s1[i];while(ch='@'){if(ch=='')ch=s1[++i];elseif(ch=='('){R.Push(ch);ch=s1[++i];}elseif(ch==')'){while(R.peek()!='(')s2[j++]=R.Pop();R.Pop();ch=s1[++i];}elseif(ch=='+'||ch=='-'||ch=='*'||ch=='/'){charw=R.peek();while(precedence(w)>=Precedence(ch){s2[j++]=w;R.Pop();w=R.Peek();}R.Push(ch);ch=s1[++i];}else{while(isdigit(ch)||ch=='.'){s2[j++]=ch;ch=s1[++i];}s2[j++]='';}}ch=R.Pop();while(ch!='@'){s2[j++]=ch;ch=R.Pop();}s2[j++]='@';s2[j++]='\0';}8.编写把十进制正整数转换为十六进制数输出的算法。解:voidTransform(longnum)//把一个正整数num转为一个十六进制数输出{Stacka;InitStack(a);while(num!=0){intk=num%16;Push(a,k);num/=16;}while(!StackEmpty(a)){intX=Pop(a);if(x<10)cout<<x;else{switch(x){cass10:cout<<'A';break;cass11:cout<<'B';break;cass12:cout<<'C';break;cass13:cout<<'D';break;cass14:cout<<'

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论