1、否则从后向前先移动数据,找到合适的位置插入。Status Insert_SqList(SqList &La,int x)/ 把x 插入递增有序表 La 中if(La.le ngth=La.listsize) return ERROR;for(i=La.le ngth-1;La.elemix&i=0;i-)La.elemi+1=La.elemi;La.elemi+1=x;La.le ngth+;return OK;/l nsert_SqList2.5试写一个算法,实现顺序表的就地逆置,即在原表的存储空间将线性表(a1,a 2, ., a n-1, a n)逆置为(a n,a n-1 ,., a
2、2,a 1)/思路就是两个指示变量i,j同时分别从顺序表的开始和结尾处相向改变void reverse(SqList &A)/顺序表的就地逆置ElemT ype p;for(i=1,j=A.le ngth;ivj;i+,j-)/A.elemiA.elemj;p=A.elemi;A.elemi=A.elemj;A.elemj=p;/reverse2.7已知线性表L采用顺序存储结构存放,对两种不同情况分别写出算法,删除 L中多余的元素,使得L中没有重复元素:(1)L中数据元素无序排列;(2)L中 数据元素非递减有序排列。void Delete_SameElem(SqL ink &L,int L.l
3、e ngth)/内层循环移动参数,中层循环寻找相同元,外层循环遍历整个表int i=0; int j=i+1; int len gth=L.le ngth;while (ilength)for (j=i+1;jlength; j+)if (L.EIemj=L.EIemi)for (k=j; kL.EIemi) break;第二小问添加此句 /end for /end while /end functoion2.8已知线性表L采用链式结构存放。对两种不同情况分别写出算法,删除 L中 值相同的多余元素,使得L中没有重复元素:(2)L 中数据元素非递减有序排列。(1) L中数据元素无序排列;由于是无
4、序排列,需要线性表中每个元素都要相互进行比较。Status ListDelete ( Linklist &L )/L 是带头结点的线性表ElemT ype *p ,*q;p=L-next;q=p- / 设定 p变化较慢, q变化较快while( p-n ext)while(q) if(p-data匸q-data)q=q-n ext;elsep-n ext=q;/else/whilep=p-/开始后一结点的寻找return OK ;/ListDelete(2)L中数据元素非递减有序排列。由于是有序的,遍历一次线性表就行了Status ListDelete (Li nkList &L)p=L-n
5、ext)if (p-data!=q-data) /和第一问不同地方/ifelse data=q-/多个连续的重复值next=q;p=q;/删除值重复的结点,并修改相应的指针2.9设有两个非递减有序的单链表 A,B。请写出算法,将A和B就地归并成一个按元素值非递增有序的单链表。/将合并逆置后的结果放在 C表中,并删除B表Status ListMergeO pp ose_L(L in kList &A,L in kList & B,Li nkList &C)Lin kList pa,p b,qa,qb;pa=A;p b=B;qa=pa; / 保存pa的前驱指针qb=pb; /保存pb的前驱指针 p
6、a=pa-pb=pb-A- next=NULL;C=A;while( pa&p b)if(p a-data pa=pa-/将当前最小结点插入 A表表头qa-n ext=A- A-n ext=qa;qb-n ext=qb;while( pa)n ext=A -while( pb) pb=pb-pb=B;free( pb);2.13设以带头结点的双向循环链表表示的线性表 L=(a1,a2,a3,.,a n)。试写一时间复杂度为0(n)的算法,将L改造为L=(ai,a3,.,a n,.,a 4,a2)。void Reform(DuLinkedList &L)/ 按1,3,5,4,2的顺序重排双向循环
7、链表 L中的所有结点p=L.n ext;n ext!=L&n ext- =L)n ext=p- /p指向最后一个奇数结点next=L) /结点个数是奇数,使最后一个奇数结点 next指向最后一个偶数结点n ext=L-p re-pre;else/结点个数是偶数,使最后一个奇数结点 n ext指向最后一个偶数结点p re; /此时p指向最后一个偶数结点 pre!next=L;/最后一个结点next指向头结点调整了 next链的结构,此时pre链仍为原状 调整pre链的结构for(p=L;=L ;n ext) p-pre=p;L- /头结点的pre指向a2结点/Reform第三章栈和队列3.6试写
8、一个算法,识别依次读入的一个以砂结束符的字符序列是否为形如“序列1&序列2”模式的字符序列。其中,序列1和序列2中都不包含字符 & ,且序列2是序列1的逆序。例如,“ a+b&b+a是属于该模式的字符序列,而“ 1 + 3&31”则不是。算法:int SeqReverse()/判断输入的字符串中 &前和&后部分是否为逆串,是则返回1,否则返回0Ini tStack(s);while(e=getchar()!=)if(e= return 0;/不允许在& 之前岀现 push(s,e);/序列1输入完毕while( (e=getchar()!if(StackE mp ty(s)pop (s,c);
9、if(e!=c)if(!StackE mp ty(s)/序列1元素还有剩余return 1;/lsReverse3.7假设一个算术表达式中可以包含三种符号: 圆括号“(”和“)”、方括号“”和“”、花括号“ ”和“ ”,且这三种括号可按任意次序嵌套使用。编写判别 给定表达式中所含的括号是否正确配对的算法 (已知表达式已存入数据元素为字符的顺序表中)。算法:Status BracketTest(char *str)/判别表达式中三种括号是否匹配 for(p=str;* p;p+)if(*p=( | * p=T | *p=push(s,* p);elseif(* P= ) | * P= ) ret
10、urn ERROR;if(* p=)c!) if(* p=T&) if(* p=) /if/forStackE mp ty(s) return OK; /必须与当前栈顶括号匹配/进栈的符号还有剩余, Error/BracketTest3.8设表达式由单字母变量、双目运算符和圆括号组成(如 :“(a*(b+c)-d)/e )”。试写一个算法,将一个书写正确的表达式转换为逆波兰式。1.遇到数字直接发送 2.遇到(直接入栈 3遇到)则将栈内元素发送直至遇到 (4.栈空则直接入栈5.栈非空时若优先级大于栈内则入栈,否则栈内元素出栈int Ran kOfO perator(char c)switch(c
11、)case#:return+1 1 .-1;0;case case case 1*1/return 2;intPrecede( char c, char ch) retur n Ran kOfO perator(c)Ra nkOfO perator(ch);break ;default : if (IsEmpty(s)p ush(s,* exp);suffixi+=pop( s);exp -;/与后面的exp+相抵消,使得栈内优先级大于等于栈外的都出栈 /end switch /end else exp +;while (!lsEmpty(s) suffixi+=pop(s); suffixi
12、=0;3.10假设以带头结点的单循环链表表示队列,只设一个尾指针指向队尾元素,不设头指针。试编写相应的队列初始化、入队和出队算法(在出队算法中要传回 队头元素的值)要点:定义好数据类型,带头结点的单循环链表,只有尾指针,注意删除元素时 只有一个元素的特殊性typ edef int DataT ypestruct Node DataT ype data; Node * next;struct CycleListQueue Node * tail;void In itCycleListQueue(CycleListQueue&L)L.tail = new Node;L.tail-n ext = L
13、.tail;void En terQueue(CycleListQueue&L,DataT ype value) Node* p = new Node;data = value;n ext = L.tail-n ext = p;L.tail = p;voidifDep arQueue(CycleListQueue&L,DataT ype & d) (L.tail-n ext != L.tail-Node *p = L.tail-n ext = p-d = p-data;if (p=L.tail) L.tail=p-delete p;假设将循环队列定义为:以rear和length分别指示队尾元素
14、和队列长度。return d;3.11试给出此循环队列的队满条件,并写出相应的入队和出队算法(在出队算法中要 传递回队头元素的值)。此循环队列的队满条件:Q.le ngth=MAXQSIZE;入队算法:Status EnCyQueue(CyQueue &Q,int x)/ 带 length 域的循环队列入队算法 if(Q.le ngth=MAXSIZE) return OVERFLOW;Q.rear=(Q.rea 叶1)%MAXSIZE;Q.baseQ.rear=x; /rear 指向队尾元素Q.le ngth+;/E nCyQueue出队算法:Status DeCyQueue(CyQueue
15、 &Q,int &x)/带length域的循环队列岀队算法, 用x返回队头元素的值if(Q.length=0) return Error;/ 空队列,错误head=(Q.rear-Q.le ngth+1)%MAXSIZE; /head 指向队头x=Q.basehead;Q.le ngth-;/DeCyQueue3.12试写一个算法:判别读入的一个以为结束符的字符序列是否是“回文” (所谓“回文”是指正读和反读都相同的字符序列,如“ xxyzyxx ”是回文,而“abcab”则不是回文)。Status Test()/判别输入的字符串是否回文序列 ,是则返回1,否则返回0In itStack(S)
16、;Ini tQueue(Q);while(c=getchar()!Push(S,c);EnQueue(Q,c); /同时使用栈和队列两种结构while(!StackE mp ty(S)Pop (S,a);DeQueue(Q,b);if(a!=b) return ERROR;/ Test第五章多维数组5.4设有一个准对角矩阵ra11 a12a 21 a22a33 a34a43 a44按以下方式存于一维数组 B4m中:a11a12a21a22a33a34a43.aija2m-1,2ma2m,2m6k4m-2 4m-10 1 2 3 4 5写出由一对下标(i,j)求k的转换公式。因为i行前有2(i-
17、1)个元素。现考虑i行情况,当j是奇数,i行有1个元素,k=2(i-1)+1-1=2(i-1); 否则i行有2个元素,k=2(i-1)+2-1=2i-1。故:1)腐奇数 k=bni /为翩5.5已知稀疏矩阵A4X 5如下:(1)用三元组表作为存储结构,绘出相应的三元组表示意图;(2)用十字链表作为存储结构,绘出相应的十字链表示意图。(1)三元组表:ijv12547 (2)十字链表2 1 4data);lchild) En Queue(Q, p-lchild);rchild) En Queue(Q, p- rchild);return Ok;/LevelOrderTraverse6.19写出判断
18、两棵给定二叉树是否相似的算法。(注:两棵二叉树B1和B2相似是指:B1和B2皆空,或者皆不空且B1的左、右子树和B2的左、右子树分别相似。采用递归进行比较判断bool BiTreeSimilar (BiTree T1,BiTree T2)if(T1=Null& T2=Null)else if(T1=Null | T2=Null)return (BiTreeSilimar(T1-lchild,T2-lchild )&BiTreeSimilar(T1-rchild,T2-rchild);6.21写出统计树中叶子结点个数的算法,树用孩子兄弟链表表示。在孩子兄弟链表中,若结点的 firstchild为
19、Null,则为叶子结点;采用递归方法。int CountLeaves(Tree T,int &num)/num 传递的初值为 0if(T-n extsibli ng!=Null)nu m+=Co un tLeaves (T-n extsibli ng);firstchild!nu m+=Co un tLeaves(T- firstchild);num+=1;/firstchild 域为空,则为叶子结点return num;第七章图请给出该图的(1)邻接矩阵示意图邻接表示意图逆邻接表所有强连通分量图7-1(1)邻接矩阵0L1(2)邻接表0v1v2v3v4v5v6(3 )逆邻接表HZlZ(4)强连通分量7.2已知图G的邻接矩阵如图7-2所示。写出该图从顶点1出发的深度优先搜索 序列和广度优先搜索序列,并画出相应的深度优先生成树和广度优先生成树。1 23456789 1010图7-2深度优先序列:1 7 3 4 5 6 2 10 9 8深度优先生
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1