【问题标题】:C language and Queues/linked listsC语言和队列/链表
【发布时间】:2015-09-27 21:17:21
【问题描述】:

谁能解释一下下面的代码。我是 C 的新手,并试图弄清楚。为什么我们最后有 queueNodeT?

typedef char queueElementT;

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

【问题讨论】:

  • 这是给typedef的。它结合了 struct 声明和结构的 typedef 名称。
  • typedef 声明声明了一个类型的别名。在这种情况下,queueElementT 被声明为char 的别名。此外,queueNodeT 被声明为struct queueNodeTag 的别名,struct queueNodeTag 被进一步定义为具有指定成员的struct

标签: c linked-list queue


【解决方案1】:

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”,例如“pMystructName”。我更喜欢对此使用后缀 [和“蛇形”表示法,而不是您的示例中的“驼峰”表示法]。

【讨论】:

    【解决方案2】:

    让我们逐个分解。

    这一行只是告诉你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 是空的。返回 0。
    2. q.nextnullqueue 只包含一个元素。返回 1。
    3. 重复直到q.nextnull 分开,然后递增i。我的一个更好的名字可能是elements 或类似的名称。

    此代码未经测试,因为我目前手头没有 C 编译器。有空的人或许可以验证没有犯错?

    【讨论】:

      猜你喜欢
      • 2021-05-20
      • 1970-01-01
      • 1970-01-01
      • 2014-05-07
      • 2014-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多