当前位置: 首页 > news >正文

十字链表的构建和操作

前面两期给大家讲解了两种关于构建图的算法,分别是邻接矩阵和邻接表,但这两种算法分别都有各自的缺陷,比如说邻接矩阵的空间复杂度太大,邻接表寻找有向图的入度极其困难,今天给大家介绍一中存储有向图比邻接表更加优秀的算法-----十字链表法

邻接表的缺陷无非就是寻找入度的时候时间复杂度较大,我们可以在创建结构体的时候在里面入度的成员,这样访问的时候就会非常便捷。

这个图里面分别有两个结构体

第一个是顶点的,里面存储了数组域和第一条入度和第一条出度,这样我们在寻找的时候只需要找到第一个然后依次寻找即可

第二个是边的结构体,里面存储是数组元素的下标其实就是弧头和弧尾指向的顶点,另外两个是下一个弧头和下一个弧尾

具体代码:

//十字链表法
#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>
#define MAX 4//假设有四个元素
//边的结构体
typedef struct Edge
{
    int tailvex, headvex;//弧头和弧尾编号
    struct Edge* HLinkNext;//相同弧头的下一条弧
    struct Edge* TLinkNext;//相同弧尾的下一条弧
}Edge;
//顶点结构体
typedef struct Vertex
{
    char data;//数据域
    struct Edge* firstin, * firstout;//第一条入度弧和第一条出度弧
}Vertex;
//定义图
typedef struct Graph
{
    Vertex arr[MAX];//数组元素的数组
    int num;//顶点数量
}Graph;
//初始化
void InitGraph(Graph * G)
{
    G->num = 0;
    int i;
    for (i = 0; i < MAX; i++)
    {
        //还未添加顶点
        G->arr[i].data = '\0';
        G->arr[i].firstin = NULL;
        G->arr[i].firstout = NULL;
    }
    return;
}
//添加顶点
bool EnGraph(Graph* G)
{
    if (G->num > MAX)
        return false;//元素个数大于数组长度
    int i;
    for (i = 0; i < MAX; i++)
        G->arr[i].data = 'A' + i;//给数组赋值
    G->num = MAX;
    return true;
}
//添加边
bool EnEdge(Graph* G,int from,int to)
{
    if (G->num > 4 || G->num < 0)
        return false;//数据不合法
    //创建A -> B
    Edge* e = (Edge*)malloc(sizeof(Edge));
    if (e == NULL)
        return false;//分配空间失败
    //赋值
    e->headvex = from;
    e->tailvex = to;
    //为顶点建立连接
    //建立出度连接(头插法)
    e->TLinkNext = G->arr[from].firstout;
    G->arr[from].firstout = e;
    //建立入度连接(头插法)
    e->HLinkNext = G->arr[to].firstin;
    G->arr[to].firstin = e;
    return true;
}
//查到顶点的出度和入度
bool FindDegree(Graph * G,char ch)
{
    if (G->num == 0)
        return false;//非图
    int index = -1;
    //查找ch是否存在
    for (int i = 0; i < MAX; i++)
    {
        if (G->arr[i].data == ch)
        {
            index = i;
            break;
        }
    }
    if (index == -1)
        return false;//不存在该顶点
    Edge * DegreeIn = G->arr[index].firstin;
    Edge* DegreeOut = G->arr[index].firstout;
    //求入度
    while (DegreeIn != NULL)
    {
        printf("%c的入度为%c\n", ch, G->arr[DegreeIn->headvex].data);
        DegreeIn = DegreeIn->HLinkNext;
    }
    //求出度
    while (DegreeOut != NULL)
    {
        printf("%c的出度为%c\n", ch, G->arr[DegreeOut->tailvex].data);
        DegreeOut = DegreeOut->TLinkNext;
    }

    return true;
}
int main()
{
    
    Graph G;//定义图
    InitGraph(&G);//初始化图
    EnGraph(&G);//添加顶点
    //添加边
    //A->B  A->C
    EnEdge(&G, 0, 1);
    EnEdge(&G, 0, 2);
    //C->A C->D
    EnEdge(&G, 2, 0);
    EnEdge(&G, 2, 3);
    //D->A D->B D->C
    EnEdge(&G, 3, 0);
    EnEdge(&G, 3, 1);
    EnEdge(&G, 3, 2);

    //查找顶点的出度和入度
    FindDegree(&G, 'A');
    return 0;
}
 

时间复杂度:O(|V| + |E|)顶点 + 边数
空间复杂度O(n)

http://www.dtcms.com/a/483931.html

相关文章:

  • 中山做网站的公司哪家好佛山100强企业名单
  • 广州网站建设+美词有哪些网站做的好处
  • 网站查询功能怎么做php网页设计完整代码
  • Efficient Multi-Scale Attention Module with Cross-Spatial Learning 学习笔记
  • 国内专门做情侣的网站商城广州市建设工程信息管理平台
  • 游仙移动网站建设有意义网站
  • 小红书MCP AI自动工作流
  • QPSK信号载波同步技术---四相Costas 环法
  • android开发和网站开发wordpress对比phpcms
  • [嵌入式系统-111]:瑞芯微RK3588芯片
  • 广东顺德网站建设在线买房网站建设 方案
  • 深入剖析 std::map 的红黑树实现机制
  • 网站建设工作室怎么接单做网站推广挣多少钱
  • 免登录!免安装ClI,Claude Code官方插件接入API使用教程
  • 网站制作有哪些种类网站设计包括
  • 英文外贸网站建设网站设计方案网上开店网站
  • 为了庆祝2025英雄联盟全球总决赛开启,我用HTML+CSS+JS制作了LOL官方网站
  • Server 14 ,Windows 11 下 Nginx 安装与自启动配置攻略( Windows 与 Nginx )
  • 哪些网站是用php做的北京网站开发工程师
  • Godot Engine 跨平台构建完全指南
  • 怎么做自己网站的API成都展示型网页开发公司
  • Docker 监控体系总结
  • 公司网站标题优化网站建设运营规划
  • 台州cms建站系统网站建设要注意哪些问题
  • 杭州网站推广方式建设官网站
  • 地形匹配导航技术
  • 网站的图书资源建设wordpress 5.0.2 中文
  • 二分查找模板全集
  • FPGA基础 -- cocotb仿真之任务调度cocotb.start_soon与asyncio的使用注意事项
  • 图片生成网站建站之星多语言