算法题背诵笔记-建议打印_第1页
算法题背诵笔记-建议打印_第2页
算法题背诵笔记-建议打印_第3页
算法题背诵笔记-建议打印_第4页
算法题背诵笔记-建议打印_第5页
已阅读5页,还剩75页未读 继续免费阅读

下载本文档

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

文档简介

1、顺序表递增有序,插入元素 infin( Sqlist L, in) for ( ini=0iL.length; +) ifx=p;- L.dataj+1=L.dataj ; L.datap=x ; +( L.length ) ; 删除顺序表中所有值为x 法一: voidelet( Sqlis&L, inx ) ink=0 ; fo( ini=0i=L.length-1;+i ) ifL.datai !=x ) L.datak=L.datai; +k ; L.length=k 法二: voidelet( Sqlis&L, inx ) ink=0 ; fo( ini=0i=t ) eturn fa

2、ls; fo( i=0i=s & L.datai=t ) +k ; else L.datai-k=L.datai ; L.length-=k eturn tue ; bool deletSqlist &L ) i( L.length=0 ) eturn fals; ini, j ; fo( i=0j=1; j=t | L.length=0 ) eturn fals; fo( i=0iL.length &L.datai=L.length ) eturn fals; fo(j=i; jL.length & L.dataj=t; +j ; fo( ; jC.maxsiz) eturn fals; i

3、ni=j=k=0 ; whil( iA.length & jB.length ) i( A.dataiB.dataj ) C.datak+=A.datai+ ; else C.datak+=B.dataj+ ; whil( iA.length ) C.datak+=A.datai+ ; whil( j=n | n=arry ) eturn ; inmid=(m+n)/2 ; fo( ini=0i=mid-m; +i ) intemp=Am+i; Am+i=An-i ; An-i=temp ; voichange inA , inm, inninsize everse ( A, 0, m+n-1

4、, size ) ; everse ( A, 0, n-1, size ) ; everse ( A, n, m+n-1, size ) ; 设计一个时间上尽可能高效的算法 未出现的最小正整数 infin( inA , inn ) in*B ; B=(int *) mallocsize(int*n ) ; fo( ini=0in; +i ) Bi=0 ; fo( ini=0i0 &Ai=n ) BAi-1=1 ; fo( i=0in; +i ) i( Bi=0 ) bea; eturn i+1 若一个整数序列中有过半相同元素 元素,设计算法找出数组A( a0,a1an-1 ) 主元素(其中0a

5、in)若存在主元素则输出, 否则返回-1 infu( inA , inn ) in*B =(int *) malloc( size(int) *n ) ; fo( ini=0in; +i ) Bi=0 ; ini, ; int max=0 ; fo( i=0i0 &Ai=n ) BAi-1+ ; fo( i=0imax ) max=Bi ; k=i ; i( maxn/2 ) eturn k+ else eturn -1 (WD 两个递增有序的单链表 有序的链表 voifun(LNodA, LNod*B, LNode *&C) LNod*p=A-next LNod=B-next ; LNod*

6、r ; C=A; C-next=NULL ; fe(B) ; r=C ; whil( !=NULL & !=NULL ) i( p-datadata )/若递减有序 next=p ;/s=p, p=p-next ; p=p-next ;/s-next=C-next ; r=-next ;/ C-next=s ; /后面的循环同上 else next=; q=q-next ; r=-next ; -next=NULL ; i( !=NULL next=p ;/ 逐个插入 i(q !=NULL ) next=; 查找链表中是否存在一个值为x的节 则删除结点并返回1,否则返回0 infinddele

7、e LNod*&C, inx ) LNod*p, ; p=C ; whil( p-next !=NULL ) i( p-nexdata=x ) bea; p=p-next ; i( p-next=NULL eturn 0 ; else q=p-next ; p-next=q-next ; fe(q) ; eturn 1; 在带头结点的单链表L中删除所有值为x 并释放空间 法一: voidelet( LNod*&L, inx ) LNod*p=L-next ; LNod*pre=L ; LNod; whil(p !=NULL ) i( p-data=x ) q=p ; pe-next=p-nex

8、; p=p-next ; fe(q) ; else pe=p ; p=p-next 法二: voidelet( LNod*&L, inx LNod*p=L-next ; LNod*r=L ; LNod; whil( !=NULL ) i( p-data !=x ) next=p ; r=p ; p=p-next ; els q=p ; p=p-next fe(q) ; next=NULL 试编写在带头结点的单链表L中删除最小值点 的高效算法(已知最小值唯一) voidelet( LNod*&L ) LNod*pre=L ; LNod*p=L-next ; LNod*minpe =L ; LNo

9、d*minp=L-next ; whil( p !=NULL ) i( p-datadata ) minp=p ; minpe=pe ; pe=p ; p=p-next minpe-next=minp-nex fe( minp ) ; 试编写算法将单链表就地逆置 法一: voieverse ( LNod*&L ) LNod*p=L-next, r=p-next LNod*pre ; p-next=NULL ; whil( r !=NUL) pe=p; p=r; r=-next; p-next=pr; L-next=p 法二: voieverse ( LNod*&L LNod*p, r ; p=

10、L-nex; L-next=NULL ; whil( p !=NULL ) r=p-next; p-next=L-next ; L-next=p ; p=r ; 给定两个单链表,找到两个链表公共结点 LinklisSeach ( LNod*L1, LNod*L2 ) inlen1=length (L1), len2=length (L2) indist ; LNod*long, short ; i( len1len2 ) long=L1-nex; short=L2-next ; dist=len1-len2 ; els long=L2-nex; short=L1-next dist=len2-

11、len1 ; whil( dis- ) long=long-next ; whil( lon!=NULL ) i( long=short ) eturn lon; els long=long-next ; short=shornext eturn NULL 给定一个单链表按递增排序输出的单链表中各 结点的数据元素 voidelet( LNod*&hea) whil( head-next !=NULL ) pe=hea; p=pre-nex; whil( p-next !=NULL ) ifp-nexdatanexdata pe=p ; p=p-next ; print( pe-nexdata

12、) u=pe-next ; pe-next=u-next ; fe(u) ; fe(head 将一个带头节点的单链表A分解成两个带头节 点的单链表A和B,使A中含奇数元素,B 偶数元素,且相对位置不变 B=( LNod*) mallocsize(LNode*n ) ; B-next=NULL ; voicrea( LNod*&A, LNod*&B ) ini=0 ; LNod*p=A ; LNod=; r=A-next ; A-next=NULL ; whil( r !=NUL) +i ; i( i%2=0 ) q-next=r ; q=r ; els p-next=r p=r ; r=-ne

13、xt p-next=NULL q-next=NULL 将a1,b1,a2,b2an,bn拆分成 a1,a2an 和 bn,bn-1,b1 B=( LNod*) mallo( size(LNode*n ; B-next=NULL ; voicrea( LNod*&A, LNod*&B ) LNod*p=A-next ; LNod*ra=A ; LNod; whil( !=NULL ) ra-next=p ; ra=p ; p=p-next ; q=p-next ; p-next=B-next ; B-next=p ; p=q ; ra-next=NULL 删除递增链表中重复的元素 voidele

14、t( LNod*&L LNod*p=L-next ; LNod; i( p=NULL ) eturn ; whil( p-next !=NULL ) q=p-next ; i( p-data=q-data p-next=q-next ; fe(q; else p=p-next 法二: whil( p !=NULL ) i( p-data=pre-data s=p ; pe-next=p-nex; p=p-next ; fe(s) ; els pe=p ; p=p-next ; A,B两个单链表递增有序,从A,B 元素产生单链表C,要求不破环A,B结点 voicrea( LNodA, LNod*

15、B ) LNod*p=A-next LNod=B-next ; LNod*s, C ; C= LNode *) malloc( size(LNode) ; r=C ; whil( p !=NULL & !=NULL ) i( p-datadata ) p=p-next ; elsi( p-dataq-data ) q=q-next ; els s=( LNod*) malloc(size(LNode; s-data=p-data ; next=s ; r=s ; p=p-next ; q=q-next ; next=NULL 继续上题,将交集放到A链表中 voiUnion LNod*&A, L

16、Nod*&B LNod*pa=A-next, *pb=B-next ; LNod*pc=A ; whil( a !=NULL &pb !=NULL ) i( a-data=pb-data ) pc-next=pa, pc=; a=a-next ; u=pb, pb=pb-next, fee (u; elsi( a-datadata ) u=a, a=a-next, fe(u) els u=pb, pb=pb-next, fee (u whil( a !=NULL ) u=a, a=a-next, fe(u) whil( p!=NULL ) u=pb, pb=pb-next, fee (u pc

17、-next=NULL fe(B) ; 查找单链表中倒数第k个结点若成功 该节点的data,并返回1,否则返回0 infin( LNod*head, in) LNod*p1=head-next ; LNod*p=head ; ini=1 ; whil( p !=NULL ) p1=p1-next ; +i ; i( i) p=p-next ; i( p=hea) eturn 0 ; els printf ( “%, p-data eturn 1 : 用单链表保存m个整数,并且|data|n,现在 要求设计时间复杂度尽可能高效的算法,对于 data绝对值相等的点,仅保留第一次出现的点 voifu(

18、 LNod*h, inn ) LNod*p=h ; LNod*r ; in=(in*) mallo(sizef(int) * (n+1) ) ; inm ; fo( ini=0inext != NULL ) i( p-nexdata0 ) m=p-nexdata ; els m=-p-nexdata ; i( qm=0 ) qm=1 ; p=p-next ; els r=p-next ; p-next=next fe(r) ; fe(q) int fun Dnode *L ) Dnode *p=L-next ; Dnode *q=L-prior ; while p !=q & p-next !

19、=q if ( p-data=q-data ) p=p-next ; q=q-prior else return 0 return 1 ; 有两个循环单链表,链表头指针分别为 试编写函数将h2链表接到h1之后 仍保持循环链表形式 voilinLNode *&h1, LNod*&h2 ) LNod*p, ; p=h1, q=h2 ; whil( p-next !=h1 p=p-next ; whil( q-next !=h2 ) q=q-next ; p-next=h2 ; q-next=h1 ; 设有一个带头结点的循环单链表 整数设计算法反复找出链表内最小值并不断输 出并将结点从链表中删除直到

20、链表为空 删除表头结点 voidelet( LNod*&L ) LNod*p, peminp, minp; whil( L-nex!=L ) p=L-nex; pe=L ; minp=p ; minpe=pe ; whil( p !=L ) i( p-datadata ) min=p ; minpe=pe ; pe=p; p=p-next prin( minp-data ; minpe-next=minp-nex fe(minp; fe(L) 带头结点的非循环双向链表 preddatafreq(频度) 设计算法使其按freq递减排序 voifu( Dnod*&L, in) Dnod*p=L-n

21、ext ; Dnod; whil( p !=NULL & p-data !=) p=p-next ; i( p=NULL printf ( “不存在” ); exi(0) ; els p-feq+ ; q=p-pre; p-nexped=; p-pred-next=p-next ; whil( !=L &q-feqfeq q=q-pre; p-next=q-next ; q-nexped=p ; p-pred=; q-next=p : 设计算法判断单链表的全部n个字符是否中心 对称,例如xyx,xyyx都是中心对称 infu( LNode *L, inn ) ini ; char s(n/2;

22、/是字符栈 p=L-nex; fo( i=0idata ; p=p-next ; i- ; i( n%2=1 ) p=p-next ; whil( !=NULL & si=p-data i- ; p=p-next ; i( i=-1 ) eturn else eturn 利用一个栈实现以下递归函数的非递归计算 1 Pn(x)2x 2xPn-1(x)-2(n-1)Pn2(x)n1 doubl( inn, doublx ) struct stack inno ; doublvl ; stMaxsize; intop=-1 ; doublfv1=1, fv2=2*x ; fo( i=ni=2; i-

23、 ) top+ ; sttop.no=i ; whil( top=0 ) sttop .val=2*x*fv1-2*sttop .no-1 )*fv1 fv1=fv2 ; fv2=sttop.va; top- ; i( n=0 ) eturn fv1 eturn fv2 ; 计算二叉树中所有结点个数 法一: incoun( Nod*p ) inn1, n2 ; i( p=NULL ) eturn ; els n1=coun( p-lchil) ; n2=coun( p-rchil eturn n1+n2+1 ; 法二: inn=0 ; voicoun( Nod*p i( !=NULL ) +n

24、 ; coun( p-lchil; coun( p-rchil) ; 计算二叉树中所有叶子节点的个数 法一: incoun( Nod*p ) inn1, n2 ; i( p=NULL ) eturn ; ifp-lchild=NUL&p- etur1 ; else n1=coun( p-lchil) ; n2=coun( p-rchil eturn n1+n2 ; 法二: inn=0 ; voicoun( Nod*p ) i( !=NULL ) ifp-lchild=NULL&p- +n ; coun( p-lchil; coun( p-rchil) ; (a-(b+c)*(d/e)存储在二叉

25、树,遍历求值 incomp ( Nod*p ) inA, ; i( !=NULL ) if(p-lchil!=NULL&p-chil A=comp ( p-lchil) ; B=comp p-rchil) ; eturn o( A, B, p-data ) else eturn p-data-0 else eturn 0 / 计算二叉树的深度 ingetDepth ( Node *p ) inLRD ; i( p=NULL ) eturn 0 ; els LD=getDepth p-lchil; RD=getDepth p-rchil) ; eturn ( LDR? LD : RD )+1 判

26、断两个二叉树是否相 一个根节点,或者左右子树都相似) infu( Nod*Node *) inleft, right ; i( T1=NULL &T2=NULL ) eturn ; i( T1=NULL |T2=NULL ) eturn ; els right=fu( T1-lchildT2-rchil) ; left=fun T1-lchild, T2-rchil) ; eturn left & right ; voiswap ( Nod*p ) i( !=NULL ) swap ( p-lchil) ; swap ( p-chil) ; temp=p-lchil; p-lchild=p-r

27、chil: p-rchild=temp ; 查找二叉树中data域等于key 若存在,将q指向它,否则q为空 voifu(TNode *p, Nod*&q, int ke) i( !=NULL ) i( p-data=key ) q=p; els fu(p-lchild, q, ke; fu(p-rchild, q, ke) 输出先序遍历第k个结点的值 inn=0 ; voitrav( Nod*p, ink i( !=NULL ) +n ; i( k=n ) printf ( “%, p-data eturn ; trave p-lchildk ) ; trave p-rchild, ) 利用

28、结点的右孩子指针将一个二叉树的叶子节 点从左向右连接成一个单链表(head 个,tail指向最后一个) voilinBt *p, Bt*&headBt *&tail ) i( !=NULL ) i( ! p-lchil& ! p-chil) i( head=NULL ) head=p ; tail=p ; els tail-child=p tail=p ; lin( p-lchild, headtail ) ; lin( p-childhead, tai) 增加一个指向双亲节点的parent 针赋值,并输出所有节点到根节点的路径 typedef trucNod char data ; truc

29、Node *aentlchild, chil; Nde ; voifu( Nod*p, Nod) i( !=NULL ) p-aent=; q=p ; fu( p-lchildq ; fu( p-rchild, ) ; voiprintath Nod*p whil( p !=NULL ) printf ( “%c, p-data ) ; p=p-aen; voiallth ( Nod*p i( !=NULL ) printath (p; allth (p-lchil) ; allth (p-rchild 求二叉树中值为x的层号 inL1=1 ; voifu( Nod*p, in i( !=NU

30、LL ) i( p-data=x ) printf ( “%, L1 ; +L1 ; fu( p-lchildx ) ; fu( p-rchild, ) ; -L1 ; 输出根节点到每个叶子结点的路径 ini, top=0 ; char athstack maxsize ; voiallth ( Nod*p ) i( !=NULL ) athstacktop=p-data ; +top ; i( ! p-lchil& ! p-chil) fo( i0; ilchild ; allth ( p-chil -top ; 已知满二叉树先序序列存在于数组中,设计算法将其变成后序序列 voichange

31、 ( char pre , int L1, int R1, char post , int L2, int R) if L1data=AL1 ; fo( i=L2; Bi !=oodata; i+) ; ii L2 ) oolchild=crea( A, B, L1+1, i-L2+L1, L2, i-1 ; else oolchild=NULL ; ii child=cea( A, B, i-L2+L1+1, R1, i+1, R2 ) ; else oochild=NUL; eturoot ; 找出二叉树中最大值的点 voiMa( Nod*p, in&ma i( p !=NULL ) i(

32、 p-datamax ) max=p-data ; Ma( p-lchildmax ) ; Ma( p-rchild, ma) ; 一颗二叉树以顺序方式存在数组A的n个元素中 表表示 voicrea( Nod*&t, char A, ini, inj ) i( i j ) t=NULL ; els t=( Nod*) mallocsize(TNode) ; data=Ai ; creat( lchild, A, 2*i, n ) ; creat( child, A, 2*i+1, n ; 先序非递归遍历二叉树 oipeNnecursion ( Nod*bt ibt !=NULL ) Node

33、*tackmaxsize ; intop=-1 ; Node *p ; ack +top=bt whil( to!=-1 p=tacktop- visi(p) ; ip-rchil!=NULL ) ack+top=p-rchil; ip-lchil!=NULL ) ack+top=p-lchil; 中序非递归遍历二叉树 voiinNonecursion Nod*bt ibt !=NULL ) Nod*ackmaxsize ; intop=-1 ; Nod*p=bt ; whil( top !=-1 |p !=NULL ) whil( !=NULL ) tack+top=p p=p-lchil;

34、 itop !=-1 ) p=tacktop- visi(p; p=p-rchil; 后序非递归遍历二叉树 voipostNonecursion (TNode *bt Inittac(s) ; Nod*p=bt, r=NULL ; whil( p!=NULL | ! IsEmpty (s) ) i( p !=NULL ) push (s, p; p=p-lchil; els Get(s, p) ;/取栈顶结点 i( p-chil&p-rchil!=r p=p-rchil; push (s, p; p=p-lchil; els po(s, p) visip ; r=; p=NULL ; 后序非递

35、归遍历二叉树(法二) oipostoderNonecursion(Nod*bt ibt !=NULL ) Node *tack1maxsize ; Node *tack2maxsize ; intop1=top2=-1 ; Node *p=NULL ; ack1+top1=bt ; whil( top!=-1 ) p=tack1top1- ; ack2+top2=p ; ip-lchil!=NULL ) ack1+top1=p-lchil; ip-rchil!=NULL ) ack1+top1=p-rchil whil( top!=-1 ) p=tack2top2- visi(p) ; 在二叉

36、树中查找值为x的结点,打印出值为 的所有祖先 oiSeach (TNode *bt, inx ) ack ack ; intop=0 ; whil( b!=NULL | top0 ) whil( b!=NULL & bdata != tac+top.t=bt ; tactop.tag=0 ; bt=blchil; ibdata=x ) fo( ini=1; idata exi(1) ; whil(top !=& tacktop.tag=1 top-; itop !=0 ) tacktop.tag=1 ; bt=acktop.chil; 找到p和q最近公共祖先结点r typedestruct N

37、od*t ; intag ; tack /前一题也加上这一结构体 tack s , s1 ; Nodfun(*ot, *p, intop=0 ; Nod*bt=o; whil( bt !=NUL| top whil( bt !=NUL) s+top.t=bt ; stop.tag=0 ; bt=blchil; whil( top !=0 & Stop.tag=1 i( stop.t=p ) fo( i=1i0; -) fo( j=op1; j0; j- i( s1j.t=si.t eturn si.t top-; i( to!=0 ) stop .tag=1 ; bt=stop.chil et

38、urn NUL 层次遍历 oilevel Node p ) infont=ear=0 ; Node uemaxsize; Node ; ip !=NUL) ear=(ear+1%maxsize ; queear=p ; whil( fon!=ea) font=(front+1%maxsize ; q=quefont; visi(q) ; iq-lchil!=NULL ) ear=(ear+1% maxsize queear=q-rchil; iq-rchil!=NULL ) ear=(ear+1% maxsize queear=q-lchil; typedestruct Node *p ; i

39、nlno ; ; inmaxNode Nod*boot ) quemaxsize ; infont=ear=0 ; inlno, i, jn, max ; iboot !=NULL ) que+ear.p=boot ; queear.lno=; whil( fon!=ea) Nod=que+frnt . Lno=quefont.lno ; iq-lchil!=NULL ) que+ear.p=q-lchil; queear.lno=Lno+; iq-rchil!=NULL ) que+ear.p=q-rchil queear.lno=Lno+; max=0 ; fo( i=1; i=lno+i

40、 ) n=0; fo( j=1; j=ear; +j iquej.lno=i +n ; imaxlchil) EnQueup-lchil) ; i( p-chil) EnQueup-chil whil( IsEmpty (s)=fals p (s, p) ; visip-data ) ; 用层次遍历求解二叉树的高度 inBtdepth ( Node *boot iboot=NULL ) etur; infont=-1, ear=-1 ; inlast=0, level=; Node *Qmaxsize ; Q+rear=boot ; Node *p ; whil( fontlchil) Q+r

41、ear=p-lchil; ip-rchil) Q+rear=p-chil; ifont=last ) level+ ; last=ea; eturlevel 判断二叉树是否为完全二叉树 boofu( Nod*p ) IniQueu(Q) ; ip=NULL ) etur1 ; EnQueu(p) ; whil( ! IsEmpty (Q) ) DeQueu(p) ; i(p !=NULL) EnQueu( p-lchil) EnQueu( Q, p-rchil) else whil( ! IsEmpty (Q) DeQueu(p) ; ip !=NULL ) etur0 ; etur1 对树中

42、每个元素为x的结点 子树,并释放相应空间 voidelet( Node *bt ) i( bt !=NUL) delet( blchil; delet( bchil; fe(bt) ; voiSeach ( Node *bt, inx Nod*Q ; i( bt !=NUL) i( bdata=x ) delet(bt) ; exi(0) ; InitQueu(Q) ; EnQueu(p; whil( ! IsEmpty (Q) ) DeQueu(p) ; i( p-lchil!=NULL ) i( p-lchild-data=x delet( p-lchil) ; p-lchild=NULL

43、 ; else EnQueup-lchil) i(右子树同上) infun ( Node *ro) Node quemaxsize ; infont=ear=wp1=deep=0 ; Node *last, ne; last=oo;new=NULL ; queear+=oo; whil( fon!=ea) Node *t=quefront+ ; if! lchil& child ) wp1+=deep*weig; ilchil!=NULL ) queear+=lchil; new=lchil; ichil!=NULL ) queear+=chil new=chil; it=last last=

44、ne; deep+=1 eturwp1 法二: infun ( Nod*p, int deep ) inwp1=0 ; i! p-lchil&! p-rchil wp1+=deep*p-weigh ; ip-lchil!=NULL ) fu( p-lchild, deep+1 ; ip-rchil!=NULL ) fu( p-childdeep+) ; eturwp1 ; 中序遍历线索二叉树 TNod*First ( TTNod whil( p-ltag=) p=p-lchil; eturp ; TNod*Next TTNode ip-rtag=0) eturFirst p-rchil) ;

45、else eturp-rchil: voiInThea(T*p, T*&pe) i( p !NULL ) InTheap-lchild, p) ; i( p-lchild=NULL ) p-lchild=p; p-ltag=1 ; i( pe &pe-child=NULL pe-child=p ; pe-rtag=1 ; pe=p ; InThea(p-rchild, pe voicrea( TNod*roo TTNod*pre=NULL ; i( oo!=NULL ) InTheaoot, p) ; pe-child=NULL ; pe-rtag=1 ; 编写算法 keppe=-32151

46、; injudgeBST ( Node *bt ) inb1, b2 ; ibt=NULL ) etur; else b1=judgeBS( blchil; ib1=0 | pe=bdata ) etur; pe=bdata ; b2=judgeBS( bchil) ; eturb2 ; inlevel ( Nod*bt, Nod*p ) inn=0 ; Nod*t=bt ; ibt !=NULL ) +n ; whil( data !=p-data ) idatadata ) t=lchil; else t=chil; +n ; eturn 利用二叉树遍历的思想判断一个二叉树是否 为平衡二叉

47、树 voifu(TNod*bt, in&alancein inbl=br=hl=hr=0 i( bt=NULL ) h=0 ; alance=1 ; elsi( ! blchil& ! bchil h=1 ; alance=1 ; else fu( blchild, blhl ) ; fu( bchild, bh) h=hlh? hl:h)+1 ; i( abs(hl-hr)adjlistj.firstar; whil( !=NULL ) ivisitp-adjvex=0 ) Visi(p-adjve; visitp-adjvex=1 ; que+ear=p-adjve; p=p-nextar

48、 深度优先遍历 (DFS) invisitmaxsize ; voiDFAGraph *G, inv AcNod*p ; visitv=1 ; Visi(v) ; p=G-adjlistv.firstar; whil( p !=NULL ) i( visitp-adjvex=0 DFG, p-adjve) ; p=p-nextar; 图采用邻接表存储设计算法判断i和j 之间是否有路径(以下全是邻接表存储) inDFS1Agraph *G, ini, inj ) ink ; fo( k=0kn; +k ) visitk=0 ; DF(G, i) ; i( visitj=1 ) eturn ; e

49、lse eturn ; 设计算法判断无向图是否是一棵树 oifu(AGrap*Ginin&vnin AcNod*p ; visitv=1 ; +v; p=G-adjlistv.firstar; whil( !=NULL ) +e; ivisitp-adjvex=0 ) fuG, p-adjvexvn, en p=p-nextar; inGiseAgraph *G ) invn=en=0 ; fo( ini=0; in; +i ) visiti=0 ; fuG, 1, vnen ; ivn=G-n & (G-n-1)=en/2 etur; else etur; 设计算法求无向连通图距顶点v 结点

50、(即路径长度最大) inBFS ( Agraph *G, inv ) AcNod*p ; inquemaxsize ; infont=ear=0 ; invisitmaxsize ; fo( ini=0; in; +i ) visiti=0 ; que+ear=v ; visitv=1 ; whil( fon!=ea) inj=que+font ; p=G-adjlistj.firstar; whil( !=NULL ) ivisitp-adjvex=0) visitp-adjvex=1 ; que+ear=p-adjve; p=p-nextar eturj 写出深度优先遍历的非递归算法 vo

51、iNonDFAgraph &G, inv AcNod*p ; Inittac(s) ; fo( ini=0iadjlistj.firsta; whil( p !=NULL ) i( visitp-adjvex=0 push (s, p; visitp-adjvex=1 ; else p=p-nextar; 直接插入排序 oiInsertSort ( inR , inn ) ini, j, temp ; fo( i=1; i=& tempnext LNod*r=p-next ; p-next=NULL ; p=; whil( !=NULL ) r=p-nex; LNod*pre=L ; whil

52、( pe-next!=NULL& pe-nexdatadata pe=pe-nex; p-next=pre-nex; pe-next=p ; p=;/链式存储 折半插入排序 voiInsert ( inA, inn ) ini, j ; inlohigh, mi; fo( i=2; i=n; +i ) A0=Ai; low=1 ; high=i-; whil( lowA0 .ke high=mid-; else low=mid+1 ; fo( j=i-1; j=high+1-j Aj+1=Aj ; Ahigh+1=A0 ; 希尔排序 voishellsort ( inarr , inn ) i

53、ntemp ; fo( ingap=n/2gap0; gap/=2 ) fo( ini=gapi=gap&arr arrj=arrj-gap ; j-=gap ; arrj=temp 冒泡排序 oiBubblesort ( inR, inn ini, j, flag, tem; fo( i=n-1i=1; -) flag=; fo( j=1; jRj ) temp=Rj ; Rj=Rj-1 ; Rj-1=temp ; flag=; iflag=0 etur; 快速排序 voiQuicksort ( inA , inloinhigh ilowhigh ) inpivotpos=part A, l

54、ohig) ; Quicksort A, lopivotpos-1 ; Quicksort A, pivotpos+1, high ; inart ( inA, inloinhigh ) inpivot=Alow ; whil( lowhigh ) whil( low=pivo -hig; Alow=Ahigh; whil( low high &Alow=pivot +lo; Ahigh=Alow; Alow=pivo eturlow ; 选择排序 voiSelectSort (inA , inn inij, k, temp ; fo( i=0in; +i ) k=; fo( j=i+1; j

55、Rj ) k=; temp=Ri; Ri=Rk; Rk=temp ; 堆排序 voiSift (inarr , inloinhigh ini=loj=2*i+1 ; intemp=arri ; whil( j=high ) ijhigh &arrjarrj+1 ) +; itemp =0-i ) sif(ari, n-1 ) ; fo( i=n-1i0; -) intemp=arr0 ; arr0=arri ; arri=temp ; sif( ar0, i-) 归并排序 in*B=(int *) malloc(n+1)*size(int) ) ; voifu(int A, int loinm

56、id, in ini=loj=mid+; fo( ink=low; k=high; +) Bk=Ak; forink=ii=mi& j=high; +k) iBi =Bj Ak=Bi+; else Ak=Bj+ ; whil( j=hig) Ak+=Bj+ whil( i=mi) Ak+=Bi+; voiMegeSort inAinloinhig ilowhigh ) inmid =low+high )/2 ; MegeSort A, lomi) ; MegeSort A, mid+1, hig) ; fu( A, lomid, high ) ; KMP算法 voigetnex( str su

57、bstint next ) ini=1, j=; next1=0 ; whil( isubst.length ) i( j=0|subst.chi=subst.chj +i, +j ; nexti=j ; else j=nextj inKMP tsttsubstinnext ) ini=j=; while(i=st.length&jsubst.length ) eturn i-subst.length ; else eturn ; (祝大家考研顺利 计机考列数结应 1 5 计机考列数结应 2019 年408 真题【数据结构部分 给定一个单链表 L:L0L1Ln-1Ln , 将其重新排列后变为:

58、 L0LnL1Ln-1L2Ln-2 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 示例 1: 给定链表 1-2-3-4, 重新排列为 1-4-2-3. 示例 2: 给定链表 1-2-3-4-5, 重新排列为 1-5-2-4-3. 您是否想到了什么好的办法? 2 5 计机考列数结应 解决方法: (1)算法的基本思想: 思路(综合题): 1.快慢指针找中点,将原链表切分成两段 2.将后面的链表翻转 3.将第二个链表的每个结点依次插在第一个链表的后面 比如:1-2-3-4-5-null 切分变成:1-2-3-null ; 4-5-null ; 将 4-5 翻转变成 5-4; 插入变

59、成:1-5-2-4-3-null; 考点:快慢指针 参考 HYPERLINK /s?_biz=MzUyMzc3NzI2Nw=&mid=2247486307&idx=2&sn=76403abfbf7986df30ba0f822f2e73d2&chksm=fa362effcd41a7e943e185dd33715193f97b967dc1453b2415068b089647f591c7ff98c8a33c&token=920877469&lang=zh_CN&scene=21#wechat_redirect :每日编程(50) 考点:翻转链表 参考 HYPERLINK /s?_biz=MzUyMz

60、c3NzI2Nw=&mid=2247486170&idx=2&sn=b22952184276502080506cfc51f38878&chksm=fa362f46cd41a6503d07badf47c6e432ce8a87b503717d8bbcdea288505f636805566e3932ac&scene=21#wechat_redirect :每日编程(46) HYPERLINK /s?_biz=MzUyMzc3NzI2Nw=&mid=2247486191&idx=2&sn=bfa63455230695cb2f0d80e56a82b8f3&chksm=fa362f73cd41a665ef

温馨提示

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

评论

0/150

提交评论