2017-01-09 62 views
-2

雖然解決了codechef中的許多程序中的一個,並且我遇到了單個節點可以容納任意數量節點的地址的a problem。即一個節點可以具有一個節點的地址或者兩個節點...或n節點的地址。所以,我想過使用鏈表。現在,問題是我只學習了雙向鏈表,因此我可以編寫程序來了解節點可以處理多少個地址。 一旦我想到了這一點:在C中聲明結構中的n元素

struct node 
{ 
int n ; 
for(int i=0;i<n,i++) 
    struct addrs[i] ; 
} 

但似乎不合邏輯。所以如果有人能告訴我如何編寫一個節點可以處理地址的結構,那將是非常有幫助的。

+0

或者你只是持有一個指向動態分配的'struct addrs'指針的數組... – StoryTeller

回答

0

首先這裏是你想要的東西(你可能需要根據你的編譯器的一些投加):

struct addrs; 
struct node 
{ 
    int n; 
    struct addrs *a; 
} 


void init (struct *node, int n) 
{ 
    node->n = n; 
    node->a = malloc(sizeof(addrs)*n); 
} 

void destroy(struct *node) 
{ 
    node->n = 0; 
    free(node->a); 
    node->a = 0; 
} 

現在,你必須明白爲什麼

struct node 
{ 
int n ; 
for(int i=0;i<n,i++) 
    struct addrs[i] ; 
} 

不工作。

struct關鍵字表示您定義了一個新的類型來保存結構化數據。你不能有任何C可執行代碼,所以你不能在那裏有一個for循環。

此外,編譯期間必須知道結構的大小,如果您的示例正在工作,結構的大小node將取決於n並且在程序執行前無法知道。

+0

我們不知道OP想要什麼,問題是如何不清楚。 – Olaf

0

一旦我想到了這一點,

struct node 
{ 
int n ; 
for(int i=0;i<n,i++) 
    struct addrs[i] ; 
} 

不,你不能使用的語句(如循環)申報結構的成員。此外,結構的大小必須在編譯時已知,並且在運行時永遠不會改變。

所以,我想過用鏈表

是的,一個鏈表是一種可能的方式來實現這一點。

現在,問題是我已經學會只高達雙向鏈表

這是沒有問題的。雙向鏈表的知識就足夠了。


但是,也許指針數組是一個更簡單的選擇。

由於結構體的大小是靜態的,但數組的大小在運行時可能會發生變化,因此需要動態分配數組,並在其中存儲一個指向它的指針。