資料結構C++語言實現——圖
圖
圖的基本概念
圖是資料結構G=(V,E)
V(G)是G中結點的有限非空集合
E(G)是G中邊的有限集合
若圖中代表一條邊的偶對是有序的,則稱為有向圖,<u,v
>u稱為該邊的始點(尾)
,v稱為邊的終點(頭)。有向邊也稱為弧。
如果邊(u,u)或者<u,u
>被允許稱為自迴路。
如果兩頂點間允許有多條相同邊的圖,稱為多重圖。
如果一個圖有最多的邊稱為完全圖。
子圖:G=(V’,E’)其中V’(G)是V(G),E’(G)是E(G)子集。
路徑:是一個頂點序列,其中一個迴路是一條簡單路徑。
一個無向圖中,若兩個頂點之間存在一條路徑,則稱兩個頂點之間連通
一個有向圖中,任意一對頂點,存在一個頂點到另一個頂點的路徑,並且同時存在另一個頂點到這個頂點的路徑,則稱此圖是強連通圖。
無向連通圖的生成樹是一個極小連通子圖,它包括圖中全部頂點,但只有足以構成一棵樹的n-1條邊。
圖ADT
//ADT Graph{
資料:
頂點的非空集合V和邊的集合E,每條邊由V中頂點的偶對<u,v>表示
運算:
Create():構造一個不包含任何邊的有向圖
Destroy():撤銷一個有向圖
Exist(u,v):如果圖中存在邊<u,v>,則函式返回true ,否則返回false
Insert(u,v,w):向圖中新增權為w的邊<u,v>,若插入成功,則函式返回Success;若圖中已存在邊<u,v>,則函式返回Duplicate;其他情況函式返回Failure
Remove(u,v):從圖中刪除邊<u,v>,若圖中不存在邊<u,v>,則返回NotPresent;若圖中已存在邊<u,v>,則從圖中刪除此邊,函式返回Success;其他情況函式返回Failure.
Vertices():函式返回圖中頂點數目
//Graph 類
template<class T>
class Graph
{
public:
Virtual ResultCode Insert(int u,int v,T& w)=0;
Virtual ResultCode Remove(int u,int v)=0;
Virtual bool Exist(int u,int v)const=0;
Virtual int Vertices()const{return n;}
protected:
int n,e;
};
圖的儲存結構
圖的矩陣表示法
鄰接矩陣
是表示圖中頂點之間相鄰關係的矩陣,一個有n個頂點的圖G=(V,E)的鄰接矩陣是一個n*n的矩陣A。
如果G是無向圖,那麼A中元素定義
A[u][v]=1 如果(u,v)屬於集合E(G)
A[u][v]=0 其他
如果G是有向圖,那麼A中元素定義如下
A[u][v]=1 如果<u,v
>屬於集合E(G)
A[u][v]=0 其他
關聯矩陣
有向圖G(V,E)的關聯矩陣定義如下n*m階矩陣
A[v][j]=1 頂點v是弧j的起點
A[v][j]=-1 頂點v是弧j的終點
A[v][j]=0 頂點v與弧j不相關聯
鄰接矩陣的實現
鄰接矩陣有兩種,不帶權圖和網的鄰接矩陣。可以用一個三元組(u,v,w)代表一條邊,u和v是邊的兩個頂點,w表示頂點u和v的下列關係。
1。a[u][u]=0:兩種鄰接矩陣的主對角線元素都是0;
2。a[u][v]=w:若邊<u,v
>屬於集合E,則w=1(不帶權圖)或w=w(i,j)(網);若邊<u,v
>不屬於E則w=noEdge,noEdge=0(不帶權圖)或noEdge=無窮(網)
- 鄰接矩陣類
//MGraph類
template<class T>
class MGraph:public Graph<T>
{
public:
MGraph(int mSize,const T& noedg);
~MGraph();
ResultCode Insert(int u,int v,T& w);
ResultCode Remove(int u,int v);
bool Exist(int u,int v)const;
.
.
.
protected:
T**a;
T noEdge;
};
- 建構函式和解構函式
//
template<class T>
MGraph<T>::MGraph(int mSize,const T& noedg)
{
n=mSize;
e=0;//邊數為0
noEdge=noedg;
a=new T*[n];
//建立有n個結點但是無邊的圖
for(int i = 0;i<n;i++){
a[i] = new T [n];
for(int j=0;j<n;j++) a[i][j]=noEdge;
a[i][i]=0 //對角線上元素為0
}
}
template<class T>
MGraph<T>::~MGraph()
{
for(int i=0;i<n;i++) delete []a[i];
delete []a;
}
- 邊的搜尋,插入和刪除
template<class T>
bool MGraph<T>::Exist(int u,int v) //搜尋邊
{
if(u<0||v<0||u>n-1||v>n-1||u==v||a[u][v]=noEdge)
return false;
return true;
}
ResultCode MGraph<T>::Insert(int u,int v,T& w)
{
if(u<0||v<0||u>n-1||u==v) return Failure;
if(a[u][v]!=noEdge) return Duplicate;
a[u][v]=w;e++;return Success;
}
ResultCode MGraph<T>::Remove(int u,int v)
{
if(u<0||v<0||u>n-1||u==v,return Failure;
if(a[u][v]==noEdge) return NotPresent;
a[u][v] = noEdge;
e--;
return Success;
}
圖的鄰接表 表示方式
鄰接表是圖的另一種有效的儲存方法,在為圖中的每個頂點u建立一個單鏈表,連結串列中每個結點代表一條邊<u,v
>稱為邊結點。
每個單鏈表相當於鄰接矩陣的一行。
每個單鏈表可設立一個存放頂點u有關資訊,稱為頂點結點。
//ENode類
struct ENode
{
ENode(){nextArc=NULL;}
ENode(int vertex,T weight,ENode* next)
{
adjVex=vertex;
w=weight;
nextArc=next;
}
int adjVex;
T w;
ENode* nextArc;
};
//LGraph類
template <class T>
class LGraph:public Graph<T>
{
public:
LGraph(int mSize);
~LGraph();
ResultCode Insert(int u,int v,T& w);
ResultCode Remove(int u,int v);
bool Exist(int u,int v) const;
.
.
.
protected:
ENode<T>** a;
};
//建構函式和解構函式
template<class T>
LGraph<T >::LGraph(int mSize)
{
n=mSize;e=0;
a=new ENode<T>*[n];
for(int i=0;i<n;i++) a[i]=NULL;
}
LGraph<T >::~LGraph()
{
ENode<T>* p,*q;
for(int i=0;i<n;i++){
p=a[i];
q=p;
while(p){
p=p->nextArc;
delete q;
q=p;
}
}
delete[] a;
}
//邊的搜尋
template<class T>
bool LGraph<T >::Exist(int u,int v)const
{
if(u>0||v<0||u>n-1||u==v) return false;
ENode<T>* p=a[u];
while(p&& p->adjVex!=v) p=p->nextArc;
if(!p) return false;
else return true;
}
//邊的插入
template<class T>
ResultCode LGraph<T>::Insert(int u,int v,T& w)
{
if(u<0||v<0||u>n-1||u==v) return Failure;
if(Exist (u,v)) return Duplicate;
ENode<T>* p=new ENode<T>(v,w,a[u]);
a[u]=p;
e++;
return Success;
}
//邊的刪除
template<class T>
ResultCode LGraph<T>::Remove(int u,int v)
{
if(u<0||v<0||u>n-1||u==v) return Failure;
ENode<T>* p=a[u],*q=NULL;
while (p&&p->adjVex!=v){
q=p;
p=p->nexArc;
}
if(!p) return NotPresent;
if(q) q->nexArc=p->nextArc;
else a[u]=p->nextArc;
delete p;
e--;
return Success;
}
相關推薦
資料結構C++語言實現——圖
圖 圖的基本概念 圖是資料結構G=(V,E) V(G)是G中結點的有限非空集合 E(G)是G中邊的有限集合 若圖中代表一條邊的偶對是有序的,則稱為有向圖,<u,v>u稱為該邊的始點(尾) ,v稱為邊的終點(頭)。有向邊也稱為弧。
資料結構-C語言實現順序表
#include<stdio.h> #include<stdlib.h> #define ERROR 0 #define LIST_INIT_SIZE 100 #define LISTINCREAMENT 10 #define OK 1
資料結構-C語言實現線性棧
#include<stdio.h> #include<stdlib.h> #define STACK_INIT_SIZE 100//儲存空間初始化分配量 #define STACKINCREAMENT 10//儲存空間分配增量 #defi
資料結構-C語言實現迴圈佇列
#include<stdio.h> #include<stdlib.h> #define MAXSIZE 100 #define OK 1 #define OVERFLOW -1 typedef struct{ int *base;
資料結構C語言實現-2—線性表
Table of Contents 靜態連結串列 線性表順序儲存結構 #include <stdio.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #de
資料結構-c語言實現連結串列的建立,增刪,翻轉
很經典的課題了,這裡直接給出源程式: #include <stdio.h> #include <stdlib.h> #define LIST_MAX_LEN 10 typedef int ElementType; typedef int BOOL; #define TR
資料結構 c語言實現順序佇列(輸數字入隊,字元出隊)
一.標頭檔案seqqueue.h實現 #ifndef __SEQQUEUE_H__ #define __SEQQUEUE_H__ #include<stdio.h> #include<stdlib.h> #include<stdbool.h&g
嚴蔚敏資料結構C語言實現棧的基本操作
int main(){ SqStack S; SElemType *e; int n,i; InitStack(&S); printf("請輸入需要入棧的資料個數\n"); scanf("%d",&n); for(i=0;i<n;i++) { sca
0x00資料結構——C語言實現(棧+字尾表示式計算)
0x00資料結構——C語言實現(棧) 棧的實現 /* 棧(tack)是限制插入和刪除只能在一個位置上進行的表,該位置是表的末端,叫做棧的頂(top)。 對棧的基本操作有Push(進棧)和Pop(出棧)。 Functions: (在連結串列中增加
資料結構 C語言實現直接插入排序
一、直接插入排序簡介 每次從無序表中取出第一個元素,把它插入到有序表的合適位置,使有序表仍然有序。 第一趟比較前兩個數,然後把第二個數按大小插入到有序表中; 第二趟把第三個資料與前兩個數從前向後掃描,把第三個數按大小插入到有序表中;依次進行下去,進行了(
資料結構C語言實現——順序線性表SqList
delcaration.h #ifndef DECLARATION_H_INCLUDED #define DECLARATION_H_INCLUDED #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0
資料結構C語言實現之鏈式佇列的6種演算法程式碼
#include <stdio.h>#include <stdlib.h>typedef int elemType;/************************************************************************//* 以下是關於佇列連
[資料結構]c語言實現鏈棧的入棧,出棧,清空,銷燬等操作
最近在學習資料結構中的棧,於是在此記錄一下棧鏈式結構的抽象資料型別 /* 棧的抽象資料型別 ADT 棧(stack) Data 同線性表。元素具有相同的型別,相鄰元素具有前驅和後繼關係 Operation InitStack(*S):初始化
資料結構--C語言--圖的深度優先遍歷,廣度優先遍歷,拓撲排序,用prime演算法實現最小生成樹,用迪傑斯特拉演算法實現關鍵路徑和關鍵活動的求解,最短路徑
實驗七 圖的深度優先遍歷(選做,驗證性實驗,4學時) 實驗目的 熟悉圖的陣列表示法和鄰接表儲存結構,掌握構造有向圖、無向圖的演算法 ,在掌握以上知識的基礎上,熟悉圖的深度優先遍歷演算法,並實現。 實驗內容 (1)圖的陣列表示法定義及
【資料結構】資料結構C語言的實現【圖(鄰接表法)】
圖(鄰接表法) /* * 鄰接表的建立和圖的遍歷的程式碼實現 */ #include <stdio.h> #include <stdlib.h> #define TRUE 1 #define FALSE 0 #define O
資料結構c語言版 嚴蔚敏 順序線性表12個基本操作及演算法的實現
標頭檔案: c1.h (相關標頭檔案及函式結果狀態程式碼集合) /* c1.h (程式名) */ #include<string.h> #include<ctype.h> #include<malloc.h> /
資料結構線性表順序結構c語言實現程式碼
#include<stdio.h> #include<stdlib.h> typedef int ElementType; typedef struct LNode * PtrToLNode; struct LNode{ ElementType D
【資料結構】棧的順序儲存結構 C語言實現
棧(stack),是一種線性儲存結構,它有以下幾個特點: 棧中資料是按照"後進先出(LIFO, Last In First Out)"方式進出棧的。 向棧中新增/刪除資料時,只能從棧頂進行操作。 基本操作 initStack(&S) destroySt
資料結構--C語言--查詢演算法的實現--順序表的查詢
1.實驗目的 熟練掌握順序表和有序表的查詢方法,掌握其時間複雜度的分析方法 2.實驗內容 (1)驗證並設計順序表的查詢(順序查詢、折半查詢)演算法 (2)驗證二叉排序樹上的查詢(建立、查詢、插入)演算法 (3)驗證Hash表查詢(Hash函式定義、建立,查詢,插
C語言實現圖的鄰接矩陣儲存結構及深度優先遍歷和廣度優先遍歷
DFS的核心思想在於對訪問的鄰接節點進行遞迴呼叫;BFS的核心思想在於建立了一個鄰接節點的佇列。 在Dev C++中除錯執行通過。 用下圖進行了測試。 #include <stdio.h> #define MaxVertexNum 50 #defin