数据结构——邻接表Adjacency List

邻接表 是图的一种最主要的存储结构,用来描述图上的每一个点。对图的每个顶点建立一个容器,第i个容器中的结点包含顶点Vi的的所有临界顶点。如下图所示,有向图对应的邻接表:

数据结构——邻接表Adjacency List_第1张图片 

数据结构——邻接表Adjacency List_第2张图片

 1.数据结构

邻接表用到两个数据结构:

(1)一个是头结点表,用一维数组存储。包括顶点和指向第一个邻接点的指针。

(2)一个是每个顶点Vi的所有邻接点构成的一个线性表,用单链表存储。无向图成为顶点Vi的边表,有向图成为顶点Vi作为尾的出表边,存储的是顶点的序号,和指向下一个边的指针。

 头结点:

struct HeadNode //定义头结点
{
    Node *first;//指向头结点
};

首先创建邻接表表头,初始化每个结点的第一个邻接点first为NULL。

表结点:

struct Node //定义表结点
{
    int v; //结点编号
    int w;//权值
    Node *next; //指向下一个顶点的指针
};

 

 数据结构——邻接表Adjacency List_第3张图片

 

2.创建邻接表 

刚开始的时候把顶点表初始化,指针指向NULL。然后邻接点的表结点插入进来 ,插入到first指向的结点之前。

(1)输入第一条边的结点和权值u,v,w分别是1,3,10之后,创建第一条边。相应的表结点如图所示

数据结构——邻接表Adjacency List_第4张图片    

数据结构——邻接表Adjacency List_第5张图片

(2) 输入第二条边的结点和权值u,v,w分别是1,2,12。创建一条边,对应的表结点如图所示:

数据结构——邻接表Adjacency List_第6张图片             

数据结构——邻接表Adjacency List_第7张图片 

3.输出邻接表

 

void Print(int n) //输出邻接表
{
    cout << "---------------------邻接表如下:----------------------" << endl;
    for (int i=1;i<=n;i++)
    {
        Node *t=Graph[i].first;
        cout <<"v" << i<<":   ";
        while(t!=NULL)
        {
            cout << "["<v<<"   "<w<<"]   ";
            t=t->next;
        }
        cout << endl;
    }
}

 

4.源代码: 

#include 
using namespace std;
const int N=11111;
struct Node //定义表结点
{
    int v; //结点编号
    int w;//权值
    Node *next; //指向下一个顶点的指针
};

struct HeadNode //定义头结点
{
    Node *first;//指向头结点
};

HeadNode Graph[N];
int n; //顶点数
int m;//边数
int i ;
int u;//顶点1
int  v;//顶点2
int w;//顶点之间的权值

void InsertEdge(HeadNode &p,int x ,int y) //插入一条边
{
    Node *q;
    q=new(Node);
    q->v=x;
    q->w=y;
    q->next=p.first;
    p.first=q;
    //注意!此处顺序很重要,必须先链接,再断开。
}

void Print(int n) //输出邻接表
{
    cout << "---------------------邻接表如下:----------------------" << endl;
    for (int i=1;i<=n;i++)
    {
        Node *t=Graph[i].first;
        cout <<"v" << i<<":   ";
        while(t!=NULL)
        {
            cout << "["<v<<"   "<w<<"]   ";
            t=t->next;
        }
        cout << endl;
    }
}

int main()
{
    cout << "请输入顶点数n和边数m"<< endl;
    cin >> n>> m;
    for (int i=1;i<=n;i++)
    {
        Graph[i].first=NULL;
    }
    cout << "请输入顶点u,v和顶点之间的权值w" << endl;
    for (i=0;i> u>> v>> w;
        InsertEdge(Graph[u],v,w);
    }
    Print(n);//输出邻接表
    return 0;
}

 

5.数据测试 

数据结构——邻接表Adjacency List_第8张图片

你可能感兴趣的:(图论,数据结构,邻接表,数据结构,图论)