图的邻接表的类实现

const int DefaultVertices = 30;
template<class T,class E>
struct Edge{
    int dest;  //边结点定义
    Edge<T,E> *link;   //下一条边链指针
    Edge(){}
    Edge(int num,E weight):dest(num),link(NULL) {}
    bool operator!=(Edge<T,E>& R)const{
    return (dest!= R.deat)? true :false;
    }
};

template<class T,class E>
struct Vertex{
    T data;   //顶点名字
    Edge<T,E> *adj;   //边链表的头指针
};
template <class T,class E>
class Graphlnk  //注意这里没用继承
{   public:
      Graphlnk(int sz=DefaultVertices);
      ~Graphlnk();
       T getValue(int i) {  return (i>=0 &&i<numVertices)?NodeTable[i].data : 0;  }
       int getVnum() { return numVertices; }
       int getEnum() { return numEdges; }
       bool insertVertex (const T& vertex);
       bool insertEdge (int v1, int v2);
       int getFirstNeighbor (int v);
       int getNextNeighbor (int v, int w);
       void input();
       void output();
        int getVertexPos (T& vertex)    //给出顶点vertex在图中的位置
        {       for (int i=0; i <numVertices; i++)
            if (NodeTable[i].data == vertex) return i;
         return -1;
         }
   private:
        int maxVertices,numVertices,numEdges;    //必须加上这3个数据成员,分别为当前最大顶点数,当前顶点数,当前边数
        Vertex<T, E> *NodeTable;             //顶点表 (各边链表的头结点)
};

 template <class T, class E>
void Graphlnk<T, E>::input()
{  int i,j,k,vn,en;      //vn表示顶点数,en表示边数
   T v1,v2;
   cout<<"输入顶点数和边数:\n";
   cin>>vn>>en;
   for(i=0;i<vn;i++)
   {   cin>>v1;
       insertVertex(v1);   }
   i=0;
   while(i<en)
   {     cout<<"输入边的两个顶点:";
         cin>>v1>>v2;
         j=getVertexPos(v1);
         k=getVertexPos(v2);
        if(j==-1 || k==-1)
            cout<<"重新输入边的两个顶点信息!"<<endl;
       else
              {  insertEdge(j,k);
          i++;
    }
   }
}

template <class T, class E>
void Graphlnk<T, E>::output()
{   int i,vn,en;
    Edge<T,E> *p;
    vn=numVertices;   en=numEdges;
   cout<<endl<<"图的顶点数="<<vn<<"边数="<<en<<endl<<endl;
    for(i=0;i<vn;i++)
   {   cout<<i<<": "<<NodeTable[i].data;
       p=NodeTable[i].adj;
      while(p!=NULL)
         {   cout<<"-->"<<p->dest;    p=p->link;        }
       cout<<endl;
   }
}

template<class T,class E>
Graphlnk<T,E>::Graphlnk(int sz){
    maxVertices = sz;
    numVertices = 0;
    numEdges = 0;
    NodeTable = new Vertex<T,E>[maxVertices];  //创建顶点表数组
    if(NodeTable == NULL){
        cout << "存储分配错误!" << endl;exit(1);
    }
    for(int i = 0;i < maxVertices;i++)NodeTable[i].adj = NULL;
}

template<class T,class E>
Graphlnk<T,E>::~Graphlnk(){
    for(int i =0;i<numVertices;i++){
        Edge<T,E> *p = NodeTable[i].adj;
        while(p != NULL){
            NodeTable[i].adj = p->link;
            delete p ;
            p = NodeTable[i].adj;
        }
    }
    delete[] NodeTable;  // 删除顶点表数组
}

template<class T,class E>
int Graphlnk<T,E>::getFirstNeighbor(int v){
    if(v != -1){
        Edge<T,E> *p = NodeTable[v].adj;
        if(p!=NULL)return p->dest;
    }
    return -1;
} 

template<class T,class E>
int Graphlnk<T,E>::getNextNeighbor(int v,int w){
    if(v!=-1){
        Edge<T,E> *p=NodeTable[v].adj;
        while(p!=NULL&&p->dest!=w)
        p = p->link;
        if(p!=NULL&&p->link!=NULL)
        return p->link->dest;
    }
    return -1;
}

template<class T,class E>
bool Graphlnk<T,E>::insertVertex(const T& Vertex){
    if(numVertices == maxVertices)return false;
    NodeTable[numVertices].data = Vertex;
    numVertices++;
    return true;
}

template<class T,class E>
bool Graphlnk<T,E>::insertEdge(int v1,int v2){
    if(v1 >=0 && v1 < numVertices && v2>=0 && v2 < numVertices){
        Edge<T,E> *q, *p = NodeTable[v1].adj;
        while(p!=NULL&& p->dest!=2)
        p = p->link;
        if(p!=NULL) return false;
        p = new Edge<T,E>; q = new Edge<T,E>;
        p->dest = v2;
        p->link = NodeTable[v1].adj;
        NodeTable[v1].adj = p;
        q->dest = v1;
        q->link = NodeTable[v2].adj;
        NodeTable[v2].adj = q;
        numEdges++;
        return true;
    }
} 

