数据结构(C语言版)习题解答(18页).doc
《数据结构(C语言版)习题解答(18页).doc》由会员分享,可在线阅读,更多相关《数据结构(C语言版)习题解答(18页).doc(18页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、-数据结构(C语言版)习题解答-第 18 页1.3 设n是正整数。试写出下列程序段中用记号“”标注的语句的频度: (2)i=1; k=0;do k+=10*i;i+;while(i=2时,执行n-1次;(3) i=1; k=0; do k+ = 10*i; i+;while(i=n);当n=2时,执行2次;当n!=2时,执行1次;(4)i=1; j=0;while(i+jn) if(i=(y+1)*(y+1)y+;执行向下取整)(6)x=91; y=100;while ( y0 )if(x100) x-=10; y-; else x+ ; If语句执行100次(7)for( i=0; in;
2、i+)for( j=i; jn; j+)for( k=j; kx&i=0;i-)La.elemi+1=La.elemi;La.elemi+1=x;La.length+;return OK;/Insert_SqList2.5试写一个算法,实现顺序表的就地逆置,即在原表的存储空间将线性表(a1,a2, ., an-1,an)逆置为(an,an-1, ., a2,a1)/思路就是两个指示变量i,j同时分别从顺序表的开始和结尾处相向改变void reverse(SqList &A)/顺序表的就地逆置ElemType p;for(i=1,j=A.length;ij;i+,j-) /A.elemiA.el
3、emj; p=A.elemi; A.elemi=A.elemj; A.elemj=p;/reverse2.7 已知线性表L采用顺序存储结构存放,对两种不同情况分别写出算法,删除L中多余的元素,使得L中没有重复元素:(1)L中数据元素无序排列;(2)L中数据元素非递减有序排列。void Delete_SameElem(SqLink &L, int L.length)/内层循环移动参数,中层循环寻找相同元,外层循环遍历整个表int i=0; int j=i+1; int length=L.length;while(ilength)for(j=i+1;jlength; j+)if(L.Elemj=L
4、.Elemi)/for(k=j; kL.Elemi) break;/第二小问添加此句/end for/end while/end functoion2.8已知线性表L采用链式结构存放。对两种不同情况分别写出算法,删除L中值相同的多余元素,使得L中没有重复元素:(1)L中数据元素无序排列;(2)L中数据元素非递减有序排列。(1)L中数据元素无序排列;思路:由于是无序排列,需要线性表中每个元素都要相互进行比较。Status ListDelete(Linklist &L)/L是带头结点的线性表 ElemType *p,*q; p=L-next;q=p-next; /设定p变化较慢,q变化较快whil
5、e(p-next) while(q) if(p-data!=q-data) q=q-next;else q=q-next; p-next=q; /else/whilep=p-next;q=p-next;/开始后一结点的寻找return OK;/ListDelete(2)L中数据元素非递减有序排列。思路:由于是有序的,遍历一次线性表就行了Status ListDelete (LinkList &L) ElemType *p,*q; p=L-next;q=p-next; while(p-next) if (p-data!=q-data) p=p-next; /和第一问不同地方 q=p-next;
6、/if else while(p-data=q-data) q=q-next;/多个连续的重复值 /else p-next=q;p=q;q=p-next;/删除值重复的结点,并修改相应的指针return OK;/ListDelete2.9 设有两个非递减有序的单链表A,B。请写出算法,将A和B就地归并成一个按元素值非递增有序的单链表。/ 将合并逆置后的结果放在C表中,并删除B表Status ListMergeOppose_L(LinkList &A,LinkList &B,LinkList &C)LinkList pa,pb,qa,qb;pa=A;pb=B;qa=pa;/ 保存pa的前驱指针q
7、b=pb;/ 保存pb的前驱指针pa=pa-next;pb=pb-next;A-next=NULL;C=A;while(pa&pb)if(pa-datadata)qa=pa;pa=pa-next;qa-next=A-next;/将当前最小结点插入A表表头A-next=qa;elseqb=pb;pb=pb-next;qb-next=A-next;/将当前最小结点插入A表表头A-next=qb;while(pa)qa=pa;pa=pa-next;qa-next=A-next;A-next=qa;while(pb)qb=pb;pb=pb-next;qb-next=A-next;A-next=qb;p
8、b=B;free(pb);return OK;2.13 设以带头结点的双向循环链表表示的线性表L=(a1,a2,a3,.,an)。试写一时间复杂度为O(n)的算法,将L改造为L=(a1,a3,.,an,.,a4,a2)。void Reform(DuLinkedList &L)/按1,3,5,.4,2 的顺序重排双向循环链表L 中的所有结点p=L.next;while(p-next!=L&p-next-next!=L)p-next=p-next-next;p=p-next; /p指向最后一个奇数结点if(p-next=L) /结点个数是奇数,使最后一个奇数结点next指向最后一个偶数结点 p-n
9、ext=L-pre-pre;else/结点个数是偶数,使最后一个奇数结点next指向最后一个偶数结点 p-next=L-pre;p=p-next; /此时p 指向最后一个偶数结点while(p-pre-pre!=L) p-next=p-pre-pre; p=p-next;p-next=L;/最后一个结点next指向头结点 /调整了next 链的结构,此时pre 链仍为原状/调整pre 链的结构for(p=L;p-next!=L;p=p-next) p-next-pre=p;L-pre=p; /头结点的pre指向a2结点/Reform第三章 栈和队列3.6 试写一个算法,识别依次读入的一个以为结
10、束符的字符序列是否为形如“序列1&序列2”模式的字符序列。其中,序列1和序列2中都不包含字符&,且序列2是序列1的逆序。例如,“a+b&b+a”是属于该模式的字符序列,而“13&31”则不是。算法:int SeqReverse()/判断输入的字符串中&前和&后部分是否为逆串,是则返回1,否则返回0InitStack(s);while(e=getchar()!=&)if(e=) return 0;/不允许在&之前出现push(s,e);/序列1输入完毕while( (e=getchar()!=)if(StackEmpty(s) return 0;pop(s,c);if(e!=c) return
11、0;if(!StackEmpty(s) return 0;/序列1元素还有剩余return 1;/IsReverse3.7 假设一个算术表达式中可以包含三种符号:圆括号“(”和“)”、方括号“”和“”、花括号“”和“”,且这三种括号可按任意次序嵌套使用。编写判别给定表达式中所含的括号是否正确配对的算法(已知表达式已存入数据元素为字符的顺序表中)。算法:Status BracketTest(char *str)/判别表达式中三种括号是否匹配InitStack(s);for(p=str;*p;p+)if(*p=( | *p= | *p= ) push(s,*p);else if(*p= ) | *
12、p= | *p= ) if(StackEmpty(s) return ERROR;pop(s,c);if(*p=)&c!=() return ERROR;if(*p=&c!=) return ERROR;if(*p=&c!=) return ERROR; /必须与当前栈顶括号匹配/if/forif(!StackEmpty(s) return ERROR;/进栈的符号还有剩余,Errorreturn OK;/BracketTest3.8 设表达式由单字母变量、双目运算符和圆括号组成(如:“(a*(b+c)-d)/e)”。试写一个算法,将一个书写正确的表达式转换为逆波兰式。思路:1.遇到数字直接发
13、送 2.遇到(直接入栈 3.遇到)则将栈内元素发送直至遇到( 4.栈空则直接入栈 5.栈非空时若优先级大于栈内则入栈,否则栈内元素出栈int RankOfOperator(char c)switch(c)case #: return -1;case (: return 0;case +:case -: return 1;case *:case /:case ):return 2;int Precede(char c, char ch)return RankOfOperator(c)RankOfOperator(ch);void ExpressionTOPolandStyle(char suff
14、ix,char *exp)Stack s; InitStack(s,100); int i=0; char c;while(*exp)if(isdigital(*exp)suffixi+=*exp;elseswitch(*exp)case (: push(s,();case ): while(c=pops(s)!=() suffixi+=c;break;default: if(IsEmpty(s) push(s,*exp); else suffixi+=pop(s); exp-; /与后面的exp+相抵消,使得栈内优先级大于等于栈外的都出栈/end switch/end elseexp+;/e
15、nd whilewhile(!IsEmpty(s) suffixi+=pop(s); suffixi=0;3.10 假设以带头结点的单循环链表表示队列,只设一个尾指针指向队尾元素,不设头指针。试编写相应的队列初始化、入队和出队算法(在出队算法中要传回队头元素的值)要点:定义好数据类型,带头结点的单循环链表,只有尾指针,注意删除元素时只有一个元素的特殊性typedef int DataTypestruct NodeDataType data;Node * next;struct CycleListQueueNode * tail;void InitCycleListQueue(CycleList
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 语言版 习题 解答 18
限制150内