数据结构习题有答案讲解.docx
- 文档编号:5043701
- 上传时间:2022-12-12
- 格式:DOCX
- 页数:18
- 大小:26.84KB
数据结构习题有答案讲解.docx
《数据结构习题有答案讲解.docx》由会员分享,可在线阅读,更多相关《数据结构习题有答案讲解.docx(18页珍藏版)》请在冰豆网上搜索。
数据结构习题有答案讲解
第1章绪有以下几种二元组表示的数据结构,试画出它们分别对应的图形表示,并指出它们分别属于何种结构。
A=(D,R),其中,D={a1,a2,a3,a4},R={}B=(D,R),其中,D={a,b,c,d,e},R={(a,b),(b,c),(c,d),(d,e)}(3)C=(D,R),其中,D={a,b,c,d,e,f,g},R={(d,b),(d,g),(b,a),(b,c),(g,e),(e,f)}(4)K=(D,R),其中,D={1,2,3,4,5,6},R={<1,2>,<2,3>,<2,4>,<3,4>,<3,5>,<3,6>,<4,5>,<4,6>}
设n为正整数,求以下各程序段中的下划线语句的执行次数。
(1)i=1;k=0
(2)for(inti=1;i<=n;i++)while(i<=n-1)for(intj=1;j<=n;j++){{c[i][j]=0;k+=10*i;for(intk=1;k<=n;k++)i++;c[i][j]=c[i][j]+a[i][k]*b[k][j]}}(3)x=0;y=0;for(inti=1;i<=n;i++)for(intj=1;j<=i;j++)for(intk=1;k<=j;k++)x=x+y;
集合abcde
线性表
1
d
b
g
ac
e
3
(3)树
f
图
(4)
解:
(1)n-1
n
n
n
(2)
1n3
i1
j1
k1
n
i
j
1
n
i
j
ni(i
1)
1n
i2
1n
i
(3)i1
j
1k
1
i1
j
1
i1
2
2i
1
2i1
n(n1)(n2)6
25461n(n1)(2n1)1n(n1)2622
指出以下个算法的功能,并求其时间复杂度。
(1)intsum1(intn)
(2)intsum2(intn){{ints=0;intp=1,s=0;for(inti=1;i<=n;i++)for(inti=1;i<=n;i++){intp=1;{p*=i;s+=p;}for(intj=1;j<=i;j++)p*=j;returns;s+=p;}}returns;}算法设计有3枚硬币,其中有1枚是假的,伪币与真币重量略有不同。
如何借用一架天平,找出伪币?
以流程图表示算法。
上机练习题要求:
给出问题分析、算法描述、源程序及运行截图,在线提交。
1.设a,b,c为3个整数,求其中位于中间值的整数。
解:
n
(1)
i!
T(n)=O(n)
i
1
n
T(n)=O(n2)
(2)
i!
i
1
开始
是
A=B?
C是伪币
否
是
A=C?
B是伪币
否
A是伪币
结束
第2章线性表
1.设计算法:
在顺序表中删除值为
e的元素,删除成功,返回1;intSqlist
:
DeleteElem(Te)
否那么,返回0。
{for(i=1;i<=length;i++)//
按值顺序查找
*i可从0开始
if(elem[i-1]==e)
//
找到,进行删除操作
{for(j=i;j //ai至an依次前移 Elem[j-1]=elem[j]; length--; //表长减一 return1; //删除成功,返回 1 } return 0; //未找到,删除不成功,返回 0 } 2.分析顺序表中元素定位算法 intSqList : Locate(Te)解: 设表长为 n,等概率下,每个元素被定位的概率为: p=1/n 的时间复杂度。 定位成功第i 个元素,需比拟i次 nf(n)i1 1 i 1 n i 1 n(n1) n1 n n i1 n 2 2 3.对于有头结点的单链表,分别写出定位成功时,实现以下定位语句序列。 (2)定位到第i个结点ai;定位到第i个结点的前驱ai-1; p=head;j=0;while(p&&jnext;j++;}p=head;j=0;while(p&&j (3)定位到尾结点; p=head; while(p->next) p=p->next; (4)定位到尾结点的前驱。 p=head;while(p->next->next) p=p->next; 4.描述一下三个概念的区别: 头指针,头结点,首元结点。 并给 头指针: 是一个指针变量,里面存储的是链表中首结点的地址,并以此来标识一个链表。 予图示。 头结点: 附加在第一个元素结点之前的一个结点,头指针指向头结点。 首元结点: 指链表中的第一个元素结点。 头指针 头结点 首 (元)结点 尾(元)结点 ⋯...an^ a 1 a2 5. 对于无头结点单链表,给出删除第 i个结点的算法描述。 template template TLinkList : Delete(inti) {//在单链表上删除第 i个数据元素 TLinkList : Delete(inti) if(head==NULL)throw “表空! 〞;//空表,不能删 elseif(i==1) {//删除第 1个元素 p=Head;x=p->data; // 保存被删元素值 Head=p->next; deletep; } else{//元素定位到第ai-1 p=Head;j=1;// 定位查找起始位置 while{p->next&&j p=p->next;j++;} if(! p->next||j>i-1);// 定位失败 throw“删除位置不合理〞; else{//定位成功,进行结点删除 q=p->next; x=p>data; p->next=q->next; deleteq; } retrunx;//返回被删除元素值 }//# 6. 用教材定义的顺序表的根本操作实现以下操作: #include““ template template intDeleteElem(SqListL,Te) intDeleteElem(SqListL,Te){// i=L.LocateElem(e);//按值查找 7.L是有表头结点的单链表,且P结点既不是首元结点,也不是尾结点,试写出实现以下功能的语句序列。 在P结点后插入S结点;在P结点前插入S结点;在表首插入S结点;在表尾插入S结点.上机练习题要求: 给出问题分析、算法描述、源程序及运行截图,在线提交。 编程实现: 删除单链表中值为e的元素。 if(! i)//未找到 return0;else//找到delete(i);//删除被找到的元素}【解】s->next=p->next;p->next=s;q=L;while(q->next! =p)q=q->next;s->next=p或q->next;->next=s;s->next=L->next;L->next=s;q=L;while(q->next! =NULL)q=q->next;s->next=q->next;q->next=s; 第3章栈与队列铁路进行列车调度时,常把站台设计成栈式结构的站台,如右图所示。 试问: 假设进站的六辆列车顺序如上所述,那么是否能够得到325641和154623的出站序列,如果不能,说明为什么不能;如果能,说明如何得到(即写出"进栈"或"出栈"的序列)。 解: 325641可以 154623不可以。 123456 2.简述以下算法的功能〔栈的元素类型为 int〕。 解: (1)借助一个数组,将栈中的元素逆置。 (1)statusalgo_1(SqStackS){ inti,n,A[255]; n=0; while (! S.StackEmpty()) {n++;A[n]=S.Pop(); } (2)借助栈T,将栈S中所有值为e的数据元素删除之。 for(i=1;i<=n;i++)S.Push(A[i]); } (2)statusalgo_2(SqStackS,inte){ SqStackT; intd; while (! S.tackEmpty()) { d=S.Pop(); if (d! =e)T.Push(d); } while (! T.StackEmpty()) { d=T.Pop();T.Push(d);}} 3.编写一个算法,将一个非负的十进制整数N转换为B进制数,并输出转换后的结果。 当N=248D,B分别为8和16时,转换后的结果为多少? #include“〞intNumTrans(intN,intB){//十进制整数N转换为B进制数stack while(N! =0){//N非零i=N%B;//从低到高,依次求得各位 N=N/B; S.push(i); }//各位入栈 while(! S.StackEmpty()){// 栈不空 {i=S.pop(); If(i>9)i= ’A’+10-i; cout< } }//# 4借且栈,设计算法: 假设一个算术表达式中包含 “(、〞“)括〞号,解: 以字符串存储表达式,也可以边输入边判断。 对一个合法的数学表达式来说,括号 “(和〞“)应〞是相互匹配的。 顺序扫描表达式,左括号,入栈;右括号,如果此时栈空,表示多右括号,不匹 假设匹配,返回1;否那么,返回0。 配;如果栈不空,出栈一个左括号。 扫描结束,如果栈空,表示括号匹配;否那么,括 号不匹配,多左括号。 intblank_match(char*exp) { 用字符串存表达式 SqStack s; // 创立一个栈 char*p=exp;// 工作指针p指向表达式首 while(*p! =’=’) {// 不是表达式结束符 switch(p){ case’(’: //左括号,入栈 s.push(ch); break; case’)’//右括号 if(s.StackEmpty()) return0;//栈空,不匹配,多右括号 else{s.Pop();break;}//左括号出栈 }//switch p++;//取表达式下一个字符}//whileif(! s.StackEmpty())//表达式结束,栈不空 return0;//不匹配,多左括号elsereturn1;//匹配}//#简述栈和队列的逻辑特点,各举一个应用实例。 6.写出以下中缀表达式的后缀表达式。 (1) A-B+C-D+ (1)-A+B-C+D (2) AB+D*EFAD*+/+C+ (2)(A+B)*D+E/(F+A*D)+C (3) AB&&EF! || (3)A&&B||! (E>F) 7.计算后缀表达式: 45*32+- 的值。 解: 15 8.将以下递推过程改写为递归过程。 解: voidrecurision(intj) voidrecursion(intn){inti=n;while(i>1){ {if(j>1){cour< } cout< } } 9..将以下递归过程改写为非递归过程。 解: voidtest(int&sum) voidtest(int&sum){ {stackS;//借助一个栈 intx; intx; cin>>x; cin>>x; if(x==0)sum=0; while(x){ else{ S.push(x); test(sum);sum+=x;} cin>>x;} cout< sum=0; } cout< while(x=S.pop()){ sum+=x;cout< }// 10.简述以下算法的功能〔栈和队列的元素类型均为int〕。 解: 利用栈,将队列中的元素逆置 voidalgo(Queue&Q){StackS;//创立一个栈intd;while(! Q.QueueEmpty()){d=DeQueue(Q);S.Push(d);}while(! S.StackEmpty()){d=S.Pop();Q.EnQueue(d);}}12.假设以数组se[m]存放循环队列的元素,同时设变量rear和front分别作为队首、队尾指针,且队首指针指向队首前一个位置,队尾指针指向队尾元素处,初始时,rear==fornt==-1。 写出这样设计的循环队列入队、出队的算法。 解: 采用教材队空与队满判别方法。 为了区分队空与队满条件,牺牲一个元素空间。 即: rear==front,为队空;rear==(front+1)%m,为队满。 template 〞else{rear=(rear+1)%m;//队尾指针后移se[rear]=e;//元素入队return;}}//# template throw“队空,不能出队! 〞 else{front=(front+1)%m;//指针后移,指向队首元素e=se[front];//取队首元素returne;}}//# 上机练习题要求: 给出问题分析、算法描述、源程序及运行截图,在线提交。 1.借助栈,实现单链表上的逆置运算。 第4章串1.试问执行以下函数会产生怎样的输出结果? voiddemonstrate(){StrAssign(s,'THISISABOOK');StrRep(s,StrSub(s,3,7),'ESEARE');StrAssign(t,StrConcat(s,'S'));StrAssign(u,'XYXYXYXYXYXY');StrAssign(v,StrSub(u,6,3));StrAssign(w,'W');cout<<“'t=〞< 算法设计串结构定义如下: structSString 解: t=THESEAREBOOKS v=YXYw=XWXWXW 1〕S的next与nextval 值分别为 和002002002021, p的next与nextval 值分别为 012123和002003 2〕利用KMP算法的匹配过程: 第一趟匹配: aabaabaabaacaabaac(i=6,j=6)第二趟匹配: aabaabaabaac(aa)baac第三趟匹配: aabaabaabaac(成功)(aa)baac {char*data;//串首址intlen;//串长intStrSize;//存放数组的最大长度.};编写一个函数,计算一个子串在一个字符串中出现的次数,如果不出现,那么为0。 intstr_count(SStringS,SStringT) (2)编写算法,从串s中删除所有和串t相同的子串。 解: intstr_count(SStringS,SStringT){ inti,j,k,count=0;for(i=0;S.data[i];i++){for(j=i,k=0;(S.data[j]==T.data[k];j++,k++)if(k==T.len-1)count++;}returncount;}解: intSubString_Delete(SString&s,SStringt)//从串s中删除所有与t相同的子串,并返回删除次数{for(n=0,i=0;i<=s.len-t.len;i++){for(j=0;&&s[i+j]==t[i];j++);if(j>t.len)//找到了与t匹配的子串{for(k=i;k 编写一个函数,求串s和串t的一个最长公共子串。 voidmaxcomstr(SString*s,SString*t) ; n++;//被删除次数增1}}//forreturnn;}//Delete_SubString解: voidmaxcomstr(SString*s,SString*t){intindex=0,len1=0,i,j,k,len2;i=0;//作为扫描s的指针while(i =NULL;k++)len2++;if(len2>len1){//将较大长度者给index和len1index=i;len1=len2;}j+=len2;}//ifelsej++;}//whilecout<<〞最长公共子串: 〞for(i=0;i cout< s,t,v,StrLength(s),StrIndex(v,g),StrIndex(u,g)各是什么? : s='(XYZ)+*',t='(X+Z)*Y'。 试利用以下运算,将s转化为t。 联接: StrConcat(&S,T)求子串: (char*)StrSub(S,i,len)置换: StrRep(&S,T,R)上机练习题要求: 给出问题分析、算法描述、源程序及运行截图,在线提交。 串结构定义如下: structSString{ char*data; //串首址 intlen;intStrSize; //串长//存放数组的最大长度 . }; 求: 串 S所含不同字符的总数和每种字符的个数, 不区分英文字 母的大小写。 第5章数组与压缩矩阵 1.假设有二维数组A6×8,每个元素用相邻的6 个字节存储,存储器按 解: (1〕6×8×6=288Byte 字节编址。 A的起始存储位置(基地址)为 1000,计算: (2〕1000+288-6=1282; (1) 数组A 的体积〔即存储量〕 ; (3〕1000+(1×8+4)×6=1072 (2) 数组A 的最后一个元素 a57 的第一个字节的地址; (4〕1000+(7×6+4)×6=1276 (3) 按行存储时,元素a14 的第一个字节的地址 ; (4) 按列存储时,元素a47 的第一个字节的地址。 2. 假设按低下标优先存储整数数组 A9×3×5×8时,第一个元素的字节地址 是 100,每个整数占四个字节。 问以下元素的存储地址是什么? (1)a0000 (2)a8247 解: (1)100 (2)100+8×3×5×8+2×5×8+4×8+7=4500 3.一个稀疏矩阵如下图 0 3 0 0 0 0 (1) 0 2 0 5 0 0 给出三元组存储示意图; A= 0 0 0 0 0 (2) 给出带行指针向量的链式存储示意图; 0 9 0 0 0 0 1 4×6 (3)十字链表存储示意图。 M.data[] i j e 0 0 1 3 1 1 1 2 2 1 3 5 3 3 0 9 4 3 5 1 4 6 5 (2) (1)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 习题 答案 讲解