C 如何在结构本身内部使用结构指针

C 如何在结构本身内部使用结构指针,c,data-structures,C,Data Structures,我正在学习以下C代码: typedef struct msg *m_; struct msg { long from; long to; m_ link; }; m_ queue; 我想看一个例子来解释指针的作用,即结构本身内部结构的m_link 非常感谢。要学究一点:link是一个指针m不是指针,而是typedef。它用于避免在结构定义中说“struct msg*link;” 正如上面注释中所回答的,队列由指向第一个项目的指针表示,该指针有指向第二个项目的指针(如果有

我正在学习以下C代码:

typedef struct msg *m_;
struct msg
{
   long  from;
   long   to;
   m_ link;
};
m_ queue;
我想看一个例子来解释指针的作用,即结构本身内部结构的
m_link


非常感谢。

要学究一点:
link
是一个指针
m
不是指针,而是typedef。它用于避免在结构定义中说“struct msg*link;”

正如上面注释中所回答的,队列由指向第一个项目的指针表示,该指针有指向第二个项目的指针(如果有),依此类推,直到到达空指针为止

struct linked_stack
{
    int data;
    struct linked_stack *next;
};

void linked_stack_push(linked_stack **stck, int data)
{
    struct linked_stack *node = malloc(sizeof(struct linked_stack));

    if (node != NULL)
    {
        node->data = data;
        node->next = *stck;
    }

    *stck = node;
}

int linked_stack_top(linked_stack **stck)
{
    if (*stck != NULL)
        return (*stck)->data;
    return 0; /* stack is empty */
}

void linked_stack_pop(linked_stack **stck)
{
    struct linked_stack *node = *stck;

    if (*stck != NULL)
    {
        *stck = node->next;
        free(node);
    }
}

在构建这样的列表时,一定要小心,不要让节点指向自身或任何前驱体,否则会出现无限循环追尾。

指向结构本身内部结构类型的指针通常用于链接列表、树等。在您的示例中,它指的是队列实现

下面是使用链表的堆栈实现的一个非常简单的示例。函数需要堆栈指针的地址,空堆栈是空指针

struct linked_stack
{
    int data;
    struct linked_stack *next;
};

void linked_stack_push(linked_stack **stck, int data)
{
    struct linked_stack *node = malloc(sizeof(struct linked_stack));

    if (node != NULL)
    {
        node->data = data;
        node->next = *stck;
    }

    *stck = node;
}

int linked_stack_top(linked_stack **stck)
{
    if (*stck != NULL)
        return (*stck)->data;
    return 0; /* stack is empty */
}

void linked_stack_pop(linked_stack **stck)
{
    struct linked_stack *node = *stck;

    if (*stck != NULL)
    {
        *stck = node->next;
        free(node);
    }
}
用法示例:

int main(void)
{
    struct linked_stack *stack = NULL;

    linked_stack_push(&stack, 10);
    printf("top of stack = %d\n", linked_stack_top(&stack));
    linked_stack_pop(&stack);

    return 0;
}

它通常用于每个结构“节点”指向下一个的链表。不要使用指针!这混淆了语义,使代码更难阅读/维护。@Olaf的建议在这里没有被广泛接受。自1979年以来,我看到和使用的大多数C代码都使用typedef作为指针。然而,有些人采取在名字后面加上
\u p
的做法。不管怎样,我都同意
m
是个坏名字。@cliffordheath-可能是因为我很晚才开始使用C(1985年),我从未见过指针的typedef。克里夫·希思:在你陈述之前,你应该检查一下其他的问题。如果您想要混淆您的代码并混淆其他维护人员,那么欢迎您。甚至有一些编码标准明确地支持位到类型定义指针,而neforcing
typedef struct
。然而,在70年代,我们用手工输入机器代码,不久前用穿孔卡片输入,许多人认为结构化编程是为娘娘腔设计的。如今,维护/可读性已成为编程的主要问题。Tempora mutantur.学究气:
m
struct msg*
的别名/同义词,因此它很好地指向。您应该使用标记来格式化文本。请告诉我“别名”的C标准定义。我想你会发现,
m
实际上是一个typedef,这个别名在标准中没有定义(尽管“别名”对于代码优化者来说是个问题);这似乎是从其他地方开始的,你是对的,它与标准本身中的
typedef
无关。它实际上是一个或“同义词”(而人们可能会讨论“别名”是否不是“同义词”的同义词)。