2010-11-09 60 views
0

我一直在C上工作了幾天的DisjointSet任務。我理解函數find(w /和w/o路徑壓縮),在函數鏈接中使用rank來對一個集合執行聯合時。但是我遇到了C語法問題。DisjointSet疑難問題

我們必須製作一組記錄,其中包含排名和該集的關鍵字。所以我的結構看起來:

typedef struct DisjointSet_t { 
    int data; 
    int key; 
} DisjointSet; 

我的問題是在聲明數組操作設定。我爲該集合初始化數組時出了問題。以下是CreateSet代碼片段:

static DisjointSet *S; 

void CreateSet(int numElements){ 
    DisjointSet *t; 

    if (numElements > 0){ 
    t = (DisjointSet *)malloc(sizeof(DisjointSet)); 
    } 

    if(S != NULL){ 
    S = t[numElements+1]; 
    } 
} 

如果我在Java中實現了這一點,我認爲它會更容易一些。我該如何改進?我是否錯過了解如何在C中初始化類數組?

回答

2

嗯...有

malloc(sizeof(DisjointSet)) 

您類型DisjointSet的一個對象預留空間。要爲你需要乘20級的對象......

malloc(20 * sizeof(DisjointSet)) 

分配空間,一旦你有20個對象,在一個數組,數組從0到19

1

變量S和T的類型都是DisjointSet的*所以你應該能夠公正分配噸至S.

if (S != NULL) 
{ 
    S = t; 
} 

你也需要初始化靜態爲null

static DisjointSet *S = NULL; 
+3

全局數據初始化爲0。並不是明確地這樣做是一個壞主意。 – 2010-11-09 01:45:25

2

如果您嘗試分配數組,則需要爲所有數組元素分配空間:malloc(sizeof(DisjointSet) * numElements)

另外,你可以像Jeremy Simon所描述的那樣指定S。