C语言与Queues/linked列表
C language and Queues/linked lists
谁能解释一下下面的代码。我是 C 的新手,正在努力弄清楚。为什么我们最后有 queueNodeT?
typedef char queueElementT;
typedef struct queueNodeTag {
queueElementT element;
struct queueNodeTag *next;
} queueNodeT;
让我们逐个分解。
这一行只是告诉你queueElementT
在这里被定义为char
。这意味着您可以写 queueElementT
或 char
,两者都可以。
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;
}
三个案例要处理。
q
为null
,queue
为空。 Return0.
q.next
是null
,queue
只包含一个元素。 Return 1.
- 重复,直到
q.next
与 null
分开,不断递增 i
。我的更好的名字可能是 elements
或类似的东西。
此代码未经测试,因为我目前手头没有 C 编译器。有没有人可以验证一下没有错误?
queueNodeT 是 typedef 语句试图创建的类型的名称。
另一种指定方式是:
struct queueNodeTag {
...
};
typedef struct queueNodeTag queueNodeT;
在 C(相对于 C++)中,"struct 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"。我更喜欢为此 [and "snake case" 表示法使用后缀,而不是您示例中的 "camel hump" 表示法。
谁能解释一下下面的代码。我是 C 的新手,正在努力弄清楚。为什么我们最后有 queueNodeT?
typedef char queueElementT;
typedef struct queueNodeTag {
queueElementT element;
struct queueNodeTag *next;
} queueNodeT;
让我们逐个分解。
这一行只是告诉你queueElementT
在这里被定义为char
。这意味着您可以写 queueElementT
或 char
,两者都可以。
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;
}
三个案例要处理。
q
为null
,queue
为空。 Return0.q.next
是null
,queue
只包含一个元素。 Return 1.- 重复,直到
q.next
与null
分开,不断递增i
。我的更好的名字可能是elements
或类似的东西。
此代码未经测试,因为我目前手头没有 C 编译器。有没有人可以验证一下没有错误?
queueNodeT 是 typedef 语句试图创建的类型的名称。
另一种指定方式是:
struct queueNodeTag {
...
};
typedef struct queueNodeTag queueNodeT;
在 C(相对于 C++)中,"struct 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"。我更喜欢为此 [and "snake case" 表示法使用后缀,而不是您示例中的 "camel hump" 表示法。