1. 程式人生 > >資料結構C++語言實現——圖

資料結構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