日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

数据结构实验三 树的遍历生成树

發(fā)布時(shí)間:2023/12/10 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构实验三 树的遍历生成树 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

廣州大學(xué)學(xué)生實(shí)驗(yàn)報(bào)告

?

開(kāi)課實(shí)驗(yàn)室:計(jì)算機(jī)科學(xué)與工程實(shí)驗(yàn)(電子樓418A) ????2019年4月19日

學(xué)院

計(jì)算機(jī)科學(xué)與教育軟件學(xué)院

年級(jí)、專(zhuān)業(yè)、班

計(jì)算機(jī)科學(xué)與技術(shù)

姓名

?

學(xué)號(hào)

?

實(shí)驗(yàn)課程名稱(chēng)

數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)

成績(jī)

?

實(shí)驗(yàn)項(xiàng)目名稱(chēng)

實(shí)驗(yàn)三 樹(shù)的的遍歷生成樹(shù)

指導(dǎo)老師

一、實(shí)驗(yàn)?zāi)康?/strong>

1、把圖轉(zhuǎn)化為程序能識(shí)別的鄰接矩陣;

2、理解圖的遍歷方法及對(duì)應(yīng)的生成樹(shù)。

二、使用儀器、器材

微機(jī)一臺(tái)

操作系統(tǒng):Win10

編程軟件:C++

三、實(shí)驗(yàn)內(nèi)容及原理

1.圖的輸入:鄰接矩陣直接寫(xiě)入源程序,或鍵盤(pán)輸入,或讀入數(shù)據(jù)文件

起始結(jié)點(diǎn)的輸入:運(yùn)行時(shí)由鍵盤(pán)輸入

輸出:生成樹(shù)的邊,用結(jié)點(diǎn)的序偶表示,

?

  • 實(shí)驗(yàn)過(guò)程原始數(shù)據(jù)記錄

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);//銷(xiāo)毀鄰接表

void DFS(AdjGraph* G, int v);//深度優(yōu)先遍歷生成樹(shù)

?

//---------------------------------------------------------

//--廣度優(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)先遍歷生成樹(shù)

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)先序列(遞歸)生成樹(shù):"); printf("\n"); DFS(G, a); printf("\n");

??? printf("廣度優(yōu)先序列生成樹(shù):"); printf("\n"); BFS(G, a); printf("\n");

??? DestroyAdj(G);???????????????? //銷(xiāo)毀鄰接表

??? return 1;

}

?

五、實(shí)驗(yàn)結(jié)果及分析

從3出發(fā),分別進(jìn)行深度優(yōu)先生成樹(shù)和廣度優(yōu)先生成樹(shù)。

從0出發(fā),分別進(jìn)行深度優(yōu)先生成樹(shù)和廣度優(yōu)先生成樹(shù)。

?

總結(jié)

以上是生活随笔為你收集整理的数据结构实验三 树的遍历生成树的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。