typedef struct roads road;
typedef struct city city;
我正在实现一个有道路的代码,边缘有两个城市,我会从文件中读取它们并将它们链接起来。结构就像
NewYork 250km LosAngeles
LosAngeles 120km Florida
等等,我将有一个ROADS阵列存储我读过的道路。
struct city{
char* city_name;
}
struct roads{
int distance;
struct city *next_city,*previous_city;
struct roads **neigbors; // is this possible
}
size_t size = sizeof(road) + sizeof(city);
road *ROADS = malloc(size);
这样的代码的缺点和分配对此,我正在考虑为一个国家做一张地图。所有城市都应该有一个指向其邻居的指针,以便当有人询问它们之间的距离时,我的程序应该能够回答它。
char *city_name = malloc(sizeof(char)*length_of_name);
road *given_road = malloc(sizeof(road));
city *given_city = malloc(sizeof(city));
当涉及到邻居部分时;
for(index = 0; given_road[index] != NULL; index++)
road *given_road->neighbors[index] = malloc(sizeof(city));
这部分和最后一部分是我困惑的部分,我唯一的链接参考是城市的名称;
if(strcmp(ROADS[i]->next_city->city_name,ROADS[j]->previous_city->city_name)){
if(ROADS[i]->neighbors[0]==NULL)
ROADS[i]->next_city = ROADS[j]->previous_city;
ROADS[i]->neighbors[0] = ROADS[j]->previous_city;
ROADS[j]->neighbors[0] = ROADS[i]->next_city; //I totally don't know what am I doing here}
我打算如果ROADS [i]的city_name中的道路与ROADS [j]的city_name(如LosAngeles示例)相同,我会尝试通过邻居结构将它们连接起来,这样“纽约250公里洛杉矶“公路有一个邻居是”LosAngeles 120km Florida“,反之亦然。如果从文件中读取类似“LosAngeles 500km Nebraska”的内容,那么我最初提到的两条道路将有两个邻居和两个链接。 ROADS阵列现在存储3个道路结构。当然,当我建造道路结构时,我正在为ROADS阵列分配内存。每次都有一条道路来了;
ROADS = realloc(ROADS,i*size + size);
我做错了哪些要点?任何提示对我来说都是完美的,我可以进一步开发这个代码,甚至说“我应该搜索的概念”,以便做出我心目中的想法会很棒。
答案 0 :(得分:0)
我希望将图表存储为adjacency list。这也非常适合您存储边缘重量的要求。您可以使用城市名称的哈希值来更快地查找和比较顶点。
答案 1 :(得分:0)
要解决帖子的标题,在结构中存储指针,引用相同类型的结构是完全有效的,并且一直在链表中使用,这与你的用例非常相似 - 例如任何时候你需要将类似的结构链接在一起。
看看at this page。
我看到你有一个额外的指向,你可以有一个指向结构的指针数组。看起来对我来说是一种合理的方法。