1
typedef struct roads road; 
typedef struct city city;

道路があり、その端に 2 つの都市があるコードを実装しています。それらをファイルから読み取り、リンクします。構造は

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 と同じである場合 (ロサンゼルスの例のように)、「NewYork 250km LosAngeles " 道路の隣には "LosAngeles 120km Florida" があり、その逆も同様です。「LosAngeles 500km Nebraska」のようなものがファイルから読み取られる場合、最初に言及した 2 つの道路には 2 つの隣接道路と 2 つのリンクも含まれます。ROADS 配列は、現在 3 つの道路構造を格納しています。もちろん、道路構造物を作成するときは、ROADS 配列にメモリを割り当てています。

ROADS = realloc(ROADS,i*size + size);

私が間違っているポイントはどこですか?このコードをさらに開発するためのヒントは完璧です。頭の中にあることを実行するために「検索する必要があるという概念」と言っても素晴らしいでしょう。

4

2 に答える 2

0

同じタイプの構造体を参照する構造体にポインターを格納する投稿のタイトルに対処するには、完全に有効であり、リンクされたリストで常に使用されます。これは、あなたと非常によく似たユースケースです。構造体。

このページを見てください。

構造体へのポインタの配列を持つことができる余分なレベルのポインティングが行われているようです。私には合理的なアプローチのように見えます。

于 2013-12-14T14:26:10.963 に答える
0

グラフをadjacency listとして保存したいと思います。これは、エッジ ウェイトを格納するという要件にも完全に適合します。都市名のハッシュを使用して、頂点の検索と比較を高速化できます。

于 2012-06-09T11:47:12.673 に答える