数据结构 图的存储结构(邻接矩阵,邻接表,十字链表,邻接多重表)的实现

图的逻辑结构是多对多,所以图没有顺序存储结构,但可以借助二维数组来表示元素间的关系,这就是数组表示法(邻接矩阵)

链式存储结构:可以用多重链表(邻接表,邻接多重表,十字链表)来表示

重点:邻接矩阵(数组)表示法 和 邻接表(链式)表示法

一:数组(邻接矩阵)表示法

1,先建立一个顶点表(记录各个顶点的信息)和一个邻接矩阵(表示各个顶点之间的关系).

顶点表是一个一维数组Vexs[n]

无向图邻接矩阵是一个二维数组arcs[n][n],如果两个顶点间有边相连,那么arcs[n][n] = 1,否则arcs[n][n] = 0(n为两个顶点的下标)n取决于顶点个数

有向图邻接矩阵是一个二维数组arcs[i][j],如果存在着由i顶点发出的,到j顶点弧,那么arcs[i][j] = 1,别的位置都为0

无向图的邻接矩阵特点:

1,无向图的邻接矩阵是对称的;

2,顶点i的度 = 第i行(列)中1的个数;

3,全完图的邻接矩阵中,对角元素为0,其余都是1;

 在有向图的邻接矩阵中

第i行含义:以结点vi为尾的弧(即出度边)

第j列含义:以结点vj为头的弧(即入度边)

有向图的邻接矩阵特点:

1,有向图的邻接矩阵可能是不对称的.

2,顶点的出度 = 第i行元素之和;顶点的入度 = 第j列元素之和.

3,顶点的度 = 第i行的元素之和 + 第j列的元素之和

网(即有权图)的邻接矩阵表示法

无向网的邻接矩阵,就是把无向图的邻接矩阵中的1,变成权值,0变成无穷大\propto

有向网的邻接矩阵,就是把有向图的邻接矩阵中的1,变成权值,0变成无穷大\propto

 二,邻接矩阵代码实现

邻接矩阵的存储表示:用两个数组分别存储顶点表和邻接矩阵

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100 //最大顶点数
typedef struct{
    char vexs[MAXSIZE];//这里的数据类型根据实际情况而定
    int arcs[MAXSIZE][MAXSIZE];//这里的数据类型根据实际情况而定
    int vexnum, arcnum;//图的当前顶点数和边数
}G;
int main()
{
    printf("Hello world!\n");
    return 0;
}

采用邻接矩阵表示法创建无向网

算法思想:1,输入总顶点数和总边数

                   2,依次输入顶点的信息存入顶点表中.

                 3,初始化邻接矩阵,使每个权值初始化为极大值.

                 4,构造邻接矩阵.

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100 //最大顶点数
#define MAX_INT 32767//设置最大值
typedef struct{
    char vexs[MAXSIZE];//这里的数据类型根据实际情况而定
    int arcs[MAXSIZE][MAXSIZE];//这里的数据类型根据实际情况而定
    int vexnum, arcnum;//图的当前顶点数和边数
}Graph;
int get_index(char* arr,char m)
{
    int i = 0;
    for(i = 0; i < MAXSIZE; i++)
    {
        if(arr[i] == m)return i;
    }
    return -1;
}

void CreatGraph(Graph* G)
{
    int i,j = 0;
    printf("请输入顶点和边的数量:>");
    scanf("%d%d",&G->vexnum,&G->arcnum);//把输入的值保存到图结构体中
    for(i = 0; i < G->vexnum; i++)//初始化邻接矩阵
    {
        for(j = 0; j < G->vexnum; j++)
            {
                G->arcs[i][j] = MAX_INT;//边的权值设置为极大值
            }
引用: 十字链表是一种用于示有向数据结构。它包含两种类型的节点:顶点节点和弧节点。顶点节点记录着当前顶点的相关信息,如顶点的数据、指向该顶点的入度弧节点和指出该顶点的出度弧节点。而弧节点则示两个顶点之间的有向边关系,其中tailvex示弧的起始顶点,headvex示弧的结束顶点,而headlink和taillink分别指向与该节点相邻的下一条弧的节点。 引用: 邻接多重表也是一种用于示无向数据结构。它与十字链表相似,同样包含顶点节点和边节点。每个顶点节点记录着当前顶点的相关信息,如顶点的数据以及与该顶点相邻的一条边的节点。而边节点则示两个顶点之间的无向边关系,其中ivex和jvex分别示边的两个顶点,ilink和jlink分别指向与该边相邻的下一条边的节点。需要注意的是,邻接多重表中的边是双向的,因此在的存储中每条边都需要用两个边节点示。 所以,十字链表是用于示有向数据结构,而邻接多重表则用于示无向数据结构。它们分别在记录顶点和边之间的关系上有所不同。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [6-4-十字链表邻接多重表](https://blog.csdn.net/weixin_45825865/article/details/116152711)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值