2011-10-21 73 views
0

我有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?非常感谢

+0

ADT从哪里来?它似乎没有能力从一个节点的多个链接。 – Chriszuma

+0

来自我的老师><我也怀疑,但他确定它是正确的 – MinhHoang

回答

0

看起来你的老师打算让你把图读到adjacency list

这是C99中的sample implementation

将其保存到一个名为maze.c,然后用(例如)编译的文件:

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

我没有实现dfs()功能,因为它是不完全清楚,我什么它应该去做。我假设有一些文字与您的作业一起解释每个功能的要求。您可能必须重写printGraph()函数以符合分配要求。

+0

嗨,所以对于每个节点,您将为它分配新内存,即使它已经存在于上一行中,对吗?例如,在第一行,我们有顶点数为6的链接到顶点8,在第7行,我们有顶点数量为6,但现在链接到5.这将导致顶点6直接指向5,并在第一行跳过8! – MinhHoang

+0

dfs(Tgraph * g,int start,int visited [],int pred [])执行深度优先类型搜索过程,从开始节点开始,标记非零值,以访问visited []数组的所有节点,并标记到pred []数组的哪个边缘通向这个顶点(pred [5] = 3意味着顶点3对顶点5具有边缘) – MinhHoang

+0

是的,为每个边缘分配一个新节点。 Google上的图片搜索可能有助于理解数据类型的构建方式。 –