图结构及其应用

#include <iostream>
#include <stdio.h>
#include <malloc.h>
#include <fstream>
#include <cstdlib>
#include <queue>
#include <string.h>
using namespace std;
#define MAX_VERTEX_NUM   20
#define N 100
bool visit[N];  //访问标记数组是全局变量
int dfn[N];  //顶点的先深编号
int count = 1;
int FLAG = 99999;
int in_order[N];
//无向图
struct MTGragh
{
    int vertex [N]; //顶点表
    int edge[N][N];//邻接矩阵—边表, 可视为边之间的关系
    int n, e; //图的顶点数与边数
};
//正向链接表
typedef struct node  //边表结点
{
    int adjvex; //邻接点域(下标)
    int  cost; //边上的权值
    struct node *next; //下一边链接指针
} EdgeNode;
typedef struct  //顶点表结点
{
    int  vertex; //顶点数据域
    EdgeNode * firstedge;//边链表头指针
} VertexNode;
typedef struct  //图的邻接表
{
    VertexNode vexlist [N];
    int n,e;  //顶点个数与边数
} AdjGraph;
//十字链表
typedef struct ArcBox
{
    int  tailvex, headvex; //该弧的尾和头顶点的位置
    int  cost; //该弧的信息
    struct ArcBox * hlink, * tlink;  //分别为弧头相同和弧尾相同的弧的链域
} ArcBox;
typedef struct VexNode
{
    int data; //顶点值
    ArcBox * firstin, * firstout;  //分别指向该顶点第一条入弧和出弧
} VexNode;
typedef struct
{
    VexNode  xlist[MAX_VERTEX_NUM]; //表头向量
    int n, e;       //有向图的当前顶点数和弧数
} OLGraph;
//无向图的邻接多重表
typedef enum {unvisited, visited} VisitIf;
typedef struct EBox
{
    VisitIf   mark; //访问标记
    int ivex, jvex; //该边依附的两个顶点的位置
    struct EBox   * ilink, * jlink; //分别指向依附这两个顶点的下一条边
    int cost; //该边信息
} EBox;
typedef struct VexBox
{
    int   data;
    EBox * firstedge; //分别指向该顶点第一条入弧和出弧
} VexBox;
struct AMLGraph
{
    VexBox adjmulist[MAX_VERTEX_NUM];
    int n,e; //无向图的当前顶点数和边数
};
void  DFS(OLGraph *G, int v);
void  Rev_DFS(OLGraph *G, int v);
//建立图的邻接矩阵
int CreateMGragh(MTGragh *G,int c[N],int flag,int sum)
{
    int i, j;
    G->n=c[1];
    for (i=0; i<G->n; i++) //2.读入顶点信息,建立顶点表
        G->vertex[i]=i;
    for (i=0; i<G->n; i++)
        for (j=0; j<G->n; j++)
            G->edge[i][j]=0; //3.邻接矩阵初始化
    int a,b;
    int temp=0;
    i=2;
    if(flag==0)
    {
        while(i<sum)
        {
            a=c[i];
            i++;
            b=c[i];
            i++;
            G->edge[a][b] = c[i];
            G->edge[b][a] = c[i];
            temp++;
            i++;
        }
    }
    else
    {
        while(i<sum)
        {
            a=c[i];
            i++;
            b=c[i];
            i++;
            G->edge[a][b] = c[i];
            //G->edge[b][a] = c[i];
            temp++;
            i++;
        }
    }
    G->e=temp;
    return G->e;
}
//输出无向图的邻接矩阵
void putMgraph(MTGragh G)
{
    cout<<"无向图的邻接矩阵:"<<endl;
    for(int i=0; i<G.n; i++)
    {
        cout<<i<<": ";
        for(int j=0; j<G.n; j++)
        {
            cout<<G.edge[i][j]<<" ";
        }
        cout<<endl;
    }
}
//建立图的链接表
AdjGraph CreateGraph(AdjGraph G,int c[N],int k)
{
    G.n=c[1]; G.e=k;int j=2;
    for(int i = 0; i < G.n; i++)  //2.建立顶点表
    {
        G.vexlist[i].vertex=
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
链表是一种常见的数据结构,用于存储和组织数据。它由节点组成,每个节点包含一个值和一个指向下一个节点的指针。链表中的节点可以按顺序链接,形成一个链式结构。 链表有多种类型,包括单链表、双链表和循环链表。单链表中每个节点只有一个指向下一个节点的指针;双链表中每个节点有两个指针,分别指向前一个节点和后一个节点;循环链表中最后一个节点的指针指向第一个节点,形成一个循环。 链表的优点是插入和删除操作的时间复杂度为O(1),因为只需要修改节点的指针即可。而数组在插入和删除时需要移动其他元素,时间复杂度为O(n)。链表的缺点是访问某个节点的时间复杂度为O(n),因为需要从头节点开始遍历。 链表在许多应用中都有广泛的应用。一些常见的应用包括: 1. 实现栈和队列:链表可以用来实现栈和队列这样的数据结构,其中栈是一种后进先出(LIFO)的结构,队列是一种先进先出(FIFO)的结构。 2. 内存分配:动态内存分配时,链表可以用来管理空闲内存块,以便高效地分配和释放内存。 3. 的表示:链表可以用来表示的邻接表,其中每个顶点都用一个链表来存储与其相邻的顶点。 4. 多项式求解:链表可以用来表示多项式,并进行多项式加法、乘法等运算。 5. 缓存实现:链表可以用来实现缓存,其中最近使用的数据节点被放在链表的头部,最久未使用的数据节点被放在链表的尾部。 这些只是链表应用的一些例子,实际上链表在计算机科学和软件工程中有许多其他的应用

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值