九九热最新网址,777奇米四色米奇影院在线播放,国产精品18久久久久久久久久,中文有码视频,亚洲一区在线免费观看,国产91精品在线,婷婷丁香六月天

大數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)資料報(bào)告材料 - 問題詳解

上傳人:沈*** 文檔編號(hào):83622740 上傳時(shí)間:2022-05-02 格式:DOC 頁數(shù):25 大小:120KB
收藏 版權(quán)申訴 舉報(bào) 下載
大數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)資料報(bào)告材料 - 問題詳解_第1頁
第1頁 / 共25頁
大數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)資料報(bào)告材料 - 問題詳解_第2頁
第2頁 / 共25頁
大數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)資料報(bào)告材料 - 問題詳解_第3頁
第3頁 / 共25頁

下載文檔到電腦,查找使用更方便

10 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《大數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)資料報(bào)告材料 - 問題詳解》由會(huì)員分享,可在線閱讀,更多相關(guān)《大數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)資料報(bào)告材料 - 問題詳解(25頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。

1、word數(shù)據(jù)結(jié)構(gòu)(C語言版) 實(shí)驗(yàn)報(bào)告專業(yè) 班級(jí)學(xué)號(hào) 實(shí)驗(yàn)1實(shí)驗(yàn)題目:單鏈表的插入和刪除實(shí)驗(yàn)?zāi)康模毫私夂驼莆站€性表的邏輯結(jié)構(gòu)和鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu),掌握單鏈表的根本算法與相關(guān)的時(shí)間性能分析。實(shí)驗(yàn)要求:建立一個(gè)數(shù)據(jù)域定義為字符串的單鏈表,在鏈表中不允許有重復(fù)的字符串;根據(jù)輸入的字符串,先找到相應(yīng)的結(jié)點(diǎn),后刪除之。實(shí)驗(yàn)主要步驟:1、 分析、理解給出的示例程序。2、 調(diào)試程序,并設(shè)計(jì)輸入數(shù)據(jù)如:bat,cat,eat,fat,hat,jat,lat,mat,#,測試程序的如下功能:不允許重復(fù)字符串的插入;根據(jù)輸入的字符串,找到相應(yīng)的結(jié)點(diǎn)并刪除。3、 修改程序:(1) 增加插入結(jié)點(diǎn)的功能。(2) 將建立鏈表的

2、方法改為頭插入法。程序代碼:#includestdio.h#includestring.h#includestdlib.h#includectype.htypedef struct node /定義結(jié)點(diǎn)char data10; /結(jié)點(diǎn)的數(shù)據(jù)域?yàn)樽址畇truct node *next; /結(jié)點(diǎn)的指針域ListNode;typedef ListNode * LinkList; / 自定義LinkList單鏈表類型LinkList CreatListR1(); /函數(shù),用尾插入法建立帶頭結(jié)點(diǎn)的單鏈表LinkList CreatList(void); /函數(shù),用頭插入法建立帶頭結(jié)點(diǎn)的單鏈表ListN

3、ode *LocateNode(); /函數(shù),按值查找結(jié)點(diǎn)void DeleteList(); /函數(shù),刪除指定值的結(jié)點(diǎn)void printlist(); /函數(shù),打印鏈表中的所有值void DeleteAll(); /函數(shù),刪除所有結(jié)點(diǎn),釋放存ListNode * AddNode(); /修改程序:增加節(jié)點(diǎn)。用頭插法,返回頭指針/=主函數(shù)=void main()char ch10,num5;LinkList head;head=CreatList(); /用頭插入法建立單鏈表,返回頭指針printlist(head); /遍歷鏈表輸出其值printf( Delete node (y/n):)

4、; /輸入y或n去選擇是否刪除結(jié)點(diǎn)scanf(%s,num);if(strcmp(num,y)=0 | strcmp(num,Y)=0)printf(Please input Delete_data:);scanf(%s,ch); /輸入要?jiǎng)h除的字符串DeleteList(head,ch);printlist(head);printf( Add node ? (y/n):); /輸入y或n去選擇是否增加結(jié)點(diǎn)scanf(%s,num);if(strcmp(num,y)=0 | strcmp(num,Y)=0)head=AddNode(head);printlist(head);DeleteAll

