Comprender la lista de adyacencia

    En este tutorial, aprenderá qué es una lista de adyacencia. Además, también encontrará ejemplos de listas de adyacencia en C.
    La lista de adyacencia representa el gráfico como una matriz de listas enlazadas.
    El índice de la matriz representa un vértice y cada elemento de la lista vinculada representa otros vértices que forman un borde con el vértice.

Notación de lista de adyacencia

    El gráfico y su lista de adyacencia equivalente son los siguientes: la
Inserte la descripción de la imagen aquí
    lista de adyacencia es efectiva en el almacenamiento, porque solo necesitamos almacenar el valor del borde. Para gráficos dispersos con millones de vértices y aristas, esto significa un gran ahorro de espacio.

Estructura de la lista de adyacencia

    La lista de adyacencia más simple requiere una estructura de datos de nodo para almacenar vértices y una estructura de datos de gráfico para organizar los nodos.
    Nos atenemos a la definición básica de un gráfico: el conjunto de vértices y aristas {V, E}. Para simplificar, usamos un gráfico sin etiquetar en lugar de un gráfico etiquetado, es decir, los vértices se identifican por sus índices 0, 1, 2, 3.
    Vamos a sumergirnos en la estructura de datos aquí.

struct node
{
    
    
    int vertex;
    struct node* next;
};

struct Graph
{
    
    
    int numVertices;
    struct node** adjLists;
};

    No dejes que struct node ** adjLists te asuste.
    Lo que estamos diciendo es que queremos almacenar un puntero a struct node *. Esto se debe a que no sabemos cuántos vértices tiene el gráfico, por lo que no podemos crear una matriz de lista vinculada en el momento de la compilación.

C ejemplo
// Adjascency List representation in C

#include <stdio.h>
#include <stdlib.h>

struct node {
    
    
  int vertex;
  struct node* next;
};
struct node* createNode(int);

struct Graph {
    
    
  int numVertices;
  struct node** adjLists;
};

// Create a node
struct node* createNode(int v) {
    
    
  struct node* newNode = malloc(sizeof(struct node));
  newNode->vertex = v;
  newNode->next = NULL;
  return newNode;
}

// Create a graph
struct Graph* createAGraph(int vertices) {
    
    
  struct Graph* graph = malloc(sizeof(struct Graph));
  graph->numVertices = vertices;

  graph->adjLists = malloc(vertices * sizeof(struct node*));

  int i;
  for (i = 0; i < vertices; i++)
    graph->adjLists[i] = NULL;

  return graph;
}

// Add edge
void addEdge(struct Graph* graph, int s, int d) {
    
    
  // Add edge from s to d
  struct node* newNode = createNode(d);
  newNode->next = graph->adjLists[s];
  graph->adjLists[s] = newNode;

  // Add edge from d to s
  newNode = createNode(s);
  newNode->next = graph->adjLists[d];
  graph->adjLists[d] = newNode;
}

// Print the graph
void printGraph(struct Graph* graph) {
    
    
  int v;
  for (v = 0; v < graph->numVertices; v++) {
    
    
    struct node* temp = graph->adjLists[v];
    printf("\n Vertex %d\n: ", v);
    while (temp) {
    
    
      printf("%d -> ", temp->vertex);
      temp = temp->next;
    }
    printf("\n");
  }
}

int main() {
    
    
  struct Graph* graph = createAGraph(4);
  addEdge(graph, 0, 1);
  addEdge(graph, 0, 2);
  addEdge(graph, 0, 3);
  addEdge(graph, 1, 2);

  printGraph(graph);

  return 0;
}
Documentos de referencia

[1] Parewa Labs Pvt. Ltd. Lista de Adyacencia [EB / OL] .https: //www.programiz.com/dsa/graph-adjacency-list,2020-01-01.

Supongo que te gusta

Origin blog.csdn.net/zsx0728/article/details/114639395
Recomendado
Clasificación