嚴(yán)蔚敏版大數(shù)據(jù)結(jié)構(gòu)所有算法代碼_第1頁
嚴(yán)蔚敏版大數(shù)據(jù)結(jié)構(gòu)所有算法代碼_第2頁
嚴(yán)蔚敏版大數(shù)據(jù)結(jié)構(gòu)所有算法代碼_第3頁
免費(fèi)預(yù)覽已結(jié)束,剩余34頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、嚴(yán)蔚敏版數(shù)據(jù)結(jié)構(gòu)所有算法代碼線性數(shù)據(jù)結(jié)構(gòu)2013年9月/線性表、鏈表/棧、隊(duì)列/數(shù)組、廣義表/串線性表typedefstructcharname20;注意如果應(yīng)用指針的形式/在初始化每個結(jié)點(diǎn)時一定要先為結(jié)點(diǎn)中的每個變量開辟內(nèi)存空間charsex;charaddr100;unsignedintage;charphonenum20;node;/結(jié)點(diǎn)描述typedefstructnode*p;intlength;當(dāng)前順序表長度intlistsize;/當(dāng)前分配的線性表長度list;線性表描述listL;定義一個線性表intinitlist(list&1)構(gòu)造一個空的線性表l.p=(node*

2、)malloc(LIST_INIT_SIZE*sizeof(node);if(!(Lp)exit(1);l.length=0;l.listsize=LIST_INIT_SIZE;returntrue;voiddestroylist(list&l)銷毀線性表操作if(l.p!=NULL)free(l.p);printf("銷毀成功!n");elseprintf("線性表不存在!n");intclearlist(list&l)將線性表置空操作if(l.p=NULL)printf("線性表不存在!n");returnfals

3、e;elsefree(l.p);l.p=(node*)malloc(l.listsize*sizeof(node);l.length=O;returntrue;intlistempty(list&)/判斷線性表是否為空表if(l.p=NULL)returntrue;elsereturnfalse;intgetelem(list&l,inti,node&e)/if(l.p=NULL)returnfalse;elsee=l.pi-1;returntrue;intpriorelem(list&l,inti,node&pre_e)/if(i=0|l.p=NULL

4、)returnfalse;elsepre_e=l.pi-1;returntrue;intnextelem(list&l,inti,node&next_e)/_if(i>=l.length|l.p=NULL)returnfalse;if(l.p=NULL)returntrue;elsereturnfalse;intgetelem(list&l,inti,node&e)/if(l.p=NULL)returnfalse;elsee=l.pi-1;returntrue;intpriorelem(list&l,inti,node&pre_e)/if(

5、i=0|l.p=NULL)returnfalse;elsepre_e=l.pi-1;returntrue;intnextelem(list&l,inti,node&next_e)/_if(i>=l.length|l.p=NULL)returnfalse;用e返回表中第i個數(shù)據(jù)元素得到第i個元素的前驅(qū)元素得到表中第i個元素的后繼元素elsenext_e=l.pi+1;returntrue;intinsertlist(list&l,inti,node&e)將元素e插入到表I中第i個元素的后面node*q,*k;if(i<1|i>l.length+1

6、)returnfalse;if(l.length>=l.listsize)l.p=(node*)realloc(l.p,(l.listsize+LISTINCREMENT)*sizeof(node);if(!l.p)exit(1);l.listsize+=LISTINCREMENT;k=&l.pi-1;for(q=&l.pl.length-1;q>k;q-)*(q+1)=*q;*k=e;l.length+;returntrue;intdeletelist(list&l,inti,node&e)/刪除表中第i個元素并用e返回其值node*q;intj=

7、i-1;if(i<1|i>l.length)returnfalse;e=l.pi-1;for(q=&l.pi-1;j<l.length-1;j+)*q=*(+q);l.length-;returntrue;voidmergerlist(listla,listlb,list&lc)歸并兩個按非遞減排列的線性表intla_len,lb_len,i=1,j=1,k=O;nodeai,bj;la_len=la.length;Ib_len=lb.length;while(i<=la_len&&jv=lb_len)一一getelem(la,i,ai)

8、;getelem(lb,j,bj);if(ai.a<=bj.a)insertlist(lc,+k,ai);i+;elseinsertlist(lc,+k,bj);j+;while(i<=la_len)_getelem(la,i,ai);insertlist(lc,+k,ai);i+;while(j<=lb_len)_getelem(lb,j,bj);insertlist(lc,+k,bj);j+;intListAscendingOrder(list&)/按結(jié)點(diǎn)中某一元素的比較升序排列線性表中的結(jié)點(diǎn)nodee;inti,j;if(l.p=NULL|l.length=1)

9、returnERROR;for(i=0;i<l.length-1;i+)for(j=i+1;j<l.length;j+)if(l.pi.num>=l.pj.num)e=l.pi;l.pi=l.pj;l.pj=e;returnOK;省略降序排列voidMergerList(listla,listlb,list&lc)將兩線性表升序排列后再歸并node*q,*k,e1;inti=0,j=0,m=0,n;ListAscendingOrder(la);ListAscendingOrder(lb);printf("表a升序排列后為:n");for(i=0;i

10、<la.length;i+)printf("%d",la.pi.num);printf("n");printf("表b升序排列后為:n");for(i=0;i<lb.length;i+)printf("%d",lb.pi.num);printf("n");i=0;while(i<la.length&&j<lb.length)if(la.pi.numv=lb.pj.num)e1=la.pi;i+;elsee仁lb.pj;j+;if(e1.num!=lc.pl

11、c.length-1.num)InsertList(lc,+m,e1);if(i<la.length)while(i<la.length)if(la.pi.num!=lc.plc.length-1.num)InsertList(lc,+m,la.pi);i+;if(j<lb.length)while(j<lb.length)if(lb.pj.num!=lc.plc.length-1.num)InsertList(lc,+m,lb.pj);j+;printf("按升序排列再歸并兩表為:n");for(n=0;n<lc.length;n+)prin

12、tf("%d",lc.pn.num);printf("n");鏈表typedefstructintnum;node;typedefstructLISTnodedata;structLIST*next;list,*slist;intCreatList(slist&head)/此處應(yīng)為只針對的引用head=(list*)malloc(sizeof(list);if(!head)returnERROR;head->next=NULL;returnOK;voidInvertedList(slist&head1,slist&head2

13、)/構(gòu)造新表逆置單鏈表函數(shù)list*p,*q;p=head1->next;q=p->next;if(p=NULL)printf("鏈表為空無法實(shí)現(xiàn)逆置操作n");elsewhile(q!=NULL)p->next=head2->next;head2->next=p;p=q;q=q->next;p->next=head2->next;head2->next=p;printf("逆置成功!?n");voidInsertList(slist&head,node&e)此處應(yīng)為指針的引用/而不應(yīng)

14、該是list*headlist*p,*q;p=(list*)malloc(sizeof(list);q=head;while(q->next!=NULL)q=q->next;p->next=q->next;q->next=p;p->data=e;voidInvertedList(sqlist&head)/不構(gòu)造新表逆置單鏈表函數(shù)/list*p,*q,*k;p=head->next;q=p->next;k=q->next;p->next=NULL;while(k!=NULL)q->next=p;p=q;q=k;k=k-&g

15、t;next;q->next=p;head->next=q;/-交換鏈表中第i個和第j個結(jié)點(diǎn),函數(shù)實(shí)現(xiàn)如下一一/intSwapListNode(sqlist&head,inti,intj)intm,n,m1,n1,sum=0;list*p,*q,*k,*c,*d,*ba;ba=head->next;while(ba!=NULL)sum+;ba=ba->next;if(i=j|i>sum|j>sum|i<1|j<1)printf("所要交換的兩個結(jié)點(diǎn)有誤!n");returnERROR;if(ivj)m=i;n=j;el

16、sem=j;n=i;p=head;q=head;for(m1=1;m1<=m;m1+)p=p->next;for(n1=1;n1<=n;n1+)q=q->next;if(p->next=q)/如果結(jié)點(diǎn)相鄰k=head;while(k->next!=p)k=k->next;/相鄰兩結(jié)點(diǎn)的交換p->next=q->next;q->next=p;k->next=q;else/如果結(jié)點(diǎn)不相鄰k=head;c=head;while(k->next!=p)k=k->next;while(c->next!=q)c=c->

17、;next;d=p->next;/不相鄰兩結(jié)點(diǎn)之間的交換p->next=q->next;c->next=p;k->next=q;q->next=d;returnOK;/-將鏈表中結(jié)點(diǎn)按結(jié)點(diǎn)中某一項(xiàng)大小升序排列,函數(shù)實(shí)現(xiàn)如下-/intAscendingList(sqlist&head)intm,n,sum=0,i,j;list*p,*q,*k;k=head->next;while(k!=NULL)sum+;k=k->next;for(i=1;i<sum;i+)for(j=i+1;jv=sum;j+)p=head->next;m=

18、1;while(m!=i)m+;p=p->next;q=head->next;n=1;while(n!=j)n+;q=q->next;if(p->data.exp>q->data.exp)如果按exp降序排列,則應(yīng)將>改為<SwapListNode(head,i,j);returnOK;/-將兩鏈表合并為一個鏈表-/intAddList(sqlist&head1,sqlist&head2,sqlist&head3)/已將表head1和表head2按某一項(xiàng)升序排列過sqlistp,q;nodee;p=head1->ne

19、xt;q=head2->next;while(p!=NULL&&q!=NULL)if(p->data.expvq->data.exp)InsertList(head3,p->data);p=p->next;elseif(p->data.exp>q->data.exp)InsertList(head3,q->data);q=q->next;elseif(p->data.exp=q->data.exp)e.coefficient=p->data.coefficient+q->data.coeffic

20、ient;e.exp=p->data.exp;/e.exp=q->data.exp;InsertList(head3,e);p=p->next;q=q->next;if(p!=NULL)while(p!=NULL)InsertList(head3,p->data);p=p->next;/如果p中有剩余,則直接將p中剩余元素插入head3中if(q!=NULL)while(q!=NULL)InsertList(head3,q->data);q=q->next;/如果q中有剩余,則直接將q中的剩余元素插入head3中return0;棧/利用棧結(jié)構(gòu)實(shí)現(xiàn)

21、數(shù)制之間的轉(zhuǎn)換-書intnum;node;typedefstructnode*base;node*top;intstacksize;stack;/順序棧結(jié)構(gòu)定義intCreatStack(stack&stackll)stackll.base=(node*)malloc(INITSTACKSIZE*sizeof(node);if(!stackll.base)exit(OVERFLOW);stackll.top=stackll.base;stackll.stacksize=INITSTACKSIZE;returnOK;voidpush(stack&s,nodee)/進(jìn)棧操作if(s

22、.top-s.base>=s.stacksize)s.base=(node*)realloc(s.base,(s.stacksize+INCRESTACKMENT)*sizeof(node);if(!s.base)exit(OVERFLOW);s.top=s.base+s.stacksize;可以不寫此語句;s.stacksize+=INCRESTACKMENT;*(s.top+)=e;/*s.top+=e;voidpop(stack&s,node&e)/出棧操作if(s.top=s.base|s.base=NULL)printf("信息有誤!n");

23、elsee=*-s.top;/取棧頂元素函數(shù)-/voidgettop(stack&s,node&e)if(s.base=s.top)printf("棧為空,無法取得棧頂元素!n");elsee=*(s.top-1);/-棧的應(yīng)用:括號匹配的檢驗(yàn)書/省略了大部分上述已有代碼/intzypd(charc)/判斷是否為左括號字符if(c=''|c=''|c='(')returnOK;elsereturnERROR;intmain(void)stacks;nodee1,e2,e3;charstINITSTACKSIZE

24、;inti=0,j;CreatStack(s);printf("請輸入括號字符,以#做結(jié)束符:");scanf("%c",&sti);while(sti!=#)i+;scanf("%c",&sti);if(!zypd(st0)printf("輸入字符不合法!n");elsefor(j=0;j<i;j+)if(zypd(stj)/如果是左括號則將此字符壓入棧中e1.c=stj;push(s,e1);else/如果當(dāng)前stj元素不是左括號/則取出棧頂元素,比較棧頂元素與當(dāng)前stj元素是否項(xiàng)匹配/如

25、果匹配,則棧頂元素出棧gettop(s,e2);if(e2.c=''&&stj=''|e2.c=''&&stj=''|e2.c='('&&stj=')')pop(s,e3);elseprintf("括號驗(yàn)證失?。");break;if(s.top=s.base)當(dāng)循環(huán)結(jié)束時,如果棧為空棧說明輸入的括號合法printf("括號驗(yàn)證成功!n");getchar();system("pause")

26、;return0;/鏈棧描述/typedefstructNodeintnum;structNode*next;node;typedefstructNode*top;Node*base;stack;voidInitStack(stack&s)s.base=(Node*)malloc(sizeof(node);if(!s.base)exit(1);elses.base->next=NULL;s.top=s.base;voidInsertStack(stack&s,nodee)node*p;p=(node*)malloc(sizeof(node);if(!p)exit(1);e

27、lse*p=e;p->next=s.top;s.top=p;voidDeleteStack(stack&s,node&e)node*p;if(s.top=s.base)printf("棧為空!n");elsep=s.top;s.top=s.top->next;e=*p;free(p);隊(duì)列/鏈隊(duì)列的描述及操作/typedefstructNodeinta;structNode*next;Qnode,*QueuePtr;typedefstructQueuePtrfront;QueuePtrrear;LinkQueue;voidInitQueue(Li

28、nkQueue&Q)Q.front=(Qnode*)malloc(sizeof(Qnode);if(!Q.front)exit(1);Q.rear=Q.front;Q.front->next=NULL;voidInsertQueue(LinkQueue&Q,Qnodee)QueuePtrp;p=(Qnode*)malloc(sizeof(Qnode);if(!p)exit(1);*p=e;p->next=NULL;Q.rear->next=p;Q.rear=p;voidDeleteQueue(LinkQueue&Q,Qnode&e)Qnode*

29、p;if(Q.front=Q.rear)printf("隊(duì)列為空!n");elsep=Q.front->next;e=*p;Q.front->next=p->next;if(p=Q.rear)Q.rear=Q.front;free(p);/循環(huán)隊(duì)列/typedefstructnodeintdata;structnode*next;node;typedefstructqueuenode*base;intfront;intrear;Queue;inttag;voidInitQueue(Queue&Q)Q.base=(node*)malloc(MAX*s

30、izeof(node);if(!Q.base)exit(1);Q.front=Q.rear=0;tag=0;voidInsertQueue(Queue&Q,nodee)if(tag=1&&Q.front=Q.rear)printf("循環(huán)隊(duì)列已滿!n");elseQ.baseQ.rear=e;Q.rear=(Q.rea葉1)%MAX;if(Q.rear=Q.front)tag=1;voidDeleteQueue(Queue&Q,node&e)if(tag=0&&Q.front=Q.rear)printf("隊(duì)

31、列為空!n");elsee=Q.baseQ.front;Q.front=(Q.front+1)%MAX;if(Q.front=Q.rear)tag=0;intEmptyQueue(Queue&Q)if(Q.front=Q.rear&&tag=O)return1;elsereturn0;串/串:堆分配存儲形式的一些操作/typedefstructstringchar*ch;intlength;sstring;voidCreatString(sstring&T)T.ch=(char*)malloc(sizeof(char);T.length=0;voidS

32、tringAssign(sstring&T,char*s)/將串s的值賦值給串Tif(T.ch)free(T.ch);T.ch=(char*)malloc(strlen(s)*sizeof(char);或者T.ch=(char*)malloc(sizeof(char);/動態(tài)開辟空間不同于靜態(tài)內(nèi)存開辟之處if(!T.ch)printf("ERROR");exit(1);strcpy(T.ch,s);T.length=strlen(s);voidClearString(sstring&T)if(T.ch)free(T.ch);T.length=O;voidCo

33、ncatString(sstring&T,sstrings1,sstrings2)/串連接if(T.ch)free(T.ch);T.ch=(char*)malloc(strlen(s1.ch)+strlen(s2.ch)*sizeof(char);if(!T.ch)printf("ERRORn");exit(1);strcpy(T.ch,s1.ch);strcat(T.ch,s2.ch);T.length=strlen(s1.ch)+strlen(s2.ch);voidSubString(sstring&sub,sstrings,intpos,intlen)

34、/取子串操作,取串s中位置從pos至len處的子串于sub中inti,j=0;if(sub.ch)free(sub.ch);sub.ch=(char*)malloc(len-pos+1+1)*sizeof(char);if(!sub.ch)printf("ERRORn");exit(1);for(i=pos-1;i<len;i+)sub.chj+=s.chi;sub.chj='0'subength=strlen(sub.ch);intCountString(sstrings1,sstrings2)/判斷子串s2在母串s1中出現(xiàn)的次數(shù)inti,j,k,c

35、ount=0;if(s1.length=0|s2.length=0|s2.length>s1.length)printf("ERRORn");return0;elsefor(i=0;i<s1.length;i+)k=1;for(j=0;j<s2.length;j+)if(s2.chj!=s1.chi+j)k=0;break;if(k)count+;returncount;voidDeletestring(sstring&s,intpos,intlen)/刪除s串中位置從pos到len處的元素inti,j,k;if(sength=0)printf(&

36、quot;ERRORn");elsefor(i=pos-1,j=len;j<sength;i+,j+)s.chi=s.chj;s.chi='0's.length-=(len-pos)+1;voidDeleteSub(sstring&s1,sstrings2)/刪除母串s1中的子串s2inti,j,k,tag=0;for(i=0;i<s1.length;i+)k=1;if(tag)i-;for(j=0;j<s2.length;j+)if(s2.chj!=s1.chi+j)k=0;break;if(k)Deletestring(s1,i+1,i+

37、s2.length);tag=1;KMP算法intindex_kmp(stringT,stringS,intpos)_inti=pos,j=1;while(i<=S.length&&jv=T.length)if(S.chi=T.chj)i+;j+;elsej=nextj+1;if(j>T.length)returni-T.length;elsereturn0;voidget_next(stringT)_inti=1,j=0;next1=0;while(i<=T.length)if(j-1=0|T.chi=T.chj)i+;j+;if(T.chi!=T.chj)

38、nexti=j;elsenexti=nextj;elsej=nextj;數(shù)組矩陣轉(zhuǎn)置的經(jīng)典算法for(i=0;i<row;i+)for(j=0;j<col;j+)bji=aij;時間復(fù)雜度為0(row*col),每個元素都要存儲,相對于稀疏矩陣來說比較浪費(fèi)存儲空間。矩陣轉(zhuǎn)置-利用三元組實(shí)現(xiàn)#defineMAX12500假設(shè)一個稀疏矩陣最多有12500個非零元typedefstructinti,j;/i,j用于存儲矩陣中元素的行、列下標(biāo)intnum;/num為矩陣中非零元的值Triple;定義一個三元組typedefstructTripledataMAX+1;intmu,nu,tu;

39、/mu,nu非別表示一個稀疏矩陣的行數(shù)和列數(shù)/tu表示該稀疏矩陣的非零元個數(shù)TSMatrix;/矩陣轉(zhuǎn)置,核心算法如下:t.mu=m.nu;t.nu=m.mu;t.tu=m.tu;for(i=0;i<m.nu;i+)for(j=0;j<m.tu;j+)/按列遍歷三元組if(m.dataj.j=i)/按列升序存入數(shù)組t.datap.i=m.dataj.j;t.datap.j=m.dataj.i;t.datap.num=m.dataj.num;p+;該算法時間復(fù)雜度為O(nu*tu),即與該矩陣的列數(shù)和非零元個數(shù)有關(guān),當(dāng)tu=mu*nu時,時間復(fù)雜度為O(nu2*tu),此時的時間復(fù)雜

40、度比一般算法的時間復(fù)雜度還要大,因此此算法適用于tuvvmu*nu的情況,此算法相比一般算法節(jié)省了存儲空間??焖俎D(zhuǎn)置算法<改進(jìn)了時間復(fù)雜度>t.tu=m.tu;t.mu=m.nu;t.nu=m.mu;for(i=1;i<=m.nu;i+)numi=0;先使每列上元素的個數(shù)為0for(i=0;i<m.tu;i+)numm.datai.j+;遍歷三元組求得每列上元素的個數(shù)for(i=2;i<=m.nu;i+)cpoti=cpoti-1+numi-1;求得每列上第一個元素在轉(zhuǎn)置矩陣三元組中的存儲序號for(i=0;i<m.tu;i+)j=m.datai.j;q=c

41、potj;t.dataq.i=m.datai.j;t.dataq.j=m.datai.i;t.dataq.num=m.datai.num;cpotj+;/當(dāng)該列上一個元素存儲完時序號加1該算法時間復(fù)雜度0(nu+tu),這種算法稱為快速轉(zhuǎn)置算法。利用行邏輯連接順序表實(shí)現(xiàn)矩陣相乘typedefstructinti,j;intnum;Triple;typedefstructTripledataMAXSIZE;intrposMAXRC;存放每行中首個非零元的位置intmu,nu,tu;RLSMatrix;行邏輯連接順序表的定義intMultMatrix(RLSMatrixm,RLSMatrixn,R

42、LSMatrix&q)/矩陣相乘函數(shù)、核心算法intarow,ctempMAXRC,i,tp,p,brow,t,ql,ccol;if(m.nu!=n.mu)returnERROR;q.mu=m.mu;q.nu=n.nu;q.tu=0;if(m.tu*n.tu!=0)for(arow=1;arow<=m.mu;arow+)/按m矩陣中每行進(jìn)行處理for(i=1;i<=n.nu;i+)ctempi=0;/每行處理開始,使得ctemp置零q.rposarow=q.tu+1;/求矩陣q中rpos的值if(arowvm.mu)tp=m.rposarow+1;elsetp=m.tu+1

43、;求得arow下一行第一個非零所在的位置for(p=m.rposarow;p<tp;p+)依次處理矩陣m中每行上所有的非零元brow=m.datap.j;if(brow<n.mu)t=n.rposbrow+1;elset=n.tu+1;for(ql=n.rposbrow;ql<t;ql+)ccol=n.dataql.j;ctempccol+=m.datap.num*n.dataql.num;for(ccol=1;ccol<=n.nu;ccol+)if(ctempccol)if(+q.tu>MAXSIZE)returnERROR;q.dataq.tu.i=arow;

44、q.dataq.tu.j=ccol;q.dataq.tu.num=ctempccol;returnOK;voidgetrpos(RLSMatrix&m)inti,numMAXRC,j;for(i=1;i<=m.mu;i+)numi=0;先使每行上元素的個數(shù)為0for(i=1;i<=m.tu;i+)numm.datai.i+;遍歷三元組求得每行上元素的個數(shù)for(j=1;j<=m.mu;j+)if(numj!=0)break;m.rposj=1;/j代表第一個非零元數(shù)不為零的行的下標(biāo)for(i=j+1;i<=m.mu;i+)m.rposi=m.rposi-1+nu

45、mi-1;/求得每列上第一個元素在轉(zhuǎn)置矩陣三元組中的存儲序號-十字鏈表/定義typedefstructOLNodeinti,j;/行列下標(biāo)inte;structOLNode*right,*dowm;OLNode;typedefstructListMatrixOLNode*rhead,*chead;intmu,nu,tu;/行數(shù)、列數(shù)、非零元個數(shù)ListMatrix;/將結(jié)點(diǎn)插入十字鏈表表示的矩陣中voidInsertMatrix(OLNode*t,ListMatrix&q)OLNode*rpre,*cpre,*p;inti,tag;p=(OLNode*)malloc(sizeof(OL

46、Node);p->i=t->i;p_>j=t->j;p->e=t->e;rpre=&q.rheadp->i;cpre=&q.cheadp->j;for(i=1;i<q.nu+1;i+)tag=1;if(rpre->right=NULL|rpre->right->j>p->j)break;if(rpre->right->j=p->j)tag=O;break;rpre=rpre->right;/找到指針rpre的位置while(1)if(cpre->dowm=NULL|

47、cpre->dowm->i>i)break;cpre=cpre->dowm;/找到cpre的位置if(tag)/判斷該要出入的結(jié)點(diǎn)所在的行是否已經(jīng)存在元素p->right=rpre->right;rpre->right=p;p->dowm=cpre->dowm;cpre->dowm=p;elseif(rpre->right->e+p->e=O)if(rpre->right!=NULL)rpre->right=rpre->right->right;if(cpre->dowm!=NULL)c

48、pre->dowm=cpre->dowm->dowm;if(rpre->right->e+p->e!=O)rpre->right->e+=p->e;/用十字鏈表存儲矩陣voidCreatMatrix(ListMatrix&m)intm1,n,t,i;OLNode*p,*rpre,*cpre;printf("請輸入矩陣的行數(shù)、列數(shù)、非零元個數(shù):");scanf("%d%d%d",&m1,&n,&t);m.mu=m1;m.nu=n;m.tu=t;m.rhead=(OLNod

49、e*)malloc(m1+1)*sizeof(OLNode);m.chead=(OLNode*)malloc(n+1)*sizeof(OLNode);for(i=1;i<m1+1;i+)m.rheadi.right=NULL;for(i=1;i<n+1;i+)初始化指針的值m.cheadi.dowm=NULL;printf("請輸入這d個非零元:n",m.tu);for(i=0;i<m.tu;i+)p=(OLNode*)malloc(sizeof(OLNode);if(!p)exit(1);scanf("%d%d%d",&p-&

50、gt;i,&p->j,&p->e);InsertMatrix(p,m);廣義表2013/09/01廣義表的構(gòu)造及遞歸遍歷/廣義表的定義用到串的一些操作,上述已有串的定義在此不再敘述typedefenumATOM,LISTElemTag;typedefstructGLNodeElemTagtag;unioncharatom;structstructGLNode*hp,*tp;ptr;/若atom占用內(nèi)存則表明為原子結(jié)點(diǎn),否則ptr占用內(nèi)存為表結(jié)點(diǎn)*Glist;廣義表結(jié)點(diǎn)結(jié)構(gòu)的定義voidSubString(Sstring&A,Sstring&B,int

51、i,intn)/取子串操作/將B串中從第i個字符起長度為n的字符串復(fù)制到A中intj=0,m=0;for(j=i;j<i+n;j+)A.chm+=B.chj;A.chm='0'A.length=m;voidSeverGlist(Sstring&str,Sstring&hstr)/將非空串(廣義表形式的串)str中第一個逗號之前的/字符置給hstr,剩余的字符(除去該逗號)留在str中SstringCh;inti=0,k=0,n=str.length;InitString(Ch);doi+;ClearString(Ch);lnitString(Ch);Sub

52、String(Ch,str,i-1,1);每次取一個字符至Ch串中if(Ch.ch0='(')k+;elseif(Ch.ch0=')')k-;while(i<n&&(Ch.ch0!=','|k!=0);if(i<n)SubString(hstr,str,0,i-1);SubString(str,str,i,n-i);elsestrcpy(hstr.ch,str.ch);hstr.length=str.length;ClearString(str);voidCreatGlist(Glist&L,Sstring&a

53、mp;S)/廣義表的構(gòu)造/采用頭尾鏈表存儲結(jié)構(gòu),由廣義表書寫形式串S定義廣義表Glistp,q;Sstringsub,hsub;InitString(sub);InitString(hsub);if(strcmp(S.ch,"()")=O)L=NULL;elseif(!(L=(Glist)malloc(sizeof(GLNode)exit(1);if(S.length=1)/若為單個字符即原子L->tag=ATOM;L->atom=S.ch0;elseL->tag=LIST;p=L;/L為表頭SubString(sub,S,1,S.length-2);脫去

54、外層括號doSeverGlist(sub,hsub);從sub中分離出表頭串hsubCreatGlist(p->ptr.hp,hsub);q=p;if(!StringEmpty(sub)p=(Glist)malloc(sizeof(GLNode);p->tag=LIST;q->ptr.tp=p;while(!StringEmpty(sub);q->ptr.tp=NULL;printf("廣義表構(gòu)造成功!n");voidTraverseGlist(Glist&L)/遞歸遍歷廣義表Glistp;if(L)p=L;if(p->tag=ATOM

55、)printf("%c",p->atom);elsewhile(p)TraverseGlist(p->ptr.hp);p=p->ptr.tp;求廣義表的深度、利用遞歸2013/09/02intGlistDepth(Glist&L)/遞歸求廣義表的深度Glistp;intdepth,max=0;if(!L)return1;/空表的深度為1if(L->tag=ATOM)return0;/原子的深度為0for(p=L;p;p=p->ptr.tp)depth=GlistDepth(p->ptr.hp);if(maxvdepth)max=d

56、epth;/找出各子表中深度的最大值returnmax+1;/廣義表的深度為各子表中深度最大的加1廣義表的復(fù)制2013、09、02voidCopyGlist(Glist&T,GlistL)/廣義表的復(fù)制,將表L復(fù)制到表T中/利用遞歸實(shí)現(xiàn)if(!L)T=NULL;若為空elseT=(Glist)malloc(sizeof(GLNode);T->tag=L->tag;if(L->tag=ATOM)/若為原子結(jié)點(diǎn)T->atom=L->atom;elseif(L->tag=LIST)/若為表結(jié)點(diǎn)CopyGlist(T->ptr.hp,L->ptr

57、.hp);CopyGlist(T->ptr.tp,L->ptr.tp);非線性數(shù)據(jù)結(jié)構(gòu)/-樹、二叉樹/-圖/20130916/用二叉鏈表描述二叉樹、并用遞歸實(shí)現(xiàn)二叉樹的三種遍歷操作typedefstructBTreeintdata;structBTree*lchild,*rchild;BiTNode,*BiTree;voidCreatBinaryTree(BiTree&T)/構(gòu)造一個二叉樹(遞歸定義)intch;/以0表示空樹printf("輸入結(jié)點(diǎn):");scanf("%d",&ch);if(ch=0)T=NULL;約定值為零的結(jié)點(diǎn)為空elseT=(BiTNode*)malloc(sizeof(BiTNode);if(!T)exit(1);T->data=ch;CreatBinaryTree(T->lchild);遞歸CreatBinaryTree(T->rchild);voidVistT

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論