數據結構實驗8.1:圖的基本操作

文章目錄

  • 一,實驗目的
  • 二,實驗內容
  • 三,實驗要求
  • 四,算法分析
  • 五,示例代碼
    • 8-1.cpp源碼
    • graph.h源碼
  • 六,操作步驟
  • 七,運行結果


一,實驗目的

1.掌握圖的鄰接矩陣、鄰接表的表示方法及建立算法;
2.掌握圖的深度優先遍歷、廣度優先遍歷等基本操作的算法;
3.掌握圖的最小生成樹、關鍵路徑等應用問題的求解算法;
4.進一步加深對圖的幾種基本應用算法的理解,逐步培養解決實際問題的編程能力。

二,實驗內容

已知無向連通圖G如下圖所示。完成圖的下列基本操作:
(1)建立圖的鄰接矩陣,輸出鄰接矩陣;
(2)建立圖的鄰接表,輸出鄰接表;
(3)求鄰接表表示的圖的深度優先遍歷序列;
(4)求鄰接矩陣表示的圖的深度優先遍歷序列;
(5)求鄰接表表示的圖的廣度優先遍歷序列;
(6)求鄰接矩陣表示的圖的廣度優先遍歷序列。
在這里插入圖片描述

三,實驗要求

(1)建立頭文件graph.h,其中定義了圖的鄰接矩陣和鄰接表表示的存儲結構,本實驗的其它實驗題目也可共享使用,其代碼如下:

#define MAXV 30      			// 最大頂點數
typedef int InfoType;
//以下定義圖的鄰接矩陣數據結構
typedef struct {					//定義圖的頂點結構int no;						//頂點編號InfoType info;					//頂點其它信息,可用于
} VertexType;
typedef struct {					//定義圖鄰接矩陣VertexType vexs[MAXV];		//頂點向量int arcs[MAXV][MAXV];		//鄰接矩陣int vexnum, arcnum;			//圖的當前頂點數和邊數
} MGraph;
//以下定義圖的鄰接表數據結構
typedef struct ArcNode {			//定義表結點類型int  adjvex;					//頂點序號int  weight;					//邊或弧的權值struct ArcNode *nextarc;		//指向下一個表結點的指針
} ArcNode;
typedef struct VNode {				//定義頭結點類型VertexType data;ArcNode *firstarc;
} VNode
//typedef  VNode  AdjList[MAXV];	//定義頭結點數組
typedef struct {					//定義圖的鄰接表類型VNode  vertices[MAXV];int  vexnum, arcnum;
} LGraph;

(2)完善參考程序,在程序中的下劃線處填寫適當的語句。
(3)設計測試數據,調試、測試完善后的參考程序,保存和打印測試結果,對結果進行分析。

四,算法分析

(1)深度優先搜索遍歷算法
從圖中某頂點v出發:
① 訪問頂點v;
② 依次從v的未被訪問的鄰接點出發,對圖進行深度優先遍歷;直至圖中和v有路徑相通的頂點都被訪問;
③ 若此時圖中尚有頂點未被訪問,則從一個未被訪問的頂點出發,重新進行深度優先遍歷,直到圖中所有頂點均被訪問過為止。

(2)廣度優先搜索遍歷算法
從圖中某頂點vi出發:
① 訪問頂點vi ;
② 訪問vi 的所有未被訪問的鄰接點w1 ,w2 , …wk ;
③ 依次從這些鄰接點(在步驟②中訪問的頂點)出發,訪問它們的所有未被訪問的鄰接點; 依此類推,直到圖中所有訪問過的頂點的鄰接點都被訪問;
④ 若此時圖中尚有頂點未被訪問,則從一個未被訪問的頂點出發,重新進行廣度優先搜索遍歷,直到圖中所有頂點均被訪問過為止。
為實現③,需要保存在步驟②中訪問的頂點,而且訪問這些頂點的鄰接點的順序為:先保存的頂點,其鄰接點先被訪問。