template <class T, class E>
/*void BFS(Graphlnk<T,E>& G,T& v)
{
    int  i,w,n=G.getVnum();    //此处需修改,类中没定义该函数
    bool *visited=new bool[n];
    LinkedQueue<int> Q;
    printf("\n广度优先搜索顺序为:\n");
    for(i=0; i<n; i++)
    visited[i]=false;
    int loc = G.getVertexPos(v);
    cout << G.getValue(loc) << " " ;
    visited[loc] = true;
    Q.EnQueue(loc);
    while(!Q.IsEmpty()){
        Q.DeQueue(loc);
        w = G.getFirstNeighbor(loc);
        while(w != -1){
            if(visited[w]==false){
                cout << G.getValue(w)<< " ";
                visited[w] = true;
                Q.EnQueue(w);
            }
            w = G.getNextNeighbor(loc,w);
        }
    }
}*/
时间: 2024-10-10 03:28:30

图的邻接表的类实现的相关文章

图的邻接表表示、广度优先、深度优先搜索

图,就是我们在数据结构中学到的图,它是一种存储信息的结构.图是一类在实际应用中非常常见的数据结构,当数据规模大到一定程度时,如何对其进行高效计算即成为迫切需要解决的问题.最常见的大规模图数据的例子就是互联网网页数据,网页之间通过链接指向形成规模超过500 亿节点的巨型网页图.再如,Facebook 社交网络也是规模巨大的图,仅好友关系已经形成超过10 亿节点.千亿边的巨型图,考虑到Facebook 正在将所有的实体数据节点都构建成网状结构,其最终形成的巨型网络数据规模可以想见其规模.要处理如此规

浅谈数据结构之图的邻接表深度和广度优先遍历(九)

邻接矩阵是一种不错的图存储结构,但是我们发现,对于边数相对较少的图,这种结构是存在对存储空间的极大浪费的.我们知道,顺序存储结构存在预先分配内存可能造成空间浪费的问题,于是引出了链式存储的结构.同样的,我们也可以考虑对边或弧使用链式存储的方式来避免空间浪费的问题.因此,对于图的存储结构,我们同样引入了一种数组与链表相组合的存储方法,我们一般称之为邻接表. 邻接表的处理方法是这样的:(1).图中顶点用一个一维数组存储,当然,顶点也可以用单链表来存储,不过数组可以较容易的读取顶点的信息,更加方便:另

数据结构学习笔记05图 (邻接矩阵 邻接表--&gt;BFS DFS)

数据结构之图 图(Graph) 包含 一组顶点:通常用V (Vertex) 表示顶点集合 一组边:通常用E (Edge) 表示边的集合 边是顶点对:(v, w) ∈E ,其中v, w ∈ V 有向边<v, w> 表示从v指向w的边(单行线) 不考虑重边和自回路 无向图:边是无向边(v, w) 有向图:边是有向边<v, w> 连通:如果从V到W存在一条(无向)路径,则称V和W是连通的 连通图(Connected Graph):如果对于图的任一两个顶点v.w∈V,v和w都是连通的,则称

数据结构之---C语言实现图的邻接表存储表示

// 图的数组(邻接矩阵)存储表示 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_NAME 3 // 顶点字符串的最大长度+1 #define MAX_VERTEX_NUM 20 typedef int InfoType; // 存放网的权值 typedef char VertexType[MAX_NAME]; // 字符串类型 typedef enum{DG, DN, AG

图(邻接表)

我们先来看一个图 我们想将这个图的信息存储到邻接表中,我们需要一个数组保存节点信息,还要有一个节点用来保存与该节点相邻的节点信息. 1 typedef struct arc_node 2 { 3 int pos; 4 int distance; 5 struct arc_node * next; 6 } Arc_node;//保存Node节点的相邻节点信息 7 8 typedef struct node 9 { 10 node_type info; 11 Arc_node * next; 12

数据结构(10) -- 图的邻接表存储

////////////////////////////////////////////////////////// //图的邻接表存储 ////////////////////////////////////////////////////////// #include <iostream> #include <stdlib.h> using namespace std; //图的邻接表表示法 #define MaxVertexNum 100 enum GraphType{DG,

_DataStructure_C_Impl:图的邻接表存储

#include<stdio.h> #include<stdlib.h> #include<string.h> //图的邻接表类型定义 typedef char VertexType[4]; typedef char InfoPtr; typedef int VRType; #define INFINITY 10000 //定义一个无限大的值 #define MaxSize 50 //最大顶点个数 typedef enum{DG,DN,UG,UN}GraphKind;

基于C++ STL图的邻接表表示及深度、广度搜索实现

基于C++ STL图的邻接表表示及深度.广度搜索实现,对图论的学习有帮助,代码如下: #include <iostream> #include <vector> #include <set> using namespace std; #define MAX(a, b) ((a) > (b) ? (a) : (b) ) //定义图的定点 typedef struct Vertex { int id; vector<int> connectors; //存

看数据结构写代码(36) 图的邻接表表示与实现

图的邻接表表示法,是为每一个顶点建立一个链表,链表里存放着相同弧尾的 弧的信息,这些链表顺序存放在数组中.下面是无向图g2的邻接表 邻接表 比 邻接矩阵 节省空间,同时 也带来一些操作上的 不便,例如 看 两个顶点是否 相邻,需要 遍历 链表,在 求 无向图顶点的度时,只需 遍历 顶点的链表,而 求 有向图 顶点的度 需要 遍历 整个图 查找 弧头 为这个顶点的 个数. 如果 不想这样做,可以 建立 逆邻接表,即 链表里 存放着 相同 弧头的 弧 的信息. 下一节 要说的 十字链表 类似于这种结