2015-09-27 62 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

谢谢!我正在尝试代码 –