#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, вероятно, будет полезен для понимания того, как создается тип данных.