5、(head); /刪除所有結(jié)點(diǎn),釋放存/=用尾插入法建立帶頭結(jié)點(diǎn)的單鏈表=LinkList CreatListR1(void) char ch10; LinkList head=(LinkList)malloc(sizeof(ListNode); /生成頭結(jié)點(diǎn) ListNode *s,*r,*pp; r=head; r-next=NULL; printf(Input # to end ); /輸入#代表輸入完畢 printf(nPlease input Node_data:); scanf(%s,ch); /輸入各結(jié)點(diǎn)的字符串 while(strcmp(ch,#)!=0) pp=LocateN

6、ode(head,ch); /按值查找結(jié)點(diǎn),返回結(jié)點(diǎn)指針if(pp=NULL) /沒有重復(fù)的字符串,插入到鏈表中s=(ListNode *)malloc(sizeof(ListNode);strcpy(s-data,ch);r-next=s;r=s;r-next=NULL;printf(Input # to end );printf(Please input Node_data:);scanf(%s,ch); return head; /返回頭指針/=用頭插入法建立帶頭結(jié)點(diǎn)的單鏈表=LinkList CreatList(void)char ch100;LinkList head,p;head=

7、(LinkList)malloc(sizeof(ListNode); head-next=NULL;while(1)printf(Input # to end ); printf(Please input Node_data:);scanf(%s,ch); if(strcmp(ch,#) if(LocateNode(head,ch)=NULL) strcpy(head-data,ch);p=(LinkList)malloc(sizeof(ListNode); p-next=head;head=p;else break;return head; /=按值查找結(jié)點(diǎn),找到如此返回該結(jié)點(diǎn)的位置,否如此

8、返回NULL=ListNode *LocateNode(LinkList head, char *key) ListNode *p=head-next; /從開始結(jié)點(diǎn)比擬 while(p!=NULL & strcmp(p-data,key)!=0) /直到p為NULL或p-data為key止p=p-next; /掃描下一個(gè)結(jié)點(diǎn) return p; /假設(shè)p=NULL如此查找失敗,否如此p指向找到的值為key的結(jié)點(diǎn)/=修改程序:增加節(jié)點(diǎn)=ListNode * AddNode(LinkList head) char ch10;ListNode *s,*pp; printf(nPlease inpu

9、t a New Node_data:); scanf(%s,ch); /輸入各結(jié)點(diǎn)的字符串pp=LocateNode(head,ch); /按值查找結(jié)點(diǎn),返回結(jié)點(diǎn)指針printf(ok2n);if(pp=NULL) /沒有重復(fù)的字符串,插入到鏈表中s=(ListNode *)malloc(sizeof(ListNode);strcpy(s-data,ch);printf(ok3n);s-next=head-next;head-next=s;return head;/=刪除帶頭結(jié)點(diǎn)的單鏈表中的指定結(jié)點(diǎn)=void DeleteList(LinkList head,char *key) ListNo

10、de *p,*r,*q=head; p=LocateNode(head,key); /按key值查找結(jié)點(diǎn)的 if(p=NULL ) /假設(shè)沒有找到結(jié)點(diǎn),退出printf(position error);exit(0); while(q-next!=p) /p為要?jiǎng)h除的結(jié)點(diǎn),q為p的前結(jié)點(diǎn)q=q-next; r=q-next; q-next=r-next; free(r); /釋放結(jié)點(diǎn)/=打印鏈表=void printlist(LinkList head) ListNode *p=head-next; /從開始結(jié)點(diǎn)打印 while(p)printf(%s, ,p-data);p=p-next;

11、printf(n);/=刪除所有結(jié)點(diǎn),釋放空間=void DeleteAll(LinkList head) ListNode *p=head,*r; while(p-next)r=p-next;free(p);p=r;free(p);實(shí)驗(yàn)結(jié)果:Input # to end Please input Node_data:batInput # to end Please input Node_data:catInput # to end Please input Node_data:eatInput # to end Please input Node_data:fatInput # to end

12、 Please input Node_data:hatInput # to end Please input Node_data:jatInput # to end Please input Node_data:latInput # to end Please input Node_data:matInput # to end Please input Node_data:#mat, lat, jat, hat, fat, eat, cat, bat, Delete node (y/n):yPlease input Delete_data:hatmat, lat, jat, fat, eat,

13、 cat, bat, Insert node (y/n):yPlease input Insert_data:putposition :5mat, lat, jat, fat, eat, put, cat, bat,請(qǐng)按任意鍵繼續(xù). . .示意圖:latjathatfateatcatbatmatNULLheadlatjathatfateatcatbatmatheadlatjatfateatputcatbatmatheadNULLNULL心得體會(huì):本次實(shí)驗(yàn)使我們對(duì)鏈表的實(shí)質(zhì)了解更加明確了,對(duì)鏈表的一些根本操作也更加熟練了。另外實(shí)驗(yàn)指導(dǎo)書上給出的代碼是有一些問題的,這使我們認(rèn)識(shí)到實(shí)驗(yàn)過程中不能想當(dāng)

14、然的直接編譯執(zhí)行,應(yīng)當(dāng)在閱讀并完全理解代碼的根底上再執(zhí)行,這才是實(shí)驗(yàn)的意義所在。實(shí)驗(yàn)2實(shí)驗(yàn)題目:二叉樹操作設(shè)計(jì)和實(shí)現(xiàn)實(shí)驗(yàn)?zāi)康模赫莆斩鏄涞亩x、性質(zhì)與存儲(chǔ)方式,各種遍歷算法。實(shí)驗(yàn)要求:采用二叉樹鏈表作為存儲(chǔ)結(jié)構(gòu),完成二叉樹的建立,先序、中序和后序以與按層次遍歷的操作,求所有葉子與結(jié)點(diǎn)總數(shù)的操作。實(shí)驗(yàn)主要步驟:1、 分析、理解程序。2、 調(diào)試程序,設(shè)計(jì)一棵二叉樹,輸入完全二叉樹的先序序列,用#代表虛結(jié)點(diǎn)空指針,如ABD#CE#F#,建立二叉樹,求出先序、中序和后序以與按層次遍歷序列,求所有葉子與結(jié)點(diǎn)總數(shù)。實(shí)驗(yàn)代碼#includestdio.h#includestdlib.h#includestr

15、ing.h#define Max 20 /結(jié)點(diǎn)的最大個(gè)數(shù)typedef struct node char data; struct node *lchild,*rchild;BinTNode; /自定義二叉樹的結(jié)點(diǎn)類型typedef BinTNode *BinTree; /定義二叉樹的指針int NodeNum,leaf; /NodeNum為結(jié)點(diǎn)數(shù),leaf為葉子數(shù)/=基于先序遍歷算法創(chuàng)建二叉樹=/=要求輸入先序序列,其中參加虛結(jié)點(diǎn)#以示空指針的位置=BinTree CreatBinTree(void) BinTree T; char ch; if(ch=getchar()=#)return(

16、NULL); /讀入#,返回空指針 else T= (BinTNode *)malloc(sizeof(BinTNode); /生成結(jié)點(diǎn)T-data=ch;T-lchild=CreatBinTree(); /構(gòu)造左子樹T-rchild=CreatBinTree(); /構(gòu)造右子樹return(T); /=NLR 先序遍歷=void Preorder(BinTree T) if(T) printf(%c,T-data); /訪問結(jié)點(diǎn)Preorder(T-lchild); /先序遍歷左子樹Preorder(T-rchild); /先序遍歷右子樹 /=LNR 中序遍歷= void Inorder(B

17、inTree T) if(T) Inorder(T-lchild); /中序遍歷左子樹printf(%c,T-data); /訪問結(jié)點(diǎn)Inorder(T-rchild); /中序遍歷右子樹 /=LRN 后序遍歷=void Postorder(BinTree T) if(T) Postorder(T-lchild); /后序遍歷左子樹Postorder(T-rchild); /后序遍歷右子樹printf(%c,T-data); /訪問結(jié)點(diǎn) /=采用后序遍歷求二叉樹的深度、結(jié)點(diǎn)數(shù)與葉子數(shù)的遞歸算法=int TreeDepth(BinTree T) int hl,hr,max; if(T)hl=Tr

18、eeDepth(T-lchild); /求左深度hr=TreeDepth(T-rchild); /求右深度max=hlhr? hl:hr; /取左右深度的最大值NodeNum=NodeNum+1; /求結(jié)點(diǎn)數(shù)if(hl=0&hr=0) leaf=leaf+1; /假設(shè)左右深度為0,即為葉子。return(max+1); else return(0);/=利用先進(jìn)先出FIFO隊(duì)列,按層次遍歷二叉樹=void Levelorder(BinTree T) int front=0,rear=1; BinTNode *cqMax,*p; /定義結(jié)點(diǎn)的指針數(shù)組cq cq1=T; /根入隊(duì) while(fr

19、ont!=rear) front=(front+1)%NodeNum;p=cqfront; /出隊(duì)printf(%c,p-data); /出隊(duì),輸出結(jié)點(diǎn)的值 if(p-lchild!=NULL) rear=(rear+1)%NodeNum; cqrear=p-lchild; /左子樹入隊(duì)if(p-rchild!=NULL) rear=(rear+1)%NodeNum; cqrear=p-rchild; /右子樹入隊(duì) /=數(shù)葉子節(jié)點(diǎn)個(gè)數(shù)=int countleaf(BinTree T)int hl,hr; if(T)hl=countleaf(T-lchild);hr=countleaf(T-rc

20、hild);if(hl=0&hr=0) /假設(shè)左右深度為0,即為葉子。return(1);else return hl+hr; else return 0;/=主函數(shù)=void main() BinTree root;char i; int depth; printf(n);printf(Creat Bin_Tree; Input preorder:); /輸入完全二叉樹的先序序列, / 用#代表虛結(jié)點(diǎn),如ABD#CE#F# root=CreatBinTree(); /創(chuàng)建二叉樹,返回根結(jié)點(diǎn) do /從菜單中選擇遍歷方式,輸入序號(hào)。printf(t* select *n);printf(t1:

21、 Preorder Traversaln); printf(t2: Iorder Traversaln);printf(t3: Postorder traversaln);printf(t4: PostTreeDepth,Node number,Leaf numbern);printf(t5: Level Depthn); /按層次遍歷之前,先選擇4,求出該樹的結(jié)點(diǎn)數(shù)。printf(t0: Exitn);printf(t*n);fflush(stdin);scanf(%c,&i); /輸入菜單序號(hào)0-5switch (i-0)case 1: printf(Print Bin_tree Preo

22、rder: );Preorder(root); /先序遍歷break;case 2: printf(Print Bin_Tree Inorder: );Inorder(root); /中序遍歷break;case 3: printf(Print Bin_Tree Postorder: );Postorder(root); /后序遍歷break;case 4: depth=TreeDepth(root); /求樹的深度與葉子數(shù)printf(BinTree Depth=%d BinTree Node number=%d,depth,NodeNum);printf( BinTree Leaf num

23、ber=%d,countleaf(root);break;case 5: printf(LevePrint Bin_Tree: );Levelorder(root); /按層次遍歷break;default: exit(1);printf(n); while(i!=0); 實(shí)驗(yàn)結(jié)果:Creat Bin_Tree; Input preorder:ABD#CE#F# * select * 1: Preorder Traversal 2: Iorder Traversal 3: Postorder traversal 4: PostTreeDepth,Node number,Leaf number

24、5: Level Depth 0: Exit * 1 Print Bin_tree Preorder: ABDCEF 2 Print Bin_Tree Inorder: DBAECF 3 Print Bin_Tree Postorder: DBEFCA 4 BinTree Depth=3 BinTree Node number=6 BinTree Leaf number=3 5 LevePrint Bin_Tree: ABCDEF 0 Press any key to continue 二叉樹示意圖ABFEDC心得體會(huì):這次實(shí)驗(yàn)加深了我對(duì)二叉樹的印象,尤其是對(duì)二叉樹的各種遍歷操作有了一定的了解

25、。同時(shí)認(rèn)識(shí)到,在設(shè)計(jì)程序時(shí)輔以圖形化的描述是非常有用處的。實(shí)驗(yàn)3實(shí)驗(yàn)題目:圖的遍歷操作實(shí)驗(yàn)?zāi)康模赫莆沼邢驁D和無向圖的概念;掌握鄰接矩陣和鄰接鏈表建立圖的存儲(chǔ)結(jié)構(gòu);掌握DFS與BFS對(duì)圖的遍歷操作;了解圖結(jié)構(gòu)在人工智能、工程等領(lǐng)域的廣泛應(yīng)用。實(shí)驗(yàn)要求:采用鄰接矩陣和鄰接鏈表作為圖的存儲(chǔ)結(jié)構(gòu),完成有向圖和無向圖的DFS和BFS操作。實(shí)驗(yàn)主要步驟:設(shè)計(jì)一個(gè)有向圖和一個(gè)無向圖,任選一種存儲(chǔ)結(jié)構(gòu),完成有向圖和無向圖的DFS深度優(yōu)先遍歷和BFS廣度優(yōu)先遍歷的操作。1 鄰接矩陣作為存儲(chǔ)結(jié)構(gòu)#includestdio.h#includestdlib.h#define MaxVertexNum 100 /定義最

26、大頂點(diǎn)數(shù)typedef struct char vexsMaxVertexNum; /頂點(diǎn)表 int edgesMaxVertexNumMaxVertexNum; /鄰接矩陣,可看作邊表 int n,e; /圖中的頂點(diǎn)數(shù)n和邊數(shù)eMGraph; /用鄰接矩陣表示的圖的類型/=建立鄰接矩陣=void CreatMGraph(MGraph *G) int i,j,k; char a; printf(Input VertexNum(n) and EdgesNum(e): ); scanf(%d,%d,&G-n,&G-e); /輸入頂點(diǎn)數(shù)和邊數(shù) scanf(%c,&a); printf(Input V

27、ertex string:); for(i=0;in;i+) scanf(%c,&a); G-vexsi=a; /讀入頂點(diǎn)信息,建立頂點(diǎn)表 for(i=0;in;i+)for(j=0;jn;j+)G-edgesij=0; /初始化鄰接矩陣 printf(Input edges,Creat Adjacency Matrixn); for(k=0;ke;k+) /讀入e條邊,建立鄰接矩陣 scanf(%d%d,&i,&j); /輸入邊Vi,Vj的頂點(diǎn)序號(hào) G-edgesij=1; G-edgesji=1; /假設(shè)為無向圖,矩陣為對(duì)稱矩陣;假設(shè)建立有向圖,去掉該條語句 /=定義標(biāo)志向量,為全局變量=

28、typedef enumFALSE,TRUE Boolean;Boolean visitedMaxVertexNum;/=DFS:深度優(yōu)先遍歷的遞歸算法=void DFSM(MGraph *G,int i) /以Vi為出發(fā)點(diǎn)對(duì)鄰接矩陣表示的圖G進(jìn)展DFS搜索,鄰接矩陣是0,1矩陣 int j; printf(%c,G-vexsi); /訪問頂點(diǎn)Vi visitedi=TRUE; /置已訪問標(biāo)志 for(j=0;jn;j+) /依次搜索Vi的鄰接點(diǎn)if(G-edgesij=1 & ! visitedj) DFSM(G,j); /Vi,VjE,且Vj未訪問過,故Vj為新出發(fā)點(diǎn)void DFS(MG

29、raph *G) int i; for(i=0;in;i+)visitedi=FALSE; /標(biāo)志向量初始化 for(i=0;in;i+)if(!visitedi) /Vi未訪問過 DFSM(G,i); /以Vi為源點(diǎn)開始DFS搜索/=BFS:廣度優(yōu)先遍歷=void BFS(MGraph *G,int k) /以Vk為源點(diǎn)對(duì)用鄰接矩陣表示的圖G進(jìn)展廣度優(yōu)先搜索 int i,j,f=0,r=0; int cqMaxVertexNum; /定義隊(duì)列 for(i=0;in;i+)visitedi=FALSE; /標(biāo)志向量初始化 for(i=0;in;i+)cqi=-1; /隊(duì)列初始化 printf(

30、%c,G-vexsk); /訪問源點(diǎn)Vk visitedk=TRUE; cqr=k; /Vk已訪問,將其入隊(duì)。注意,實(shí)際上是將其序號(hào)入隊(duì) while(cqf!=-1) /隊(duì)非空如此執(zhí)行 i=cqf; f=f+1; /Vf出隊(duì) for(j=0;jn;j+) /依次Vi的鄰接點(diǎn)Vj if(G-edgesij=1 & !visitedj) /Vj未訪問 printf(%c,G-vexsj); /訪問Vj visitedj=TRUE; r=r+1; cqr=j; /訪問過Vj入隊(duì) /=main=void main() int i; MGraph *G; G=(MGraph *)malloc(sizeo

31、f(MGraph); /為圖G申請(qǐng)存空間 CreatMGraph(G); /建立鄰接矩陣 printf(Print Graph DFS: ); DFS(G); /深度優(yōu)先遍歷 printf(n); printf(Print Graph BFS: ); BFS(G,3); /以序號(hào)為3的頂點(diǎn)開始廣度優(yōu)先遍歷 printf(n);2 鄰接鏈表作為存儲(chǔ)結(jié)構(gòu)#includestdio.h#includestdlib.h#define MaxVertexNum 50 /定義最大頂點(diǎn)數(shù)typedef struct node /邊表結(jié)點(diǎn) int adjvex; /鄰接點(diǎn)域 struct node *next

32、; /鏈域EdgeNode;typedef struct vnode /頂點(diǎn)表結(jié)點(diǎn) char vertex; /頂點(diǎn)域 EdgeNode *firstedge; /邊表頭指針VertexNode;typedef VertexNode AdjListMaxVertexNum; /AdjList是鄰接表類型typedef struct AdjList adjlist; /鄰接表 int n,e; /圖中當(dāng)前頂點(diǎn)數(shù)和邊數(shù) ALGraph; /圖類型/=建立圖的鄰接表=void CreatALGraph(ALGraph *G) int i,j,k; char a; EdgeNode *s; /定義邊表

33、結(jié)點(diǎn) printf(Input VertexNum(n) and EdgesNum(e): ); scanf(%d,%d,&G-n,&G-e); /讀入頂點(diǎn)數(shù)和邊數(shù) scanf(%c,&a); printf(Input Vertex string:); for(i=0;in;i+) /建立邊表 scanf(%c,&a);G-adjlisti.vertex=a; /讀入頂點(diǎn)信息G-adjlisti.firstedge=NULL; /邊表置為空表 printf(Input edges,Creat Adjacency Listn); for(k=0;ke;k+) /建立邊表 scanf(%d%d,&

34、i,&j); /讀入邊Vi,Vj的頂點(diǎn)對(duì)序號(hào)s=(EdgeNode *)malloc(sizeof(EdgeNode); /生成邊表結(jié)點(diǎn)s-adjvex=j; /鄰接點(diǎn)序號(hào)為js-next=G-adjlisti.firstedge;G-adjlisti.firstedge=s; /將新結(jié)點(diǎn)*S插入頂點(diǎn)Vi的邊表頭部s=(EdgeNode *)malloc(sizeof(EdgeNode); s-adjvex=i; /鄰接點(diǎn)序號(hào)為is-next=G-adjlistj.firstedge; G-adjlistj.firstedge=s; /將新結(jié)點(diǎn)*S插入頂點(diǎn)Vj的邊表頭部 /=定義標(biāo)志向量,為全

35、局變量=typedef enumFALSE,TRUE Boolean;Boolean visitedMaxVertexNum;/=DFS:深度優(yōu)先遍歷的遞歸算法=void DFSM(ALGraph *G,int i) /以Vi為出發(fā)點(diǎn)對(duì)鄰接鏈表表示的圖G進(jìn)展DFS搜索 EdgeNode *p; printf(%c,G-adjlisti.vertex); /訪問頂點(diǎn)Vi visitedi=TRUE; /標(biāo)記Vi已訪問 p=G-adjlisti.firstedge; /取Vi邊表的頭指針 while(p) /依次搜索Vi的鄰接點(diǎn)Vj,這里j=p-adjvexif(! visitedp-adjvex

36、) /假設(shè)Vj尚未被訪問 DFSM(G,p-adjvex); /如此以Vj為出發(fā)點(diǎn)向縱深搜索p=p-next; /找Vi的下一個(gè)鄰接點(diǎn) void DFS(ALGraph *G) int i; for(i=0;in;i+)visitedi=FALSE; /標(biāo)志向量初始化 for(i=0;in;i+)if(!visitedi) /Vi未訪問過 DFSM(G,i); /以Vi為源點(diǎn)開始DFS搜索/=BFS:廣度優(yōu)先遍歷=void BFS(ALGraph *G,int k) /以Vk為源點(diǎn)對(duì)用鄰接鏈表表示的圖G進(jìn)展廣度優(yōu)先搜索 int i,f=0,r=0; EdgeNode *p; int cqMax

37、VertexNum; /定義FIFO隊(duì)列 for(i=0;in;i+)visitedi=FALSE; /標(biāo)志向量初始化 for(i=0;in;i+)cqi=-1; /初始化標(biāo)志向量 printf(%c,G-adjlistk.vertex); /訪問源點(diǎn)Vk visitedk=TRUE; cqr=k; /Vk已訪問,將其入隊(duì)。注意,實(shí)際上是將其序號(hào)入隊(duì) while(cqf!=-1) 隊(duì)列非空如此執(zhí)行i=cqf; f=f+1; /Vi出隊(duì)p=G-adjlisti.firstedge; /取Vi的邊表頭指針while(p) /依次搜索Vi的鄰接點(diǎn)Vj令p-adjvex=j if(!visitedp-

38、adjvex) /假設(shè)Vj未訪問過printf(%c,G-adjlistp-adjvex.vertex); /訪問Vjvisitedp-adjvex=TRUE;r=r+1; cqr=p-adjvex; /訪問過的Vj入隊(duì) p=p-next; /找Vi的下一個(gè)鄰接點(diǎn) /endwhile/=主函數(shù)=void main() int i; ALGraph *G; G=(ALGraph *)malloc(sizeof(ALGraph); CreatALGraph(G); printf(Print Graph DFS: ); DFS(G); printf(n); printf(Print Graph BF

39、S: ); BFS(G,3); printf(n);實(shí)驗(yàn)結(jié)果:1. 鄰接矩陣作為存儲(chǔ)結(jié)構(gòu)執(zhí)行順序:V6V4V5V7V2V3V1V0VoInput VertexNum(n) and EdgesNum(e): 8,9Input Vertex string: 01234567Input edges,Creat Adjacency Matrix0 10 21 31 42 52 63 74 75 6Print Graph DFS: 01374256Print Graph BFS: 317042562. 鄰接鏈表作為存儲(chǔ)結(jié)構(gòu)執(zhí)行順序:Input VertexNum(n) and EdgesNum(e):

40、8,9Input Vertex string: 01234567V6V4V5V7V2V3V1V0VoInput edges,Creat Adjacency List0 10 21 31 42 52 63 74 75 6Print Graph DFS: 02651473Print Graph BFS: 37140265心得體會(huì):這次實(shí)驗(yàn)較以前的實(shí)驗(yàn)難度加大,必須先理解深度優(yōu)先和廣度優(yōu)先兩種遍歷思路,和數(shù)據(jù)結(jié)構(gòu)中隊(duì)列的根本操作,才能看懂理解代碼。同時(shí)圖這種數(shù)據(jù)結(jié)構(gòu)對(duì)抽象的能力要求非常高,代碼不容易看懂,排錯(cuò)也比擬麻煩,應(yīng)該多加練習(xí),才能掌握。實(shí)驗(yàn)4實(shí)驗(yàn)題目:排序?qū)嶒?yàn)?zāi)康模赫莆崭鞣N排序方法的根本思想

41、、排序過程、算法實(shí)現(xiàn),能進(jìn)展時(shí)間和空間性能的分析,根據(jù)實(shí)際問題的特點(diǎn)和要求選擇適宜的排序方法。實(shí)驗(yàn)要求:實(shí)現(xiàn)直接排序、冒泡、直接選擇、快速、堆、歸并排序算法。比擬各種算法的運(yùn)行速度。實(shí)驗(yàn)主要步驟:實(shí)驗(yàn)代碼#includestdio.h#includestdlib.h#define Max 100 /假設(shè)文件長度typedef struct /定義記錄類型 int key; /關(guān)鍵字項(xiàng)RecType;typedef RecType SeqListMax+1; /SeqList為順序表,表中第0個(gè)元素作為哨兵int n; /順序表實(shí)際的長度/=直接插入排序法=void InsertSort(Seq

42、List R) /對(duì)順序表R中的記錄R1n按遞增序進(jìn)展插入排序 int i,j; for(i=2;i=n;i+) /依次插入R2,Rn if(Ri.keyRi-1.key) /假設(shè)Ri.key大于等于有序區(qū)中所有的keys,如此Ri留在原位 R0=Ri;j=i-1; /R0是Ri的副本 do /從右向左在有序區(qū)R1i-1中查找Ri的位置 Rj+1=Rj; /將關(guān)鍵字大于Ri.key的記錄后移 j-; while(R0.keyRj.key); /當(dāng)Ri.keyRj.key 是終止 Rj+1=R0; /Ri插入到正確的位置上/endif/=冒泡排序= typedef enum FALSE,TRUE

43、 Boolean; /FALSE為0,TRUE為1void BubbleSort(SeqList R) /自下向上掃描對(duì)R做冒泡排序 int i,j; Boolean exchange; /交換標(biāo)志for(i=1;i=i;j-) /對(duì)當(dāng)前無序區(qū)Rin 自下向上掃描 if(Rj+1.keyRj.key) /兩兩比擬,滿足條件交換記錄R0=Rj+1; /R0不是哨兵,僅做暫存單元Rj+1=Rj;Rj=R0;exchange=TRUE; /發(fā)生了交換,故將交換標(biāo)志置為真 if(! exchange) /本趟排序未發(fā)生交換,提前終止算法 return; /endfor為循環(huán)/1.=一次劃分函數(shù)=int

44、 Partition(SeqList R,int i,int j) / 對(duì)Rij做一次劃分,并返回基準(zhǔn)記錄的位置 RecType pivot=Ri; /用第一個(gè)記錄作為基準(zhǔn) while(ij) /從區(qū)間兩端交替向中間掃描,直到i=jwhile(i=pivot.key) /基準(zhǔn)記錄pivot相當(dāng)與在位置i上 j-; /從右向左掃描,查找第一個(gè)關(guān)鍵字小于pivot.key的記錄Rjif(ij) /假設(shè)找到的Rj.key pivot.key,如此Ri+=Rj; /交換Ri和Rj,交換后i指針加1while(ij &Ri.key=pivot.key) /基準(zhǔn)記錄pivot相當(dāng)與在位置j上i+; /從左

45、向右掃描,查找第一個(gè)關(guān)鍵字小于pivot.key的記錄Riif(i pivot.key,如此Rj-=Ri; /交換Ri和Rj,交換后j指針減1 Ri=pivot; /此時(shí),i=j,基準(zhǔn)記錄已被最后定位 return i; /返回基準(zhǔn)記錄的位置/2.=快速排序=void QuickSort(SeqList R,int low,int high) /Rlow.high快速排序 int pivotpos; /劃分后基準(zhǔn)記錄的位置 if(lowhigh) /僅當(dāng)區(qū)間長度大于1時(shí)才排序pivotpos=Partition(R,low,high); /對(duì)Rlow.high做一次劃分,得到基準(zhǔn)記錄的位置QuickSort(R,low,pivotpos-1); /對(duì)左區(qū)間遞歸排序QuickSort(R,pivotpos+1,high); /對(duì)右區(qū)間遞歸排序 /=直接選擇排序=void SelectSort(SeqL

展開閱讀全文
溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(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ì)自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號(hào):ICP2024067431號(hào)-1 川公網(wǎng)安備51140202000466號(hào)


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺(tái),本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請(qǐng)立即通知裝配圖網(wǎng),我們立即給予刪除!