Graphique avec masortingce d’adjacence en C

J’ai cette struct :

 struct graph { int** adj; /**< Adjacency matrix. */ int n; /**< Number of nodes in graph. */ }; 

et je dois créer un graphe vide dans cette fonction:

 struct graph *graph_create(int nodes) { //To implement } 

Comment créer une masortingce en utilisant ce double pointeur int** adj ?

Voici la manière de définir une masortingce avec malloc() que je récupère de GeeksForGeeks avec une édition quelconque.

Masortingce entier 2D avec int ** et malloc()

 int r = 3, c = 4, i, j, count; //arr[r][c] int **arr = (int **)malloc(r * sizeof(int *)); for (i=0; i 

Et nous pouvons mettre ces codes dans la fonction graph_create(int nodes) .

Code

 struct graph { int** adj; /**< Adjacency matrix. */ int n; /**< Number of nodes in graph. */ }G; struct graph *graph_create(int nodes) { struct graph * tmp = &G; int r = nodes, c = nodes, i, j, count; //arr[r][c] G.adj = (int **)malloc(r * sizeof(int *)); for (i=0; i 

Nous soaps que la masortingce d'adjacence d'un graphe a n * n dimension. pour cela nous utilisons des noeuds comme ligne et colonne.

modifier

Pour travailler en toute sécurité avec la fonction malloc() , nous devons libérer les emplacements de mémoire réservés par malloc() , en appelant free() avec ces blocs. (similaire à Mobius answer)

juste avant le return 0; déclaration dans main() appelez ceci:

free ((*d).adj);

Fichiers d'en-tête requirejs:

 #include  #include  // for** malloc()**, **free()** 

Pour allouer une masortingce, vous devez allouer de la place pour les données de masortingce réelles (de taille width * height * sizeof(int) ).

Dans votre configuration avec une masortingce int** , vous devez également allouer un tableau de pointeurs size_t offset = row * width + column vers le début de chaque ligne. Si vous voulez éviter cela, vous pouvez simplement calculer le décalage en effectuant quelque chose comme: size_t offset = row * width + column .

Pour allouer les pointeurs, nous avons besoin de height * sizeof(int*) octets.

Enfin, vous devrez assigner les pointeurs de ligne dans votre tableau.

Dans l’ensemble, le code devrait ressembler à ceci:

 int ** allocate_masortingx(size_t width, size_t height){ int * values = malloc(height * width * sizeof(int)); int ** rows = malloc(height * sizeof(int*)); size_t i; for (i = 0; i < height; i++) { size_t offset = i * width; rows[i] = &values[offset]; } return rows; } // the returned matrix can me indexed like `matrix[row][column]` 

Afin de libérer notre mémoire pointée par adj :

 void free_masortingx(int ** rows) { // this points to the beginning of our region of memory for values; int * values = rows[0]; free(values); free(rows); }