Representación de lista enlazada y representación de matriz de adyacencia del gráfico C

Representación de lista enlazada del gráfico

La ruta más corta no ponderada de una sola fuente, BFS,
puede considerarse como una lista vinculada que ahorra espacio de memoria;

#define MaxVertexNum 100    /* 最大顶点数设为100 */
typedef int Vertex;         /* 用顶点下标表示顶点,为整型 */
typedef int WeightType;        /* 边的权值设为整型 */
typedef char DataType;        /* 顶点存储的数据类型设为字符型 */

1. Construir nodos de borde
izquierdo, derecho, pesos

typedef struct ENode *PtrToENode;
struct ENode{
    Vertex V1, V2;      /* 有向边<V1, V2> */
    WeightType Weight;  /* 权重 */
};
typedef PtrToENode Edge;

2. Defina el
peso del punto de adyacencia del punto de adyacencia, el
siguiente puntero apunta al siguiente punto de adyacencia,
subíndice AdjV;

/* 邻接点的定义 */
typedef struct AdjVNode *PtrToAdjVNode; 
struct AdjVNode{
    Vertex AdjV;        /* 邻接点下标 */
    WeightType Weight;  /* 边权重 */
    PtrToAdjVNode Next;    /* 指向下一个邻接点的指针 */
};

3. Defina el nodo principal del vértice El
nodo principal tiene un puntero principal que apunta al primer objeto conectado al nodo, los
datos pueden almacenar los datos del vértice;

/* 顶点表头结点的定义 */
typedef struct Vnode{
    PtrToAdjVNode FirstEdge;/* 边表头指针 */
    DataType Data;            /* 存顶点的数据 */
    /* 注意:很多情况下,顶点无数据,此时Data可以不用出现 */
} AdjList[MaxVertexNum];    /* AdjList是邻接表类型 */
 

4. Cree una
lista de almacenamiento en el gráfico del nodo gráfico LGraph, G almacena el nodo principal apuntando al nodo de borde de cada nodo;

typedef struct GNode *PtrToGNode;
struct GNode{  
    int Nv;     /* 顶点数 */
    int Ne;     /* 边数   */
    AdjList G;  /* 邻接表 */
};
typedef PtrToGNode LGraph; /* 以邻接表方式存储的图类型 */

5. Crear la función createGraph
Ingrese el número de nodos y asígnelo a Graph-> Nv,
inicialice el puntero de cabeza de G [i] a NULL, lo que significa que no hay borde;

LGraph CreateGraph( int VertexNum )
{ /* 初始化一个有VertexNum个顶点但没有边的图 */
    Vertex V;
    LGraph Graph;
     
    Graph = (LGraph)malloc( sizeof(struct GNode) ); /* 建立图 */
    Graph->Nv = VertexNum;
    Graph->Ne = 0;
    /* 初始化邻接表头指针 */
    /* 注意:这里默认顶点编号从0开始,到(Graph->Nv - 1) */
       for (V=0; V<Graph->Nv; V++)
        Graph->G[V].FirstEdge = NULL;
             
    return Graph; 
}

6. Función de inserción de borde
Cree un espacio de puntos adyacentes, utilizando el miembro a la derecha del borde como subíndice del nodo adyacente,
el peso del borde como el peso del nodo adyacente,
el nodo adyacente apunta a Gráfico-> G [E-> V1 ] .PrimeroEdge; G [E-> V1] .PrimeroEdge apunta al nodo; después de que el nodo se inserta en el nodo principal; el
gráfico no dirigido también necesita insertar v1 en el nodo principal de v2;

void InsertEdge( LGraph Graph, Edge E )
{
    PtrToAdjVNode NewNode;
     
    /* 插入边 <V1, V2> */
    /* 为V2建立新的邻接点 */
    NewNode = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode));
    NewNode->AdjV = E->V2;
    NewNode->Weight = E->Weight;
    /* 将V2插入V1的表头 */
    NewNode->Next = Graph->G[E->V1].FirstEdge;
    Graph->G[E->V1].FirstEdge = NewNode;
         
    /* 若是无向图,还要插入边 <V2, V1> */
    /* 为V1建立新的邻接点 */
    NewNode = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode));
    NewNode->AdjV = E->V1;
    NewNode->Weight = E->Weight;
    /* 将V1插入V2的表头 */
    NewNode->Next = Graph->G[E->V2].FirstEdge;
    Graph->G[E->V2].FirstEdge = NewNode;
}

7. La función de construcción de gráficos
contiene datos de entrada;

LGraph BuildGraph()
{
    LGraph Graph;
    Edge E;
    Vertex V;
    int Nv, i;
     
    scanf("%d", &Nv);   /* 读入顶点个数 */
    Graph = CreateGraph(Nv); /* 初始化有Nv个顶点但没有边的图 */ 
     
    scanf("%d", &(Graph->Ne));   /* 读入边数 */
    if ( Graph->Ne != 0 ) { /* 如果有边 */ 
        E = (Edge)malloc( sizeof(struct ENode) ); /* 建立边结点 */ 
        /* 读入边,格式为"起点 终点 权重",插入邻接矩阵 */
        for (i=0; i<Graph->Ne; i++) {
            scanf("%d %d %d", &E->V1, &E->V2, &E->Weight); 
            /* 注意:如果权重不是整型,Weight的读入格式要改 */
            InsertEdge( Graph, E );
        }
    } 
 
    /* 如果顶点有数据的话,读入数据 */
    for (V=0; V<Graph->Nv; V++) 
        scanf(" %c", &(Graph->G[V].Data));
 
    return Graph;
}