五,示例代碼

8-1.cpp源碼

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include "graph.h"// 訪問標志數組
int visited[MAXV];
// 廣度優先遍歷存儲隊列
int queue[MAXV];// 建立圖的鄰接矩陣
void CreatMG(MGraph& mg) {int i, j;int A[7][7];mg.vexnum = 7;mg.arcnum = 9;for (i = 0; i < mg.vexnum; i++) {for (j = 0; j < mg.vexnum; j++) {A[i][j] = 0;}}A[0][1] = A[0][2] = A[0][6] = 1;A[1][3] = 1;A[2][3] = A[2][5] = A[2][6] = 1;A[3][4] = 1;A[5][6] = 1;for (i = 1; i < mg.vexnum; i++) {for (j = 0; j < i; j++) {A[i][j] = A[j][i];}}for (i = 0; i < mg.vexnum; i++) {for (j = 0; j < mg.vexnum; j++) {mg.arcs[i][j] = A[i][j];}}
}// 由圖的鄰接矩陣創建圖的鄰接表
void CreatLG(LGraph*& lg, MGraph mg) {int i, j;ArcNode* p;lg = (LGraph*)malloc(sizeof(LGraph));for (i = 0; i < mg.vexnum; i++) {lg->vertices[i].firstarc = NULL;}for (i = 0; i < mg.vexnum; i++) {for (j = mg.vexnum - 1; j >= 0; j--) {if (mg.arcs[i][j] != 0) {p = (ArcNode*)malloc(sizeof(ArcNode));p->adjvex = j;p->weight = mg.arcs[i][j];p->nextarc = lg->vertices[i].firstarc;lg->vertices[i].firstarc = p;}}}lg->vexnum = mg.vexnum;lg->arcnum = mg.arcnum;
}// 輸出圖的鄰接矩陣
void OutputMG(MGraph mg) {int i, j;for (i = 0; i < mg.vexnum; i++) {for (j = 0; j < mg.vexnum; j++) {printf("%3d", mg.arcs[i][j]);}printf("\n");}
}// 輸出圖的鄰接表
void OutputLG(LGraph* lg) {int i;ArcNode* p;for (i = 0; i < lg->vexnum; i++) {p = lg->vertices[i].firstarc;if (p) {printf("%3d:", i);}while (p) {printf("%3d", p->adjvex);p = p->nextarc;}printf("\n");}
}// 鄰接表表示的圖的遞歸深度優先遍歷
void LDFS(LGraph* lg, int i) {ArcNode* p;printf("%3d", i);visited[i] = 1;p = lg->vertices[i].firstarc;while (p) {if (visited[p->adjvex] == 0) {LDFS(lg, p->adjvex);}p = p->nextarc;}
}// 鄰接矩陣表示的圖的遞歸深度優先遍歷
void MDFS(MGraph mg, int i) {int j;printf("%3d", i);visited[i] = 1;for (j = 0; j < mg.vexnum; j++) {if (mg.arcs[i][j] != 0 && visited[j] == 0) {MDFS(mg, j);}}
}// 鄰接表表示的圖的廣度優先遍歷
void LBFS(LGraph* lg, int s) {int i, v, w, front, rear;ArcNode* p;for (i = 0; i < lg->vexnum; i++) {visited[i] = 0;}front = rear = 0;printf("%3d", s);visited[s] = 1;queue[rear++] = s;while (front < rear) {v = queue[front++];for (p = lg->vertices[v].firstarc; p != NULL; p = p->nextarc) {w = p->adjvex;if (visited[w] == 0) {printf("%3d", w);visited[w] = 1;queue[rear++] = w;}}}
}// 鄰接矩陣表示的圖的廣度優先遍歷
void MBFS(MGraph mg, int s) {int i, j, v, front, rear;for (i = 0; i < mg.vexnum; i++) {visited[i] = 0;}front = rear = 0;printf("%3d", s);visited[s] = 1;queue[rear++] = s;while (front < rear) {v = queue[front++];for (i = 0; i < mg.vexnum; i++) {for (j = 0; j < mg.vexnum; j++) {if (mg.arcs[v][j] != 0 && visited[j] == 0) {printf("%3d", j);visited[j] = 1;queue[rear++] = j;}}}}
}int main() {LGraph* lg;MGraph mg;int i;CreatMG(mg);CreatLG(lg, mg);printf("(1)當前圖的鄰接矩陣是:\n");OutputMG(mg);printf("(2)當前圖的鄰接表是:\n");OutputLG(lg);for (i = 0; i < mg.vexnum; i++) {visited[i] = 0;}getchar();printf("(3)鄰接表表示的圖的深度優先遍歷序列是:");LDFS(lg, 0);getchar();for (i = 0; i < mg.vexnum; i++) {visited[i] = 0;}printf("(4)鄰接矩陣表示的圖的深度優先遍歷序列是:");MDFS(mg, 0);getchar();printf("(5)鄰接表表示的圖的廣度優先遍歷序列是:");LBFS(lg, 0);getchar();printf("(6)鄰接矩陣表示的圖的廣度優先遍歷序列是:");MBFS(mg, 0);printf("\n");return 0;
}

