链表节点实现技巧–struct的妙用
作者能力有限, 如果您在阅读过程中发现任何错误, 还请您务必联系本人,指出错误, 避免后来读者再学习错误的知识.谢谢!
废话
C 语言虽然只提供了非常简单的语法,但是丝毫不影响 C 语言程序员使用 C 来实现很多让人叹为观止的高级功能.
本文介绍一项在 C 语言中非常常见的链表节点实现的一个技巧.
也许你看过了好几本 C 语言的书籍,也看到过相关的介绍,但是你却没有很在意,那么这里我们来详细的学习一下.
接下来,我们将描述一个链表节点的实现,先不要失望,它的实现可能并不像所想的那么简单.
节点的定义
typedef struct _LIST_ENTRY {
struct _LIST_ENTRY *Next;
} LIST_ENTRY, *PLIST_ENTRY;
LIST_ENTRY 代表双向链表的一个节点. Next 是指向下一个节点的指针.
但是对于上述节点,我们没法使用它, 因为它除了能表示一个节点之外, 无法包含其他任何额外的信息.
好,这里我们假设我们想创建一个表示学生的链表,我们先定义一下学生结构吧.
typedef struct _STUDENT {
char name[64];
int age;
} STUDENT, *PSTUDENT;
我们随手就写出来一个表示学生的结构体,它很简单,是因为这里我们只是用它来说明我们如果使用 LIST_ENTRY, 而并不想讲解如果构建一个学生管理系统.
为了让 STUDENT 结构可以成为链表的一个节点,我们需要将他们合并一下. 然后我们的 STUDENT 结构就变成了这样:
typedef struct _STUDENT {
LIST_ENTRY list_entry;
char name[64];
int age;
} STUDENT, *PSTUDENT;
注意,我们将 LIST_ENTRY 结构嵌套在 STUDENT 结构的开始位置,这将使得后续的实现简单很多. 放在其他位置当然也是可以的,但是却会把事情搞得复杂起来.
使用
既然结构体定义好了,下面我们就来看看,我们如何使用这个结构体,以及这个结构体体的巧妙之处,这也是本文想要表达的东西.
再次重申一下,本文是想描述这个结构体用法的妙处,无意于实现一个完整的链表. 因此只给出了最简陋的版本.
#