Representación de matriz de adyacencia

Algoritmo de ruta más corta ponderado de una sola fuente Algoritmo de Dijkstra Algoritmo
de ruta más corta ponderado de una sola fuente Algoritmo de floyd de algoritmo floyd La
matriz de adyacencia es más conveniente; los
gráficos dispersos desperdician espacio y consumen más tiempo;

#define MaxVertexNum 100    /* 最大顶点数设为100 */
#define INFINITY 65535        /* ∞设为双字节无符号整数的最大值65535*/
typedef int Vertex;         /* 用顶点下标表示顶点,为整型 */
typedef int WeightType;        /* 边的权值设为整型 */
typedef char DataType;        /* 顶点存储的数据类型设为字符型 */

1. Estructura del borde
Peso y nodos a ambos lados del borde

/* 边的定义 */
typedef struct ENode *PtrToENode;
struct ENode{
    Vertex V1, V2;      /* 有向边<V1, V2> */
    WeightType Weight;  /* 权重 */
};
typedef PtrToENode Edge;

2. Definición del gráfico Número de
vértices,
número de aristas,
adyacencia de los almacenes de matriz;

/* 图结点的定义 */
typedef struct GNode *PtrToGNode;
struct GNode{
    int Nv;  /* 顶点数 */
    int Ne;  /* 边数   */
    WeightType G[MaxVertexNum][MaxVertexNum]; /* 邻接矩阵 */
    DataType Data[MaxVertexNum];      /* 存顶点的数据 */
    /* 注意:很多情况下,顶点无数据,此时Data[]可以不用出现 */
};
typedef PtrToGNode MGraph; /* 以邻接矩阵存储的图类型 */
 

3.
crear función de gráfico Crear espacio de gráfico, inicializar miembros de gráfico,
inicialmente establecer gráfico sin bordes en INFINITY;

MGraph CreateGraph( int VertexNum )
{ /* 初始化一个有VertexNum个顶点但没有边的图 */
    Vertex V, W;
    MGraph Graph;
     
    Graph = (MGraph)malloc(sizeof(struct GNode)); /* 建立图 */
    Graph->Nv = VertexNum;
    Graph->Ne = 0;
    /* 初始化邻接矩阵 */
    /* 注意:这里默认顶点编号从0开始,到(Graph->Nv - 1) */
    for (V=0; V<Graph->Nv; V++)
        for (W=0; W<Graph->Nv; W++)  
            Graph->G[V][W] = INFINITY;
             
    return Graph; 
}

4. Insertar una función de borde
Asignación simple

void InsertEdge( MGraph Graph, Edge E )
{
     /* 插入边 <V1, V2> */
     Graph->G[E->V1][E->V2] = E->Weight;    
     /* 若是无向图,还要插入边<V2, V1> */
     Graph->G[E->V2][E->V1] = E->Weight;
}

5. Crear funciones gráficas, incluida la entrada

MGraph BuildGraph()
{
    MGraph Graph;
    Edge E;
    Vertex V;
    int Nv, i;
     
    scanf("%d", &Nv);   /* 读入顶点个数 */
    Graph = CreateGraph(Nv); /* 初始化有Nv个顶点但没有边的图 */ 
     
    scanf("%d", &(Graph->Ne));   /* 读入边数 */
    if ( Graph->Ne != 0 ) { /* 如果有边 */ 
        E = (Edge)malloc(sizeof(struct ENode)); /* 建立边结点 */ 
        /* 读入边,格式为"起点 终点 权重",插入邻接矩阵 */
        for (i=0; i<Graph->Ne; i++) {
            scanf("%d %d %d", &E->V1, &E->V2, &E->Weight); 
            /* 注意:如果权重不是整型,Weight的读入格式要改 */
            InsertEdge( Graph, E );
        }
    } 
 
    /* 如果顶点有数据的话,读入数据 */
    for (V=0; V<Graph->Nv; V++) 
        scanf(" %c", &(Graph->Data[V]));
 
    return Graph;
}

Para resumir la
lista de adyacencia, se necesitan dos funciones estructurales más para definir la estructura del punto de adyacencia y definir la estructura del nodo principal; la
estructura del punto de adyacencia contiene el índice del nodo actual, el puntero del siguiente nodo de adyacencia y el peso de este borde; la
estructura del nodo principal: El primer miembro apunta al primer objeto conectado por el borde; la
estructura del gráfico guarda los puntos adyacentes como una lista de estructuras;
G [i] .firstEdge es el borde del punto i

for(PtrToAdjVNode i=G[i].firstEdge; i!=NULL;i=i->Next) 

Puede atravesar todos los bordes del punto;

La matriz de adyacencia requiere menos funciones estructurales, es
fácil de escribir y adecuada para el algoritmo Dijkstra y el algoritmo Floyd;

Publicados 105 artículos originales · ganado elogios 6 · vistas 4960

Supongo que te gusta

Origin blog.csdn.net/BLUEsang/article/details/105443183
Recomendado
Clasificación