graph.h源碼

#pragma once
#ifndef GRAPH_H
#define GRAPH_H// 定義圖的最大頂點數
const int MAXV = 100;// 定義弧節點結構體
typedef struct ArcNode {int adjvex;int weight;struct ArcNode* nextarc;
} ArcNode;// 定義頂點結構體
typedef struct VNode {ArcNode* firstarc;
} VNode;// 定義鄰接表結構體
typedef struct {VNode vertices[MAXV];int vexnum, arcnum;
} LGraph;// 定義鄰接矩陣結構體
typedef struct {int arcs[MAXV][MAXV];int vexnum, arcnum;
} MGraph;#endif    

六,操作步驟

1,雙擊Visual Studio程序快捷圖標,啟動程序。
在這里插入圖片描述

2,之前創建過項目的話,直接打開即可,這里選擇【創建新項目】。
在這里插入圖片描述

3,單擊選擇【空項目】——單擊【下一步】按鈕。
在這里插入圖片描述

4,編輯好項目的名稱和存放路徑,然后單擊【創建】按鈕。
在這里插入圖片描述

5,創建C++程序文件,右擊【源文件】——選擇【添加】——【新建項】。
在這里插入圖片描述
6,輸入項目名稱8-1.cpp,單擊【添加】按鈕。
在這里插入圖片描述

7,輸入項目名稱graph.h,單擊【添加】按鈕,此文件要定義 MGraph、LGraph、ArcNode 等類型,同時定義 MAXV 常量。
在這里插入圖片描述

8,編寫代碼,單擊運行按鈕,運行程序。
在這里插入圖片描述

七,運行結果

1,實驗要求的測試結構。
在這里插入圖片描述

2,編寫代碼運行后的結果。
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/904403.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/904403.shtml
英文地址,請注明出處:http://en.pswp.cn/news/904403.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring Boot3 實現定時任務 每10分鐘執行一次,同時要解決分布式的問題 區分不同場景

在Spring Boot 3中實現分布式定時任務&#xff0c;確保多實例環境下任務僅執行一次&#xff0c;可以采用以下方案&#xff1a; 方案一&#xff1a;Redis分布式鎖&#xff08;推薦&#xff09; import org.springframework.data.redis.core.StringRedisTemplate; import org.sp…

WPF MVVM入門系列教程(五、命令和用戶輸入)

&#x1f9ed; WPF MVVM入門系列教程 一、MVVM模式介紹二、依賴屬性三、數據綁定四、ViewModel五、命令和用戶輸入六、ViewModel案例演示 WPF中的命令模型 在WPF中&#xff0c;我們可以使用事件來響應鼠標和鍵盤動作。 但使用事件會具備一定的局限性&#xff0c;例如&#x…

