数据结构实验三 树的遍历生成树
廣州大學(xué)學(xué)生實(shí)驗(yàn)報(bào)告
?
開課實(shí)驗(yàn)室:計(jì)算機(jī)科學(xué)與工程實(shí)驗(yàn)(電子樓418A) ????2019年4月19日
| 學(xué)院 | 計(jì)算機(jī)科學(xué)與教育軟件學(xué)院 | 年級(jí)、專業(yè)、班 | 計(jì)算機(jī)科學(xué)與技術(shù) | 姓名 | ? | 學(xué)號(hào) | ? | |
| 實(shí)驗(yàn)課程名稱 | 數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn) | 成績(jī) | ? | |||||
| 實(shí)驗(yàn)項(xiàng)目名稱 | 實(shí)驗(yàn)三 樹的的遍歷生成樹 | 指導(dǎo)老師 | 玲 | |||||
| 一、實(shí)驗(yàn)?zāi)康?/strong> 1、把圖轉(zhuǎn)化為程序能識(shí)別的鄰接矩陣; 2、理解圖的遍歷方法及對(duì)應(yīng)的生成樹。 二、使用儀器、器材 微機(jī)一臺(tái) 操作系統(tǒng):Win10 編程軟件:C++ 三、實(shí)驗(yàn)內(nèi)容及原理 1.圖的輸入:鄰接矩陣直接寫入源程序,或鍵盤輸入,或讀入數(shù)據(jù)文件 起始結(jié)點(diǎn)的輸入:運(yùn)行時(shí)由鍵盤輸入 輸出:生成樹的邊,用結(jié)點(diǎn)的序偶表示, ?
GRAPH.H #pragma once //圖的鄰接表存儲(chǔ)結(jié)構(gòu) #define INF 32767????????????? //定義∞ #define? MAXV 100????????????? //最大頂點(diǎn)個(gè)數(shù) #define? MAX 100?????????????? ??? //最大全局?jǐn)?shù)組 #define MaxSize 100 typedef char InfoType; typedef int ElemType; typedef struct ANode { ??? int adjvex; ??? struct ANode *nextarc; ??? int weight; }ArcNode; typedef struct Vnode { ??? char info; ??? ArcNode *firstarc; }VNode; typedef struct { ??? VNode adjlist[MAXV]; ??? int n, e; }AdjGraph; //環(huán)形隊(duì)列 typedef struct { ??? ElemType data[MaxSize]; ??? int front, rear;????? //隊(duì)首和隊(duì)尾指針 } SqQueue; ? void CreateAdj(AdjGraph* &G, int A[MAXV][MAXV], int n, int e);//創(chuàng)建圖的鄰接表 void DispAdj(AdjGraph*G);//輸出鄰接表 void DestroyAdj(AdjGraph *&G);//銷毀鄰接表 void DFS(AdjGraph* G, int v);//深度優(yōu)先遍歷生成樹 ? //--------------------------------------------------------- //--廣度優(yōu)先遍歷中使用隊(duì)列的基本運(yùn)算算法------------------- //--------------------------------------------------------- void InitQueue(SqQueue *&q); void DestroyQueue(SqQueue *&q); bool QueueEmpty(SqQueue *q); bool enQueue(SqQueue *&q, ElemType e);//進(jìn)棧 bool deQueue(SqQueue *&q, ElemType &e); //--------------------------------------------------------- ? void BFS(AdjGraph *G, int v);//廣度優(yōu)先遍歷生成樹 GRAPH.CPP #include"pch.h" #include "graph.h" #include"malloc.h" #include<iostream> using namespace std; ? void CreateAdj(AdjGraph *& G, int A[MAXV][MAXV], int n, int e) ??? { ???????? int i, j; ArcNode *p; ? ???????? for (i = 0; i < n; i++)????? //給鄰接表中所有頭節(jié)點(diǎn)指針置初值 ???????? { ???????????? G->adjlist[i].firstarc = NULL; ???????? } ???????? for (i = 0; i < n; i++)????? //檢查鄰接矩陣每個(gè)元素 ???????? { ???????????? for (j = n - 1; j >= 0; j--) ???????????? { ????????????????? if (A[i][j] != 0 && A[i][j] != INF)?? //存在一條邊 ????????????????? { ????????????????????? p = (ArcNode*)malloc(sizeof(ArcNode));? //創(chuàng)建一個(gè)結(jié)點(diǎn)p ????????????????????? p->adjvex = j;?? //?? 存放鄰接點(diǎn) ????????????????????? p->weight = A[i][j];?? //存放權(quán) ????????????????????? p->nextarc = G->adjlist[i].firstarc;?? //頭插法 ????????????????????? G->adjlist[i].firstarc = p; ????????????????? } ???????????? } ???????? } ???????? G->n = n; G->e = e; } ? void DispAdj(AdjGraph * G) { ??? int i; ??? ArcNode *p; ??? for (i = 0; i < G->n; i++) ??? { ???????? p = G->adjlist[i].firstarc; ???????? printf("%3d: ", i); ???????? while (p != NULL) ???????? { ???????????? printf("%3d[%d]→", p->adjvex, p->weight); ???????????? p = p->nextarc; ???????? } ???????? printf("∧\n"); ??? } } ? void DestroyAdj(AdjGraph *& G) { ??? int i; ??? ArcNode *pre, *p; ??? for (i = 0; i < G->n; i++)???????? //掃描所有的單鏈表 ??? { ???????? pre = G->adjlist[i].firstarc;? //p指向第i個(gè)單鏈表的首結(jié)點(diǎn) ???????? if (pre != NULL) ???????? { ???????????? p = pre->nextarc; ???????????? while (p != NULL)???????? //釋放第i個(gè)單鏈表的所有邊結(jié)點(diǎn) ???????????? { ????????????????? free(pre); ????????????????? pre = p; p = p->nextarc; ???????????? } ???????????? free(pre); ???????? } ??? } ??? free(G);?????????????????????? //釋放頭結(jié)點(diǎn)數(shù)組 } ? int? visited[MAX] = { 0 }; void DFS(AdjGraph* G, int v)?? //深度優(yōu)先遍歷 { ??? ArcNode*p; ??? visited[v] = 1;?? //置已訪問(wèn)標(biāo)記 ??? //cout << v << endl;? //輸出被訪問(wèn)頂點(diǎn)的編號(hào) ??? p = G->adjlist[v].firstarc;? //p指向頂點(diǎn)v的第一個(gè)鄰接點(diǎn) ??? while (p != NULL) ??? { ???????? if (visited[p->adjvex] == 0) ???????? { ???????????? cout << "(" << v << "," << p->adjvex << ")" << endl; ???????????? DFS(G, p->adjvex); ???????? } ???????? p = p->nextarc;?? //p指向頂點(diǎn)v的下一個(gè)鄰接點(diǎn) ??? } } ? void InitQueue(SqQueue *& q) { ??? q = (SqQueue *)malloc(sizeof(SqQueue)); ??? q->front = q->rear = 0; } ? void DestroyQueue(SqQueue *& q) { ??? free(q); } ? bool QueueEmpty(SqQueue * q) { ??? return(q->front == q->rear); } ? bool enQueue(SqQueue *& q, ElemType e) { ??? if ((q->rear + 1) % MaxSize == q->front)??? //隊(duì)滿上溢出 ???????? return false; ??? q->rear = (q->rear + 1) % MaxSize; ??? q->data[q->rear] = e; ??? return true; } ? bool deQueue(SqQueue *& q, ElemType & e) { ??? if (q->front == q->rear)??????????????? //隊(duì)空下溢出 ???????? return false; ??? q->front = (q->front + 1) % MaxSize; ??? e = q->data[q->front]; ??? return true; } ? void BFS(AdjGraph * G, int v)? //廣度優(yōu)先遍歷 { ??? int w, i; ??? ArcNode *p; ??? SqQueue *qu;??????????????????????????? //定義環(huán)形隊(duì)列指針 ??? InitQueue(qu);????????????????????????????? //初始化隊(duì)列 ??? int visited[MAXV];??????????? ????????? //定義頂點(diǎn)訪問(wèn)標(biāo)志數(shù)組 ??? for (i = 0; i < G->n; i++) visited[i] = 0;?????? //訪問(wèn)標(biāo)志數(shù)組初始化 ??? //printf("%2d ", v); ?????????????????????? //輸出被訪問(wèn)頂點(diǎn)的編號(hào) ??? visited[v] = 1;????????????? ?????????????? //置已訪問(wèn)標(biāo)記 ??? enQueue(qu, v); ??? while (!QueueEmpty(qu))?????? ????????? //隊(duì)不空循環(huán) ??? { ???????? deQueue(qu, w);???????????????????????? //出隊(duì)一個(gè)頂點(diǎn)w ???????? p = G->adjlist[w].firstarc; ??????????? //指向w的第一個(gè)鄰接點(diǎn) ??? ??? while (p != NULL)?????????????????????? //查找w的所有鄰接點(diǎn) ???????? { ???????????? if (visited[p->adjvex] == 0) ????? //若當(dāng)前鄰接點(diǎn)未被訪問(wèn) ???????????? { ????????????????? cout << "(" << w << "," << p->adjvex << ")" << endl; ????????????????? //printf("%2d ", p->adjvex);? //訪問(wèn)該鄰接點(diǎn) ????????????????? visited[p->adjvex] = 1;??????? //置已訪問(wèn)標(biāo)記 ????????????????? enQueue(qu, p->adjvex);??????? //該頂點(diǎn)進(jìn)隊(duì) ???????????? } ???????????? p = p->nextarc;????????????? ????? //找下一個(gè)鄰接點(diǎn) ???????? } ??? } ??? printf("\n"); } ? MAIN.CPP ? #include "pch.h" #include <iostream> #include"graph.h" using namespace std; ? int main() { ??? AdjGraph *G=new AdjGraph; ??? int A[MAXV][MAXV] = { {0,1,1,1,0,0,0,0,0,0,0},{1,0,0,0,1,1,0,0,0,0,0}, ???????????? ????????????? {1,0,0,1,0,1,1,0,0,0,0},{1,0,1,0,0,0,0,1,0,0,0}, ??? ????????????????????? {0,1,0,0,0,0,0,0,0,0,0},{0,1,1,0,0,0,0,0,0,0,0}, ??? ????????????????????? {0,0,1,0,0,0,0,1,1,1,0},{0,0,0,1,0,0,1,0,0,0,1}, ??? ??????????????? ??????{0,0,0,0,0,0,1,0,0,0,0},{0,0,0,0,0,0,1,0,0,0,0}, ??? ????????????????????? {0,0,0,0,0,0,0,1,0,0,0} } ??? ; ??? int n = 11, e = 12; ??? CreateAdj(G, A, n, e);???????? //建立《教程》中圖8.1(a)的鄰接表 ??? //printf("圖G的鄰接表:\n"); ??? //DispAdj(G);????????????????? //輸出鄰接表G ??? cout << "請(qǐng)輸入起始結(jié)點(diǎn)" << endl; ??? int a; ??? cin >> a; ??? printf("深度優(yōu)先序列(遞歸)生成樹:"); printf("\n"); DFS(G, a); printf("\n"); ??? printf("廣度優(yōu)先序列生成樹:"); printf("\n"); BFS(G, a); printf("\n"); ??? DestroyAdj(G);???????????????? //銷毀鄰接表 ??? return 1; } ? 五、實(shí)驗(yàn)結(jié)果及分析 從3出發(fā),分別進(jìn)行深度優(yōu)先生成樹和廣度優(yōu)先生成樹。 | ||||||||
| 從0出發(fā),分別進(jìn)行深度優(yōu)先生成樹和廣度優(yōu)先生成樹。 ? | ||||||||
總結(jié)
以上是生活随笔為你收集整理的数据结构实验三 树的遍历生成树的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: phpStorm解释器与服务器配置(解决
- 下一篇: 计算机综合能力知识,通信工程师中级综合能