Создать смежный односвязный список

#c

#c

Вопрос:

У меня есть ADT для графа, подобного:

 typedef struct element {
  int info;
  struct element *link;
} Tnode;

typedef struct graphAdjList {
  int nodes;
  Tnode *adjList[MAX];  // array of 20 pointers to Tnode
} Tgraph;

Tgraph *readGraph(FILE *fd);
void printGraph(Tgraph *g);
void dfs(Tgraph *g, int start, int visited[], int pred[]);
void destroyGraph(Tgraph *g);
  

и заключающий файл «maze.txt » со следующим содержанием:

 0 1 6 8
1 0 2 3
2 10 11
3 1 4 12
4 3 13
5 4 6 9
6 5 7
7 8 9
8 0 7 14
9 15 5 7
10 2
11 2
12 3
13 4
14 8
15 9
  

где 0 1 6 8 означает, что узел с номером 0 имеет (однонаправленные) соединения с узлами 1, 6 и 8. Теперь я действительно не знаю, как построить график на основе приведенного выше списка с помощью метода readGraph(). Не могли бы вы, ребята, указать мне подробную реализацию, потому что я новичок в C? Большое спасибо

Комментарии:

1. Откуда взялся этот ADT? Похоже, что он не поддерживает несколько ссылок с одного узла.

2. пришло от моего учителя>. < Я тоже подозреваю, но он уверен, что это правильно

Ответ №1:

Похоже, ваш учитель намеревается, чтобы вы прочитали график в списке смежности.

Вот пример реализации на C99.

Сохраните его в файл с именем maze.c , а затем скомпилируйте его с помощью (например):

gcc -g -O2 -Wall -Werror -std=c99 -o maze maze.c

Я не реализовал эту dfs() функцию, поскольку мне было не совсем ясно, что она должна делать. Я предполагаю, что есть какой-то текст, который соответствует вашему заданию, объясняющий требования каждой функции. Вероятно, вам также придется переписать printGraph() функцию, чтобы она соответствовала требованиям к назначению.

Комментарии:

1. привет, итак, для каждого узла вы будете выделять для него новую память, даже если она уже существовала в предыдущей строке, верно? Например, в первой строке у нас есть вершина номер 6, которая имеет ссылку на вершину 8, а в строке 7 у нас есть вершина номер 6, но теперь она ссылается на 5. Это приведет к тому, что вершина 6 будет указывать непосредственно на 5 и пропустит 8 в первой строке!!

2. dfs(Tgraph *g, int start, int visited[], int pred[]) выполняет поиск по типу в глубину, начиная с начального узла, отмечая ненулевое значение для всех посещенных узлов в массиве visited[] и отмечая в массиве pred[], какое ребро быловедущий к этой вершине (pred[5]=3 означает, что вершина 3 имеет ребро с вершиной 5)

3. Да, для каждого ребра выделяется новый узел. Поиск изображений в Google, вероятно, будет полезен для понимания того, как создается тип данных.