2015-09-27 64 views
1

有人可以請解釋下面的代碼。我是C新手,並試圖找出答案。爲什麼我們最後有queueNodeT?C語言和隊列/鏈表

typedef char queueElementT; 

typedef struct queueNodeTag { 
    queueElementT element; 
    struct queueNodeTag *next; 
} queueNodeT; 
+0

這就是'typedef'。它爲struct結合了一個'struct'聲明和一個typedef名字。 –

+0

'typedef'聲明爲一個類型聲明一個別名。在這種情況下'queueElementT'被聲明爲'char'的別名。此外,'queueNodeT'被聲明爲'struct queueNodeTag'的別名,'struct queueNodeTag'被進一步定義爲具有指定成員的'struct'。 –

回答

0

queueNodeT是typedef語句嘗試創建的類型的名稱。

指定此的另一種方法是:

struct queueNodeTag { 
    ... 
}; 
typedef struct queueNodeTag queueNodeT; 

在C(相對於C++), 「結構queueNodeTag」 剛剛定義了一個名爲 「queueNodeTag」 結構。在C++ [你到達那裏],這也將定義一個名爲「queueNodeTag」型

當創建一個指針變量的結構,這是略短的使用方法:

queueNodeT *my_pointer; 

比:

struct queueNodeTag *my_pointer; 

結尾的「T」只是一個編碼約定,表示它是一個類型名稱而不是變量。你可以使用他人。我的是:

struct mystructname { 
    ... 
}; 
typedef struct mystructname mystructname_t; 
typedef mystructname_t *mystructname_p; 

使用mystructname_p,您可以更改:

struct mystructname *my_pointer; 
mystructname_t *my_pointer; 

到:

mystructname_p my_pointer; 

的 「_t」 是相當普遍的。 「_p」是我的約定,但是,我相信其他約定會將類型的指針定義爲「p < Mytype>」,例如「pMystructName」。我更喜歡在這個例子中使用後綴[和「蛇案」符號,而不是你的例子中的「駱駝駝峯」符號]。

0

讓我們逐個分解。

此行只是告訴你queueElementT在這裏定義爲char。意思是你可以寫queueElementTchar,兩者都可以。

typedef char queueElementT; 

現在這裏是實際的struct。它包含兩個變量,即它所持有的元素,在本例中爲char。然後它還會告知queue中的下一個元素。

typedef struct queueNodeTag { 
    queueElementT element; 
    struct queueNodeTag *next; 
} queueNodeT; 

更多可讀於this解答。

演示:

int count (queueNodeTag q) { 
    int i = 0; 

    if (q == null) { 
     return 0; 
    } 

    if (q.next == null) { 
     return 1; 
    } 

    while (q.next != null) { 
     q = q.next; 
     i++; 
    } 

    return i; 
} 

三起案件來處理。

  1. qnull,該queue是空的。返回0.
  2. q.nextnullqueue只包含一個元素。返回1.
  3. 重複進行,直到q.nextnull分開,增量爲i,因爲我們走了。我更好的名字可能是elements或類似的東西。

此代碼未經測試,因爲我目前沒有C編譯器。有人提供一個可能可以驗證沒有犯下錯誤?

+0

謝謝!我正在嘗試代碼 –