版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
..數(shù)組與廣義表的算法實(shí)驗(yàn)工具:visualC++實(shí)驗(yàn)內(nèi)容:1、三元組表示稀疏矩陣的轉(zhuǎn)置算法〔一般&快速<1-7頁(yè)>2、 稀疏矩陣乘法、加法的算法〔一般&十字鏈表<8-21頁(yè)>3、廣義表的各種算法<22-28頁(yè)>體驗(yàn):通過(guò)利用visualC++實(shí)驗(yàn)工具,實(shí)現(xiàn)數(shù)組與廣義表各類算法的過(guò)程中,本人對(duì)數(shù)組與廣義表的知識(shí)有了更深的了解,而且認(rèn)識(shí)到數(shù)組與廣義表各類操作可由形式多樣的算法結(jié)構(gòu)實(shí)現(xiàn)。算法并非統(tǒng)一標(biāo)準(zhǔn)的,同樣的結(jié)果可有多種算法得出,算法的編寫(xiě)鼓勵(lì)創(chuàng)造性思維。三元組表示稀疏矩陣的轉(zhuǎn)置算法〔一般&快速代碼:#include<stdio.h>#include<conio.h>#include<stdlib.h>#include<windows.h>#defineOK1#defineERROR0#defineOVERFLOW0#defineMAXSIZE100#defineMAXRC100typedefintElemType;typedefstruct{ inti,j; ElemTypee;}Triple;typedefstruct{ Tripledata[MAXSIZE+1];//非零元三元組 intrpos[MAXRC+1];//各行第一個(gè)非零元的位置表 intmu,nu,tu;//矩陣的行數(shù)、列數(shù)和非零元個(gè)數(shù)}RLSMatrix;CreateSMatrix<RLSMatrix&M>//創(chuàng)建稀疏矩陣M{ inti,m,n; ElemTypee; intk,j; printf<"輸入矩陣的行數(shù)、列數(shù)、非零元的個(gè)數(shù):">; scanf<"%d%d%d",&M.mu,&M.nu,&M.tu>; M.data[0].i=0; for<i=1;i<=M.tu;i++> { j=0; do { j++; if<j>3>//控制跳出死循環(huán) { printf<"本次輸入失?。?>; returnERROR; } printf<"按行序輸入第%d個(gè)非零元素所在的行<1~%d>列<1~%d>值:",i,M.mu,M.nu>; scanf<"%d%d%d",&m,&n,&e>; k=0; if<m<1||m>M.mu||n<1||n>M.nu>//行或列超出范圍 k=1; if<m<M.data[i-1].i||m==M.data[i-1].i&&n<M.data[i-1].j> k=1; }while<k>; M.data[i].i=m; M.data[i].j=n; M.data[i].e=e; }//endfor printf<"\n">; return<OK>;}voidDestroySMatrix<RLSMatrix&M>//銷毀稀疏矩陣M{ M.mu=0; M.nu=0; M.tu=0;}voidPrinRLSMatrix<RLSMatrixM>//遍歷稀疏矩陣M{ inti; printf<"稀疏矩陣對(duì)應(yīng)的三元組表為:\n\n">; printf<"行列元素值、\n\n">; for<i=1;i<=M.tu;i++> printf<"%2d%4d%8d\n",M.data[i].i,M.data[i].j,M.data[i].e>; printf<"\n\n">;}voidprint<RLSMatrixA>//打印矩陣函數(shù),以通常形式輸出矩陣{ intk=1,a,b;printf<"稀疏矩陣的通常形式為:\n">; intM[MAXSIZE][MAXSIZE]; for<a=0;a<A.mu;a++>//初始化矩陣M { for<b=0;b<A.nu;b++> M[a][b]=0; } while<k<=A.tu> { M[A.data[k].i-1][A.data[k].j-1]=A.data[k].e; k++; } for<a=0;a<A.mu;a++> { printf<"|">; for<b=0;b<A.nu;b++> printf<"%d",M[a][b]>; printf<"|\n">; }}voidshowtip<>//菜單{ printf<"********************請(qǐng)選擇要執(zhí)行的操作********************\n\n">; printf<"&1采用一般算法實(shí)現(xiàn)&\n">; printf<"&2采用快速轉(zhuǎn)置的算法實(shí)現(xiàn)&\n">; printf<"&3同時(shí)采用兩種算法,先顯示一般算法,再顯示快速算法&\n">; printf<"**********************************************************\n\n">;}////頭文件結(jié)束TransposeSMatrix<RLSMatrixM,RLSMatrix&T>//求稀疏矩陣M的轉(zhuǎn)置矩陣T<一般算法>{ intp,q,col; T.mu=M.nu; T.nu=M.mu; T.tu=M.tu; if<T.tu> { q=1; for<col=1;col<=M.nu;++col>//按列序求轉(zhuǎn)置 for<p=1;p<=M.tu;++p> if<M.data[p].j==col> { T.data[q].i=M.data[p].j; T.data[q].j=M.data[p].i; T.data[q].e=M.data[p].e; ++q; } } returnOK;}FastTransposeSMatrix<RLSMatrixM,RLSMatrix&T>//快速轉(zhuǎn)置算法{ intp,q,t,col,*num,*cpot; num=<int*>malloc<<M.nu+1>*sizeof<int>>; cpot=<int*>malloc<<M.nu+1>*sizeof<int>>; T.mu=M.nu; T.nu=M.mu; T.tu=M.tu; if<T.tu> { for<col=1;col<=M.nu;++col> num[col]=0; for<t=1;t<=M.tu;++t> ++num[M.data[t].j]; cpot[1]=1; for<col=2;col<=M.nu;++col> cpot[col]=cpot[col-1]+num[col-1]; printf<"\n輔助數(shù)組的值為:\n">; printf<"列號(hào):">; for<t=1;t<=M.nu;++t> printf<"%4d",t>; printf<"\n">; printf<"num[]">; for<t=1;t<=M.nu;++t> printf<"%4d",num[t]>; printf<"\n">; printf<"cpot[]">; for<t=1;t<=M.nu;++t> printf<"%4d",cpot[t]>; printf<"\n\n">; for<p=1;p<=M.tu;++p> { col=M.data[p].j; q=cpot[col]; T.data[q].i=M.data[p].j; T.data[q].j=M.data[p].i; T.data[q].e=M.data[p].e; ++cpot[col]; } } free<num>; free<cpot>; returnOK;}voidmain<>{ intresult; intj; RLSMatrixA,B; //************************************************ COORDCo={0,0};DWORDWrite; SetConsoleTitle<"稀疏矩陣的轉(zhuǎn)置\n">; HANDLEhOut=GetStdHandle<STD_OUTPUT_HANDLE>; SetConsoleTextAttribute<hOut,FOREGROUND_RED|FOREGROUND_BLUE|FOREGROUND_INTENSITY>; FillConsoleOutputAttribute<hOut,FOREGROUND_RED|FOREGROUND_BLUE|FOREGROUND_INTENSITY,100000000,Co,&Write>; ///windows的API函數(shù),用來(lái)設(shè)置控制臺(tái)標(biāo)題 do { showtip<>;//調(diào)用菜單函數(shù) inti; scanf<"%d",&i>; switch<i> { case1: printf<"創(chuàng)建矩陣A:">; if<<result=CreateSMatrix<A>>==0> exit<ERROR>; PrinRLSMatrix<A>; printf<"求A的轉(zhuǎn)置矩陣B<一般算法>:\n">; TransposeSMatrix<A,B>; PrinRLSMatrix<B>; print<B>; DestroySMatrix<B>; printf<"\n\n">;break; case2: printf<"創(chuàng)建矩陣A:">; if<<result=CreateSMatrix<A>>==0> exit<ERROR>; PrinRLSMatrix<A>; printf<"求A的轉(zhuǎn)置矩陣B<快速轉(zhuǎn)置>:\n">; FastTransposeSMatrix<A,B>; PrinRLSMatrix<B>; print<B>; DestroySMatrix<A>; DestroySMatrix<B>; printf<"\n\n">;break; case3:printf<"創(chuàng)建矩陣A:">; if<<result=CreateSMatrix<A>>==0> exit<ERROR>;PrinRLSMatrix<A>;printf<"求A的轉(zhuǎn)置矩陣B------<一般算法>:\n">;TransposeSMatrix<A,B>; PrinRLSMatrix<B>; print<B>;DestroySMatrix<B>; printf<"\n\n">;printf<"求A的轉(zhuǎn)置矩陣B------<快速轉(zhuǎn)置>:\n">; FastTransposeSMatrix<A,B>; PrinRLSMatrix<B>; print<B>; DestroySMatrix<A>; DestroySMatrix<B>; printf<"\n\n">;break; } printf<"**********請(qǐng)選擇是否繼續(xù)輸入其他稀疏矩陣?**********\n">; printf<"1是,輸入其他矩陣\n">; printf<"0否,不輸入\n">; printf<"****************************************************">; fflush<stdin>;//清除輸入緩存區(qū) scanf<"%d",&j>; }while<j==1>;}運(yùn)行結(jié)果:〔1創(chuàng)建矩陣〔2一般轉(zhuǎn)置〔3快速轉(zhuǎn)置稀疏矩陣乘法、加法的算法〔一般&十字鏈表代碼:#include<stdio.h>#include<malloc.h>#defineSize2501#defineSize151typedefstruct{ inti; intj; inte;//非零元的值}triple;//定義三元組typedefstruct{ tripledata[Size+1];//矩陣中的元素 introps[Size1+1];//rops[i]為第i行元素中的首非零元在data[]中的序號(hào) intmu;//行數(shù) intnu;//列數(shù) inttu;//非零元數(shù)}juzhen;//定義矩陣typedefstructnode//定義十字鏈表元素{ inti,j,e;structnode*right,*down;//該非零元所在行表和列表的后繼元素}node,*link;typedefstruct//定義十字鏈表對(duì)象結(jié)構(gòu)體{ link*rhead,*chead;//行和列的頭指針 intm,n,t;//系數(shù)矩陣的行數(shù),列數(shù),和非零元素個(gè)數(shù)}crosslist;voidcreatecross<crosslist&M>//建立十字鏈表{ inti,j,e,k; node*p,*q; printf<"輸入行,列和非零元數(shù),空格隔開(kāi):\n">; scanf<"%d%d%d",&M.m,&M.n,&M.t>; M.rhead=<link*>malloc<<M.m+1>*sizeof<link>>;//給行和列的頭指針?lè)峙鋬?nèi)存M.chead=<link*>malloc<<M.n+1>*sizeof<link>>; for<k=1;k<=M.m;k++>//初始化行,列的頭指針 M.rhead[k]=NULL; for<k=1;k<=M.n;k++> M.chead[k]=NULL; printf<"輸入非零元的行,列和值,空格隔開(kāi):\n">; for<k=1;k<=M.t;k++>//輸入非零元 { scanf<"%d%d%d",&i,&j,&e>; p=<node*>malloc<sizeof<node>>; p->i=i; p->j=j; p->e=e; if<M.rhead[i]==NULL||M.rhead[i]->j>j>//插入元素所在行無(wú)非零元或首非零元的列標(biāo)大于插入元素的列標(biāo) { p->right=M.rhead[i]; M.rhead[i]=p; } else { for<q=M.rhead[i];<q->right>&&q->right->j<j;q=q->right>;//空循環(huán)找到第一個(gè)列標(biāo)大于或等于插入元素列標(biāo)的元素 p->right=q->right; q->right=p; } if<M.chead[j]==NULL||<M.chead[j]->i>i>>//插入元素所在列無(wú)非零元或首非零元的行標(biāo)大于插入元素的行標(biāo) { p->down=M.chead[j]; M.chead[j]=p; } else { for<q=M.chead[j];<q->down>&&q->down->i<i;q=q->down>;//空循環(huán)找到第一個(gè)行標(biāo)大于或等于插入元素行標(biāo)的元素 p->down=q->down; q->down=p; } } }voidprintcross<crosslistA>//輸出十字鏈表{ if<A.m==0> printf<"十字鏈表為空!\n">; else { printf<"十字鏈表為:\n">; inti,j; for<i=1;i<=A.m;i++> { linkp=A.rhead[i]; for<j=1;j<=A.n;j++> { if<<p>&&<j==p->j>> { printf<"%5d",p->e>; p=p->right;} else printf<"%5d",0>; } printf<"\n">; } } printf<"\n">;}crosslistaddcross<>{ printf<"十字鏈表加法:\n">; crosslista,b;//創(chuàng)建兩個(gè)十字鏈表對(duì)象,并初始化 createcross<a>; createcross<b>; node*pre,*h[51],*pa,*pb,*q;//定義輔助指針,pa,pb分別為a,b當(dāng)前比較的元素,pre為pa的前驅(qū)元素 inti,j,k=0,m,n;//h[j]指向j列的當(dāng)前插入位置 if<a.m!=b.m||a.n!=b.n> printf<"格式不對(duì),不能相加!\n">; else { for<i=1;i<=a.m;i++> { pa=a.rhead[i]; pb=b.rhead[i]; pre=NULL; for<j=1;j<=a.n;j++>h[j]=NULL; while<pb> { linkp; p=<node*>malloc<sizeof<node>>;//開(kāi)辟新節(jié)點(diǎn),存儲(chǔ)b中取出的元素 p->i=pb->i; p->j=pb->j; p->e=pb->e; if<pa==NULL||pa->j>pb->j>//當(dāng)a此行已經(jīng)檢查完或者pb因該放在pa前面 { if<pre==NULL> a.rhead[p->i]=p; else pre->right=p; p->right=pa; pre=p; if<h[p->j]==NULL>//當(dāng)前插入位置下面無(wú)非零元 //因?yàn)槭侵鹦刑幚?so,h[p->j],依次下移 //因此每次都是指向插入的位置 { a.chead[p->j]=p; p->down=NULL; } else { p->down=h[p->j]->down; h[p->j]->down=p; } h[p->j]=p;//*******h[p->j]下移指向下次插入的位置 pb=pb->right;//pb指向該行下個(gè)元素 } elseif<<pa&&pa->j<pb->j>>//只要移動(dòng)pa的指針****先不加||<pb==NULL&&pa> { pre=pa; h[pa->j]=pa;//移動(dòng)h[],使其指向下次插入的位置 pa=pa->right; } elseif<pa->j==pb->j> { pa->e+=pb->e; if<pa->e>//不為零 { pre=pa; h[pa->j]=pa; pb=pb->right;//加 } else//pa->e為零,刪除節(jié)點(diǎn) { if<pre==NULL> a.rhead[pa->i]=pa->right; else { pre->right=pa->right; } p=pa;//p指向pa,用來(lái)在下面修改列指針 pa=pa->right; if<h[p->j]==NULL> a.chead[p->j]=p->down; else { h[p->j]->down=p->down; } free<p>; pb=pb->right; } } } } } returna;}voidmultycross<crosslist&c>//十字鏈表乘法{ node*p,*q,*u,*v,*p1,*p2; crosslista,b; link*r; inti,j,k,e; printf<"十字鏈表乘法:\n">; createcross<a>; createcross<b>; if<a.n!=b.m> printf<"格式錯(cuò)誤,不能相乘!\n">; else { c.m=a.m; c.n=b.n; c.t=0; c.rhead=<link*>malloc<<a.m+1>*sizeof<link>>;//給行和列的頭指針?lè)峙鋬?nèi)存 c.chead=<link*>malloc<<b.n+1>*sizeof<link>>; for<k=1;k<=a.m;k++>//初始化行,列的頭指針 c.rhead[k]=NULL; for<k=1;k<=b.n;k++> c.chead[k]=NULL; r=<link*>malloc<<b.n+1>*sizeof<link>>; for<i=1;i<=a.m;i++> { u=<node*>malloc<sizeof<node>>; u->e=0; u->i=0; u->j=0; for<k=1;k<=b.n;k++>//初始化r[] r[k]=u; p1=p=a.rhead[i]; for<j=1;j<=b.n;j++> { p=p1; q=b.chead[j]; v=<node*>malloc<sizeof<node>>;//初始化v,v為將插入c矩陣的元素 v->e=0; v->i=i; v->j=j; while<p&&q> { if<p->j>q->i> q=q->down; elseif<p->j<q->i> p=p->right; else { v->e+=p->e*q->e; p=p->right; q=q->down; } } if<v->e>//如果不為零,則插入c矩陣中 { //同建立十字鏈表 if<c.rhead[i]==NULL||c.rhead[i]->j>j>//插入元素所在行無(wú)非零元或首非零元的列標(biāo)大于插入元素的列標(biāo) { v->right=c.rhead[i]; c.rhead[i]=v; } else { for<p2=c.rhead[i];<p2->right>&&<p2->right->j<j>;p2=p2->right>;//空循環(huán)找到第一個(gè)列標(biāo)大于或等于插入元素列標(biāo)的元素 v->right=p2->right; p2->right=v; } if<c.chead[j]==NULL||c.chead[j]->i>i>//插入元素所在列無(wú)非零元或首非零元的行標(biāo)大于插入元素的行標(biāo) { v->down=c.chead[j]; c.chead[j]=v; } else { for<p2=c.chead[j];<p2->down>&&<p2->down->i<i>;p2=p2->down>;//空循環(huán)找到第一個(gè)行標(biāo)大于或等于插入元素行標(biāo)的元素 v->down=p2->down; p2->down=v; } } } } }}voidcreate<juzhen&M>//創(chuàng)建稀疏矩陣{ inti,t=0; printf<"輸入矩陣行數(shù)和列數(shù)and非零元的個(gè)數(shù),以空格隔開(kāi):\n">; scanf<"%d%d%d",&M.mu,&M.nu,&M.tu>; printf<"輸入矩陣非零元的行,列,和數(shù)值<中間空格隔開(kāi)>:\n">; for<i=1;i<=M.tu;i++> scanf<"%d%d%d",&M.data[i].i,&M.data[i].j,&M.data[i].e>;//輸入三元組的元素 for<i=1;i<=Size1;i++>//初始化rops[] M.rops[i]=0; for<i=1,t=1;i<=M.mu;i++>//得到各行第一個(gè)元素的序號(hào) { M.rops[i]=t; while<M.data[t].i<=i&&t<=M.tu>//遇到i行非零元,則t累加 t++; }}voidadd<juzhenA,juzhenB,juzhen&C>//稀疏矩陣加法{ intk=1,temp=0,k1=1,k2=1;//k1,k2,k分別控制A,B,C中非零元的序號(hào)變化 printf<"稀疏矩陣加法:\n">; create<A>; create<B>; if<A.mu!=B.mu||A.nu!=B.nu> printf<"格式不對(duì),不能相加!\n">; else { while<k1<=A.tu&&k2<=B.tu>//當(dāng)A,B中的非零元都沒(méi)用完 { if<A.data[k1].i<B.data[k2].i>//A當(dāng)前k1指向的元素的行標(biāo)小于列標(biāo)直接把data[k1]的值賦給c中data[k] C.data[k++]=A.data[k1++]; elseif<A.data[k1].i>B.data[k2].i>//同上 C.data[k++]=B.data[k2++]; else//data[k1],data[k2]行標(biāo)相同 { if<A.data[k1].j>B.data[k2].j>//data[k1]列標(biāo)大于data[k2]列標(biāo),則把data[k2]的值賦給data[k] C.data[k++]=B.data[k2++]; elseif<A.data[k1].j<B.data[k2].j>//同上 C.data[k++]=A.data[k1++]; else//行,列標(biāo)都相同 { temp=0; temp=A.data[k1].e+B.data[k2].e; if<temp>//相加后不為零 { C.data[k].i=A.data[k1].i; C.data[k].j=A.data[k1].j; C.data[k].e=temp; k++; } k1++; k2++; } } } while<k1<=A.tu>//B中非零元已用完,A中還有非零元 C.data[k++]=A.data[k1++]; while<k2<=B.tu>//A中非零元已用完,B中還有非零元 C.data[k++]=B.data[k2++]; C.mu=A.mu;//確定C的行列數(shù)和非零元個(gè)數(shù) C.nu=A.nu; C.tu=k-1; }}voidprint<juzhenA>//輸出稀疏矩陣{ printf<"\n矩陣為:\n">; inti,j,k=1; if<A.mu==0> printf<"矩陣為空!\n">; elseif<A.tu==0>//矩陣元素為空 printf<"零矩陣!\n">; else for<i=1;i<=A.mu;i++>//逐行輸出 { for<j=1;j<=A.nu;j++> {if<A.data[k].i==i&&A.data[k].j==j>//行和列分別對(duì)應(yīng)相等則輸出相應(yīng)非零元,否則輸出零 printf<"%5d",A.data[k++].e>; else printf<"%5d",0>; } printf<"\n">;//該行輸出結(jié)束,空行輸出下一行 } printf<"\n">;}voidmulty<juzhenA,juzhenB,juzhen&C>//稀疏矩陣乘法{ intarow,brow,ccol,temp[51],p,q,t,tp,i;//各變量代表含義見(jiàn)下面 printf<"稀疏矩陣乘法:\n">; create<A>; create<B>; if<A.nu!=B.mu> printf<"格式錯(cuò)誤,不能相乘!\n">; else { C.mu=A.mu;//初始化c的行列及非零元個(gè)數(shù) C.nu=B.nu; C.tu=0; if<A.nu!=B.mu> printf<"A,B格式不對(duì)不能相乘!\n">; else// { for<arow=1;arow<=A.mu;arow++>//arow為當(dāng)前A矩陣的行標(biāo) { for<i=0;i<51;i++>//初始化temp temp[i]=0; if<arow<A.mu> tp=A.rops[arow+1];//tp為arow+1行的首非零元在data[]中的序號(hào) else//arow為最后一行 tp=A.tu+1; for<p=A.rops[arow];p<tp;p++>//p為A中當(dāng)前元素在data[]中的序號(hào) { brow=A.data[p].j;//brow為與B矩陣中的相應(yīng)行對(duì)應(yīng)的A中當(dāng)前元素的列標(biāo) if<brow<B.mu> t=B.rops[brow+1];//t為brow+1行的首非零元在B中data[]中的序號(hào) else//brow大小等于B.mu t=B.tu+1; for<q=B.rops[brow];q<t;q++>//q為B中當(dāng)前元素在B.data[]中的序號(hào) { ccol=B.data[q].j;//ccol:data[p]*data[q]所得結(jié)果所在的列 temp[ccol]+=A.data[p].e*B.data[q].e;//temp[ccol]:相乘所得的C矩陣中第arow行cool列元素的值 } } for<ccol=1;ccol<=B.nu;ccol++>// if<temp[ccol]>//temp[ccol]不為零,則把值賦到c中,c.tu加1。 { C.data[++C.tu].e=temp[ccol]; C.data[C.tu].i=arow; C.data[C.tu].j=ccol; } } } }}voidclear<juzhen&A>//清空稀疏矩陣{ inti;A.mu=0; A.nu=0; A.tu=0;for<i=0;i<Size1+1;i++> A.rops[i]=0; for<i=0;i<Size+1;i++> { A.data[i].i=0; A.data[i].j=0; A.data[i].e=0; }}voidmain<>{ juzhenA,B,C,D; crosslista,b,c,d;lable:printf<"******************************************************************\n">;printf<"請(qǐng)選擇:1、稀疏矩陣的加法,并輸出結(jié)果,2、稀疏矩陣乘法,并輸出結(jié)果\n">; printf<"\n3、十字鏈表加法,并輸出,4、十字鏈表乘法并輸出,5、結(jié)束:\n">; printf<"******************************************************************\n">; intx; scanf<"%d",&x>; switch<x> { case1: add<A,B,C>; print<C>; printf<"\n">; gotolable; case2: multy<A,B,C>; print<C>; printf<"\n">; gotolable; case3: a=addcross<>; printcross<a>; printf<"\n">; gotolable; case4: multycross<b>; printcross<b>; printf<"\n">; gotolable; case5: break; } printf<"\n">;}運(yùn)行結(jié)果:稀疏矩陣加法〔2稀疏矩陣乘法〔3十字鏈表加法〔4十字鏈表乘法廣義表的各種算法代碼:#include<stdio.h>#include<malloc.h>#include<stdlib.h>#definemaxlen100typedefcharElemType;typedefstructGLode//廣義表結(jié)構(gòu)體的定義{ inttag; union { ElemTypeatom; structGLode*hp; }val; structGLode*tp; }GList;typedefstruct//棧結(jié)構(gòu)的定義{ ElemTypedata[maxlen]; inttop;}SeqStack;//生成廣義表 GList*CreateGL<char*&s> { GList*h; charch; ch=*s; s++; if<ch!='\0'> { h=<GList*>malloc<sizeof<GList>>; if<ch=='<'> { h->tag=1; h->val.hp=CreateGL<s>; } elseif<ch=='>'> h=NULL; else { h->tag=0; h->val.atom=ch; } } else h=NULL; ch=*s; s++; if<h!=NULL> if<ch==','> h->tp=CreateGL<s>; else h->tp=NULL; returnh;}//遍歷廣義表voidDispGL<GList*g> { if<g!=NULL> { if<g->tag==1> { printf<"<">; if<g->val.hp==NULL> printf<"">; else DispGL<g->val.hp>; } else printf<"%c",g->val.atom>; if<g->tag==1> printf<">">; if<g->tp!=NULL> { printf<",">; DispGL<g->tp>; } }}//求廣義表的深度intGLDepth<GList*g> { intmax=0,dep; if<g->tag==0> return0; g=g->val.hp; if<g==NULL> return1; while<g!=NULL> { if<g->tag==1> { dep=GLDepth<g>; if<dep>max> max=dep; }g=g->tp; }return<max+1>;}//求廣義表的表尾GList*tail<GList*g>{ GList*p=g->val.hp; GList*t; if<g==NULL> { printf<"空表不能求表尾\n">; returnNULL; } elseif<g->tag==0> { printf<"原子不能求表尾\n">; returnNULL; } p=p->tp; t=<GList*>malloc<sizeof<GList>>; t->tag=1;t->tp=NULL; t->val.hp=p; returnt;}//查找函數(shù)voidFindGListX<GList*g,charx,int&mark>{ if<g!=NULL>{ if<g->tag==0&&g->val.atom==x> { mark=1; } else if<g->tag==1> FindGListX<g->val.hp,x,mark>; FindGListX<g->tp,x,mark>; }}//求廣義表的逆表voidNIGList<GList*g,SeqStack*s>{ if<g!=NULL> { if<g->tag==1> { s->top++; s->data[s-
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度租車行業(yè)信用體系建設(shè)合同2篇
- 二零二五年度餐廳裝修與品牌推廣合作合同3篇
- 二零二五年度電子產(chǎn)品組裝加工合同范本3篇
- 二零二五版電商平臺(tái)法律風(fēng)險(xiǎn)防范與合規(guī)管理合同3篇
- 二零二五版城市核心區(qū)二手房交易中介合同2篇
- 封窗合同范本(2篇)
- 展會(huì)參展商培訓(xùn)合同(2篇)
- 二零二五版高新技術(shù)產(chǎn)業(yè)勞動(dòng)合同標(biāo)準(zhǔn)文本3篇
- 二零二五版建筑工程合同管理與索賠爭(zhēng)議調(diào)解服務(wù)協(xié)議3篇
- 二零二五版房地產(chǎn)項(xiàng)目股權(quán)出資轉(zhuǎn)讓合同樣本3篇
- 資本金管理制度文件模板
- 2025年急診科護(hù)理工作計(jì)劃
- 高中家長(zhǎng)會(huì) 高二寒假線上家長(zhǎng)會(huì)課件
- 2024-2025學(xué)年山東省聊城市高一上學(xué)期期末數(shù)學(xué)教學(xué)質(zhì)量檢測(cè)試題(附解析)
- 違規(guī)行為與處罰管理制度
- 個(gè)人教師述職報(bào)告錦集10篇
- 四川省等八省2025年普通高中學(xué)業(yè)水平選擇性考試適應(yīng)性演練歷史試題(含答案)
- 《內(nèi)部培訓(xùn)師培訓(xùn)》課件
- 《雷達(dá)原理》課件-3.3.3教學(xué)課件:相控陣?yán)走_(dá)
- 西方史學(xué)史課件3教學(xué)
- 2024年中國(guó)醫(yī)藥研發(fā)藍(lán)皮書(shū)
評(píng)論
0/150
提交評(píng)論