2025年01月09日德美醫療前端面試

目錄 vue2 的雙向綁定的原理vue3 的雙向綁定原理vue 的生命周期vue 子組件為何不能修改父組件的值js delete 刪除數組的某一個值會怎么樣vue 和 react 的 diff 算法什么是閉包原型鏈this指向 vue2 的雙向綁定的原理 以下是 Vue 2 雙向綁定的原理&#xff1a; 1. 核心概念 …

知識圖譜 + 大語言模型:打造更聰明、更可靠的AI大腦 —— 探索 GraphRAG 中文優化與可視化實踐

大語言模型&#xff08;LLMs&#xff09;無疑是近年來人工智能領域最耀眼的明星。它們強大的自然語言理解和生成能力&#xff0c;在文本創作、代碼生成、對話交互等眾多領域展現了驚人的潛力。然而&#xff0c;當前的 LLMs 并非完美無缺&#xff0c;它們常常面臨著“幻覺”&…

【uniapp】在UniApp中檢測手機是否安裝了某個應用

1. 使用plus.runtime.isApplicationExist&#xff08;僅限App端&#xff09; // 判斷應用是否安裝 function checkAppInstalled(packageName) {if (uni.getSystemInfoSync().platform android || uni.getSystemInfoSync().platform ios) {// 僅App端可用if (typeof plus ! u…

使用 Vue + Axios 構建與后端交互的高效接口調用方案

使用 Vue Axios 構建與后端交互的高效接口調用方案 在 Vue 前端開發中&#xff0c;與后端接口的數據交互是非常核心的部分。而 Axios 是 Vue 項目中最常用的 HTTP 客戶端&#xff0c;具備基于 Promise、攔截器、自定義實例等諸多優勢。 本篇將深入介紹如何基于 Vue 搭配 Axi…

RN學習筆記 ?

太無聊了最近&#xff0c;找點事做&#xff0c;學一下RN豐富一下技術棧&#x1fae1;。但是開發APP除了RN&#xff0c;還有一種選擇就是WebView&#xff0c;但是基于WebView的APP的性能被普遍認為不如RN&#xff0c;因為WebView本質上是一個容器&#xff0c;用于在應用中嵌入網…

聊天助手提示詞調優案例

一、背景 今天有粉絲說自己的聊天助手提示詞輸出的效果不好&#xff0c;輸出的內容不是太呆板就是太浮夸&#xff0c;希望更像真人一樣。 本文介紹幾個調優方法&#xff0c;希望對大家有啟發。 二、調優 《系統掌握大語言模型提示詞 - 從理論到實踐》提示詞小冊中介紹了很多…

5.6 react組件化開發基礎

react 組件開發基礎 組件分類與組件使用 組件傳參 父傳子 【函數數據傳值 實參 形參對應關系】 子傳父 插槽 透傳 useContext 上下文&#xff08;作用域&#xff09; 跨層級調用方法 通過子組件的實例對象useRef 直接調用子組件的方法 和數據 狀態管理&#xff08;非常多…

【SF順豐】順豐開放平臺API對接(Java對接篇)

對接前置篇&#xff1a; 【SF順豐】順豐開放平臺API對接&#xff08;注冊、API測試篇&#xff09;_順豐api接口對接指南-CSDN博客 1.實現效果展示 2.SF順豐開放平臺&#xff0c;JDK資源下載。 下載地址&#xff1a;順豐開放平臺 3.將下載的JDK放入項目中。 4.將JDK資源引入p…

我用cursor 搭建了臨時郵箱服務-Temp Mail 365

用業余時間搭建了一個臨時郵箱&#xff0c;對于后端程序員出身的我&#xff0c;對前端了解的不太多&#xff0c;有了cursor的幫助&#xff0c;補齊了自己的短板&#xff0c;搭建了這個服務&#xff0c;下面對臨時郵箱架構設計與安全性做一個分析。 https://temp-mail-365.com 臨…

