《大话数据结构》图。2018-8-3-8-6

本文介绍了图的基本概念,包括无向边与有向边、完全图与稀疏图等,并详细阐述了图的两种主要存储结构——邻接矩阵与邻接表的实现方式及示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据元素。线性表中叫元素和空表,树中叫结点和空树、图中叫顶点。

无向边:若顶点v1到v2之间的边没有方向,则称这条边为无向边,用无序偶对(v1,v2)来表示。如果任意两点的边都没有方向则为无向图。如果任意两点都有边,则称为无向完全图。

n个顶点的无向完全图有nx(n-1)/2条边。

有向边:顶点v1到v2有方向。则叫有向边,也称为弧{Arc}。<v1,v2>来表示,v1称为弧尾,v2为弧头。不能写成<v2,v1>如果任意两点的边都有方向则为有向图。任意两点都存在互为相反的两条弧,则称为有向完全图。

n个顶点的有向完全图有nx(n-1)条边。

有很少条边或弧的图为稀疏图,反之为稠密图。带权的图通常为网。

子图:一个图是另一个图的一部分(有向就也要看方向),那他就是子图。

无向图。v1和v2有连边,则俩互为邻接点,则连边依附于俩点。

度:一个顶点v周围的边。TD(v)

图的存储结构:

1.邻接矩阵。图由顶点和弧或便组成。用两个数组。一个数组存储图中顶点信息,一个二维数组存储图中的边或弧。

arc[0][1]=1,v0-v1有边。对称矩阵

不对称。顶点v1的列是入度1,行是出度2。

无穷大表示没有这边,不用0是因为有些比边的权值可能为0,怕混。

/*前面的结构定义不写了*/
void creategraph( MGraph *G)
{
    int i, j, k, w;
    printf("输入定点数和边数:\n");
    scanf("%d,%d", &G->numVertexes, &G->numEdages); /*输入顶点和边数*/
    for( i = 0; i<G->numVertexes; i++ ) /*读入顶点信息,建立定点表*/
        scanf( &G->vexs[i] );
    for()
}

后面太多不想抄了,百度吧

邻接表。图中顶点用一个一维数组存储,每个顶点的所有邻接点构成一个线性表,由于邻接点个数不确定,用单链表。

data:顶点。firstedge:第一个邻接点的指针,adjvex:某顶点的邻接点在data中的下标:next:data的另一个节点的指针。

/*结点定义*/

typedef char VertexType;    /*顶点类型*/
typedef int EdgeType;      /*边上权值类型*/

typedef struct EdgeNode
{
    int adjvex;
    EdgeType Weight;
    struct EdgeType *next;
}EdgeNode;

typedef struct VertexNode
{
    VertexType data;
    EdgeNode *firstedge;
}vertexNode, AdjList[MAXVEX];

typedef struct
{
    AdjList adjList;
    int numVertexes, numEdges;
}GraphAdjList;

创建一个邻接表无向图的。

void CreateALGraph(GraphAdjList *G)
{
    int i, j, k;
    EdgeNode *e;
    printf("输入顶点和边数:\");
    scanf("%d,%d",&G->numVertexes,&G->numEdge);
    for(i=0;i<numVertexes;i++)     /*建立顶点列表*/
        {
            scanf(&G->adjList[i].data);
            G->adjList[i].firstedge=NULL;
        }
    for(k=0;k<G->numEdges;k++)    /*建立边表、权值*/
        {
            printf("输入边(vi,vj)上的顶点序号:\n")
            scanf("%d,%d",&i,&j);    
            e=(EdgeNode *)malloc(sizeof(EdgeNode));  /*结点*/
            e->adjvex=j;   /*邻接点序号*/
            e->next=G->adjList[i].firstedge;      /*将e指针指向当前顶点指向的结点*/
            G->adjList[i].firstedge=e;     /*将当前顶点的指针指向e*/
            /*无向图,i、j有两个*/
            e=(EdgeNode *)malloc(sizeof(EdgeNode));  /*结点*/
            e->adjvex=i;   /*邻接点序号*/
            e->next=G->adjList[j].firstedge;      /*将e指针指向当前顶点指向的结点*/
            G->adjList[j].firstedge=e;     /*将当前顶点的指针指向e*/            
        }
}

图的遍历:

设置一个visited[n],n是图中顶点的个数,初值为0,访问过了就为1。好比迷宫里拿刀刻上记号。

深度优先遍历:深度优先搜索DFS。

从图中某个顶点v出发,从v的未被访问的邻接点出发,深度优先遍历图,直至图中所有和v有路径相同的顶点都被访问到。

typedef int Boolean;     /*布尔类型,TRUE FALSE*/
Boolean visited[Max];
void DFS(MGraph G, int i)
{
    int j;
    visited[i]=TRUE;
    printf("%c",G.vexs[i])    /*打印顶点*/
    for(j=0;j<G.numVer;j++)          /*->是指针用的*G,  .  是普通的用的G*/
        if(G.arc[i][j]==1 && !visited[j])
            DFS(G,j);
}
void DFSTraverse(MGraph G)
{
    int i;
    for(i=0;i<G.numVertexes;i++)
        visited[i]=FALSE;   /*初始所有顶点状态都是未访问过状态*/
    for(i=0;i<G.numVertexes;i++)
        if(!visited[i])
            DFS[G,i]
}

完整代码https://blog.youkuaiyun.com/qq_22238021/article/details/78286798

就看这么多吧先,周一比较困,看看工程吧,学术看不进去了。

CH341A编程器是一款广泛应用的通用编程设备,尤其在电子工程和嵌入式系统开发领域中,它被用来烧录各种类型的微控制器、存储器和其他IC芯片。这款编程器的最新版本为1.3,它的一个显著特点是增加了对25Q25632M芯片的支持。 25Q256是一种串行EEPROM(电可擦可编程只读存储器)芯片,通常用于存储程序代码、配置数据或其他非易失性信息。32M在这里指的是存储容量,即该芯片可以存储32兆位(Mbit)的数据,换算成字节数就是4MB。这种大容量的存储器在许多嵌入式系统中都有应用,例如汽车电子、工业控制、消费电子设备等。 CH341A编程器的1.3版更新,意味着它可以与更多的芯片型号兼容,特别是针对32M容量的芯片进行了优化,提高了编程效率和稳定性。26系列芯片通常指的是Microchip公司的25系列SPI(串行外围接口)EEPROM产品线,这些芯片广泛应用于各种需要小体积、低功耗和非易失性存储的应用场景。 全功能版的CH341A编程器不仅支持25Q256,还支持其他大容量芯片,这意味着它具有广泛的兼容性,能够满足不同项目的需求。这包括但不限于微控制器、EPROM、EEPROM、闪存、逻辑门电路等多种类型芯片的编程。 使用CH341A编程器进行编程操作时,首先需要将设备通过USB连接到计算机,然后安装相应的驱动程序和编程软件。在本例中,压缩包中的"CH341A_1.30"很可能是编程软件的安装程序。安装后,用户可以通过软件界面选择需要编程的芯片类型,加载待烧录的固件或数据,然后执行编程操作。编程过程中需要注意的是,确保正确设置芯片的电压、时钟频率等参数,以防止损坏芯片。 CH341A编程器1.3版是面向电子爱好者和专业工程师的一款实用工具,其强大的兼容性和易用性使其在众多编程器中脱颖而出。对于需要处理25Q25632M芯片的项目,或者26系列芯片的编程工作,CH341A编程器是理想的选择。通过持续的软件更新和升级,它保持了与现代电子技术同步,确保用户能方便地对各种芯片进行编程和调试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值