创建无向图邻接表

 

#include <iostream>
#include <stdlib.h>
using namespace std;

typedef struct EdgeNode//边表节点
{
    int adjvex;//存储该顶点对应的下标
    struct EdgeNode* next;//指向该顶点的下一个邻接点
}EdgeNode;

typedef struct VertexNode//顶点表结点
{
    char data;//顶点
    EdgeNode* firstedge;//边表头指针
}VertexNode;

typedef struct//图的邻接表存储结构
{
    VertexNode adjList[4];//有4个VertexNode这种类型的顶点,定义一个数组adjList[4],每个元素是VertexNode类型
    int numVertexes, numEdges;//图中顶点数和边数,这里是4,5
}GraphAdjList;

GraphAdjList* CreateALGraph(GraphAdjList* Gp)//无向图的邻接表创建
{
    Gp = (GraphAdjList*)malloc(sizeof(GraphAdjList));
    //申请一片GraphAdjList大小的类型很重要,否则Gp指向NULL(GL传的值是NULL),程序就运行崩溃了
    EdgeNode* pe;//定义边表指针类型pe
    cout << "输入点数、边数" << endl;
    cin >> Gp->numVertexes >> Gp->numEdges;//输入4 5
    for (int k = 0; k < Gp->numVertexes; k++)
    {
        cout << "输入各个顶点(一次只输入一个)" << endl;
        cin >> Gp->adjList[k].data;//输入A B C D
        Gp->adjList[k].firstedge = NULL;//将边表头指针指向NULL,即置为0
    }
    for (int k = 0; k < Gp->numEdges; k++)//建立边表
    {
        int i, j;
        cout << "输入相连的两边:" << endl;
        cin >> i >> j;//每次循环依次输入0 1,0 2,0 3,1 2,2 3

        pe = (EdgeNode*)malloc(sizeof(EdgeNode));
        pe->adjvex = j;// 邻接序号为j
        pe->next = Gp->adjList[i].firstedge;//将pe的指针指向当前顶点指向的结点
        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;//无序图重复上面步骤
    }
    return Gp;
}

int main(void)
{
    GraphAdjList* GL = NULL;
    GL = CreateALGraph(GL);
    //以下是验证图的创建是否正确
    cout << GL->adjList[0].data<<"  ";
    cout << GL->adjList[0].firstedge->adjvex << "->";//输出3,A的第一个指向是D
    cout << GL->adjList[0].firstedge->next->adjvex << "->";//输出2,A第二个指向是C
    cout << GL->adjList[0].firstedge->next->next->adjvex << endl;//输出1,A的第三个指向是B

    cout << GL->adjList[1].data<<"  ";
    cout << GL->adjList[1].firstedge->adjvex << "->";//输出2,B的第一个指向是C
    cout << GL->adjList[1].firstedge->next->adjvex << endl;//输出0,B第二个指向是A

    cout << GL->adjList[2].data << "  ";
    cout << GL->adjList[2].firstedge->adjvex << "->";//输出3,C的第一个指向是D
    cout << GL->adjList[2].firstedge->next->adjvex << "->";//输出1,C第二个指向是B
    cout << GL->adjList[2].firstedge->next->next->adjvex << endl;//输出0,C的第三个指向是A

    cout << GL->adjList[3].data << "  ";
    cout << GL->adjList[3].firstedge->adjvex << "->";//输出2,D的第一个指向是C
    cout << GL->adjList[3].firstedge->next->adjvex << endl;//输出0,D第二个指向是A
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值