Graf skierowany w C

Graf skierowany w C
lukashid
  • Rejestracja:ponad 11 lat
  • Ostatnio:2 dni
  • Postów:93
0

Witam
Chcę napisać w języku C graf skierowany oparty na liście sąsiedztwa. Wyczytałem, że taki graf ma być oparty na tablicy list, gdzie indeksy tablicy mają odpowiadać numerom wierzchołków. Czy wie ktoś może jak zrealizować taki graf w języku C ?

_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:13 dni
1

"... graf ma być oparty na tablicy list ..." - którego słowa nie rozumiesz?


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
lukashid
  • Rejestracja:ponad 11 lat
  • Ostatnio:2 dni
  • Postów:93
0

A no bo lista to z tego co rozumiem struktura oparta na węzłach tutaj tak ? No i teraz to miałbym wpakować po prostu w taką najzwyklejszą tablicę ?

MateuszS
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 5 lat
  • Postów:311
0

Zrób 2 struktury, Graf i Węzeł. Coś takiego

Kopiuj
struct Wezel {
     int numer;
     Wezel * nastepne[]; //wskaznik na tablice wskaznikow nastepnych elementow typu Wezel, pseudokod 
}

struct Graf {
   Wezel * poczatkowy;
   
  //jakies funkcje na grafie
}

Jest lista sąsiedztwa, jest tablica, jest graf :D

edytowany 2x, ostatnio: MateuszS
lukashid
  • Rejestracja:ponad 11 lat
  • Ostatnio:2 dni
  • Postów:93
0

Czy taka implementacja jest poprawna ?

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

typedef struct Node{
  int value;
  struct Node *next;
}node;

node **arrayList;

void addVertex(int nrVertex);
void addEdge(int nrVertex, int value);

int main(void) {
  int nrVertex,nrEdge;
  arrayList = malloc(sizeof(4 * sizeof(node*)));

  for(;;) {
    if (scanf("%d",&nrVertex)!= 1) break;
    scanf("%d",&nrEdge);
    addVertex(nrVertex);
    addEdge(nrVertex,nrEdge);
  }

return 0;
}

void addVertex(int nrVertex) {
  if(!(arrayList[nrVertex])) {
    arrayList[nrVertex] = malloc(sizeof(node));
    arrayList[nrVertex] = NULL;
  }
}

void addEdge(int nrVertex, int value) {
    node *newNode;
    newNode = malloc(sizeof(node));
    newNode->value = value;
    newNode->next = arrayList[nrVertex];
    arrayList[nrVertex] = newNode;
}
_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:13 dni
1

Nie. Zadanie brzmi jednoznacznie: Dopiero zauważyłem że masz prawie dobrze, z tym że nie elegancko.

Kopiuj
typedef struct _Node
  {
   //double weight; // ewentualnie waga/koszt
   unsigned nodeto;
   struct _Node *next;
  } Node;
typedef struct _Graph
  {
   unsigned count;
   Node **table;
  } Graph;

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 2x, ostatnio: _13th_Dragon
lukashid
  • Rejestracja:ponad 11 lat
  • Ostatnio:2 dni
  • Postów:93
0

Oo widzisz.

Rozumiem ,że unsigned count to licznik list, a unsigned nodeto to numer wierzchołka grafu . A co miałeś na myśli z "//double weight" ?

MateuszS
Pewnie wagę krawędzi
_13th_Dragon
Komentarzu do tego wiersza nie przeczytałeś?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.