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。这意味着您可以写 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. qnullqueue为空。 Return0.
  2. q.nextnullqueue只包含一个元素。 Return 1.
  3. 重复,直到 q.nextnull 分开,不断递增 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" 表示法。