2015-11-28 61 views
0

有人可以爲我解釋這段代碼嗎?結構標籤和花括號之後有什麼區別?

typedef char AirportCode[4]; 

typedef struct NodeTag{ 
    AirportCode Airport; 
    struct NodeTag *link; 
}Node; 

Node *L; 

這是我的數據結構類中的一段代碼。這段代碼實現了將數據保存在鏈表節點中。我想了解的是NodeTag一般用於什麼?是否當你希望結構持有另一個迭代,缺乏一個更好的詞,結構內部的結構呢? NodeTag和在大括號之後放置的內容(在本例中爲「Node」)之間有什麼區別?

+0

在定義NodeTag之後,不再使用「Node NodeTag varName」創建變量,而是使用「Node varName」。所以它只是試圖避免寫「結構」關鍵字。 – 11thdimension

+1

@Martin我不認爲這真的是重複的 - 這裏的OP是詢問'NodeTag'與'Node',而您提議的dupe中的示例使用未命名的結構。如果有的話,這個問題的提議([在C++中'struct'和'typedef struct'之間的區別?](http://stackoverflow.com/q/612328/643383))是一個更好的選擇,只是它涵蓋了C++而不是C. – Caleb

回答

5

你兩樣東西組合成一個位置:

(1)結構聲明:

struct NodeTag{ 
    AirportCode Airport; 
    struct NodeTag *link; 
}; 

這需要你申報你的節點是這樣的:

struct NodeTag *nt; 

結構定義的大括號之後的任何內容都會聲明該類型的變量。

struct foo {int n;} a_global_variable; 

帶(2)typedef

typedef ... Node; 

,讓你簡單地說:

Node *n; 

然而,結構聲明裏面,因爲typedef不仍然存在,您仍然必須說struct NodeTag *nt而不是Node *n

+4

請注意,在這種情況下需要**一些**結構標記(這裏是'NodeTag'),因爲結構定義是遞歸的。然而,對於結構標記和類型別名使用相同的標識符是合法和常見的,例如, 'typedef struct Node {...}節點;'。 –

+0

在代碼後面它去... 節點* L,* temp; L =(Node *)malloc(sizeof(Node)); L-Link = NULL; temp =(Node *)malloc(sizeof(Node)); L => Link = temp; 如果L->鏈接的類型是NodeTag而temp是類型節點,這是如何實現的。我試圖實現類似於我正在處理的另一個程序的某些內容,並且使用此代碼作爲指南的一些內容,並且我一直在收到兼容性錯誤。 –

+0

@AndyStevenLlactahuamani,因爲他們是相同的類型,技術上:) typedef只是一個別名機制。雖然這是有道理的,但你會得到一個警告,你可能必須做一個演員 - 因爲你作爲一個程序員知道他們是相同的,這不是最好的做法,但你可以相應地施放。 –

相關問題