1. 程式人生 > >圖的儲存結構之鄰接表

圖的儲存結構之鄰接表


#include<iostream>
using namespace std;

#define MAXVEX 100 /* 最大頂點數,應由使用者定義 */
typedef char VertexType; /* 頂點型別應由使用者定義 */
typedef int EdgeType; /* 邊上的權值型別應由使用者定義 */

typedef struct EdgeNode/* 邊表結點  */
{
    int adjvex;/* 鄰接點域,儲存該頂點對應的下標 */
    EdgeType weight;/* 用於儲存權值,對於非網圖可以不需要 */
    struct EdgeNode *next; /* 鏈域,指向下一個鄰接點 */

} EdgeNode;

typedef struct VextexNode/* 頂點表結點 */
{
    VertexType data;/* 頂點域,儲存頂點資訊 */
    EdgeNode *firstedge;/* 邊表頭指標 */
} VextexNode, AdjList[MAXVEX];

typedef struct
{
    AdjList adjList;
    int numNodes, numEdges; /* 圖中當前頂點數和邊數 */
} GraphAdjList;


void CreateALGraph(GraphAdjList *Gp)
{
    int i, j, k;
    EdgeNode *pe;
    cout << “輸入頂點數和邊數(空格分隔):”
 << endl;
    cin >> Gp->numNodes >> Gp->numEdges;

    for (i = 0 ; i < Gp->numNodes; i++)
    {
        cout << “輸入頂點資訊:” << endl;
        cin >> Gp->adjList[i].data;
        Gp->adjList[i].firstedge = NULL;/* 將邊表置為空表 */
    }

    for (k = 0; k <  Gp->numEdges; k++)/* 建立邊表 */

    {
        cout << “輸入邊(vi,vj)的頂點序號i,j(空格分隔):” << endl;
        cin >> i >> j;
        pe = (EdgeNode *)malloc(sizeof(EdgeNode));
        pe->adjvex = j;/* 鄰接序號為j */
        /* 將pe的指標指向當前頂點上指向的結點 */
        pe->next = Gp->adjList[i].firstedge;
        Gp->adjList[i].firstedge = pe;/* 將當前頂點的指標指向pe */

        pe = (EdgeNode *)malloc(sizeof(EdgeNode));
        pe->adjvex = i;
        pe->next = Gp->adjList[j].firstedge;
        Gp->adjList[j].firstedge = pe;

    }
}

int main(void)
{
    GraphAdjList GL;
    CreateALGraph(&GL);

    return 0;
}