破解工業3D可視化困局,HOOPS Visualize助力高效跨平臺協作與交互!

一、當前3D可視化面臨的痛點 &#xff08;1&#xff09;性能瓶頸 現有的許多3D可視化工具在處理大型復雜模型時往往力不從心。例如在航空航天、汽車制造等高端制造業&#xff0c;動輒涉及數以億計的三角面片和海量的紋理細節。這些超大規模的模型在渲染時常常出現卡頓、延遲&…

1、Kafka與消息隊列核心原理詳解

消息隊列&#xff08;Message Queue, MQ&#xff09;作為現代分布式系統的基礎組件&#xff0c;極大提升了系統的解耦、異步處理和削峰能力。本文以Kafka為例&#xff0c;系統梳理消息隊列的核心原理、架構細節及實際應用。 Kafka 基礎架構及術語關系圖 術語簡要說明 Produce…

2025年北京市職工職業技能大賽第六屆信息通信行業網絡安全技能大賽初賽-wp

- -考試當場沒做出來 后面做的 misc ? cd misc ? ls num.docx num.zip ? unzip num.docx Archive: num.docxinflating: [Content_Types].xmlinflating: _rels/.relsinflating: word/document.xmlinflating: word/_rels/document.xml.relsextracting: word/media/image1.jp…

JavaScript 到命令和控制 (C2) 服務器惡意軟件分析及防御

攻擊始于一個經過混淆的JavaScript文件,該文件從開源服務中獲取編碼字符串以執行PowerShell腳本。然后,該腳本從一個IP地址和一個URL縮短器下載一個JPG圖像和一個文本文件,這兩個文件都包含使用隱寫術嵌入的惡意MZ DOS可執行文件。這些有效載荷一旦執行,就會部署Stealer惡意…

【計網】ipconfig、ping、arp、tracert

目錄 ipconfig ping arp tracert cmd ipconfig ipcofig -all IPv4 物理地址 ping 檢測網絡連通情況&#xff0c;分析網絡速度 根據域名得到服務器IP 根據TTL判斷對方所使用的操作系統以及數據包經過路由器數量 byte數據包大小 time響應時間 TTLDNS記錄在DNS服務器上存在…

WiFi那些事兒(八)——802.11n

目錄 802.11n 技術簡介與測試項 一、802.11n 技術簡介 &#xff08;一&#xff09;標準概述 &#xff08;二&#xff09;關鍵技術特性 1. MIMO&#xff08;多輸入多輸出&#xff09;技術 2. 信道綁定&#xff08;Channel Bonding&#xff09; 3. 幀聚合&#xff08;Fram…

碼蹄集——直角坐標到極坐標的轉換、射線、線段

目錄 MT1052 直角坐標到極坐標的轉換 MT1066 射線 MT1067 線段 MT1052 直角坐標到極坐標的轉換 思路&#xff1a; arctan()在c中是atan()&#xff0c;結果是弧度要轉換為度&#xff0c;即乘與180/PI 拓展&#xff1a;cos()、sin()在c代碼中表示方式不變 #include<bits/…

深入解析 Linux/Unix 通信機制:從原理到觀測實踐

深入解析 Linux/Unix 通信機制&#xff1a;從原理到觀測實踐 配圖建議&#xff1a;Linux系統架構與通信機制全景示意圖 一、開篇&#xff1a;理解“一切皆文件”的哲學 Unix/Linux 操作系統的核心靈魂在于其獨特的設計哲學。當 Dennis Ritchie 和 Ken Thompson 在貝爾實驗室開…

spring上傳文件添加水印

1、實現 MultipartFile package com.pojo.common.core.domain;import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; import java.io.InputStream;import org.springframework.lang.Nullable; import org.springframework.util.Assert; im…