簡體   English   中英

有向圖的C輸入

[英]C Input for Directed Graphs

我們被告知輸入文件將是一個簡單的數字列表:

1 3 4

2 3

3 4

4 1 2

其中第一個數字是源節點,而后續的數字是它的相鄰節點。

我試圖弄清楚如何最好地存儲它。 我想首先初始化一個“圖形”,一個包含所有這些節點的數組。 然后,逐行讀取文件后,我會將根節點存儲到圖數組中,然后使用以下數字更新該節點的列表(相鄰節點),直到到達行尾為止,對每行重復此操作,直到EOF。

但是我在如何初始化圖形上苦苦掙扎,我是否只是假設一定的大小並在達到大小后立即重新分配()? 我是否首先讀取文件並計算行數以找出大小,然后重新讀取文件以存儲節點? 還有其他辦法嗎?

這是我的數據結構的代碼:

int initialize (Graph *mygraph, int MaxSize) {
  mygraph->MaxSize = MaxSize;
  mygraph->table = (Node *)malloc(sizeof(Node) * MaxSize);
  return 0;
}

  int insert_node (Graph *mygraph, int n, char *name) {
  mygraph->table[n].name = strdup(name);
  mygraph->table[n].outdegree = 0;
  return 0;
}

  int insert_link (Graph *mygraph, int source, int target) {
  List *newList = (List *)malloc(sizeof(List));
  newList->index = target;
  newList->next = mygraph->table[source].outlist;
  mygraph->table[source].outlist = newList;
  return 0;
}

因此,在讀取文件后,

  1. 我初始化圖。

  2. 我讀取了第一個數字,並將其存儲為新的圖形節點。

  3. 我閱讀下一個數字,直到打到\\ n,然后將它們存儲為指向上述根節點的圖形鏈接。

  4. 我會針對每一行執行此操作,直到達到EOF。

如您所見,在讀取整個文件之前,我不知道“ MaxSize”是什么。

謝謝! 我對C相當陌生,所以如果做任何愚蠢的事,我都感到抱歉。

你可以有一些初步猜測MaxSize (例如,8),需要你的數據(可能是當成長graph->MaxSize += graph->MaxSize/2 )使用realloc ,或只是malloc -ing一個更大的新塊,復制里面的舊塊,然后free該舊塊)。 不要忘記檢查任何malloccallocrealloc調用的成功結果,它們可能(很少)失敗。

注意,我不知道如何聲明您的GraphNode類型(只是猜測)。

我假設並猜測您已經聲明了類似

 typedef struct node_st Node;
 typedef struct graph_st Graph;
 struct node_st {
    char*name; // strdup-ed
    unsigned outdegree;
 };
 struct graph_st {
   unsigned MaxSize;
   Node* table; //calloc-ed, of allocated size MaxSize
 };

因此,例如您的insert_node函數可能是

void insert_node (Graph *mygraph, int n, char *name) {
  assert (mygraph != NULL);
  assert (n >= 0);
  assert (name != NULL && *name != (char)0);
  unsigned maxsize = mygraph->MaxSize;
  if (maxsize <= n) {
    unsigned newmaxsize = n + maxsize/2 + 1;
    Node* newtable = calloc (newmaxsize, sizeof(Node));
    if (!newtable) 
       perror("growing table in graph"), exit(EXIT_FAILURE);
    for (unsigned i=0; i<maxsize; i++) 
       newtable[i] = mygraph->table[i];
    free (mygraph->table);
    mygraph->table = newtable;
    mygraph->MaxSize = newmaxsize;
  };
  mygraph->table[n].name = strdup(name);
  mygraph->table[n].outdegree = 0;
}

您可能不需要insert_node返回值(否則,您將不會總是返回0)。 因此,我將其void返回函數(即“過程”或“例程”)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM