C 语言笔记: 链表节点实现技巧--struct的妙用

本文介绍了C语言中通过嵌套struct实现链表节点的一种技巧,将LIST_ENTRY结构体置于STUDENT结构体开头,允许将任何结构体加入链表,无需为每个结构体添加额外的链接字段。文章通过示例展示了如何使用这种结构以及其巧妙之处。
摘要由CSDN通过智能技术生成

    链表节点实现技巧–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 结构的开始位置,这将使得后续的实现简单很多. 放在其他位置当然也是可以的,但是却会把事情搞得复杂起来.

使用

既然结构体定义好了,下面我们就来看看,我们如何使用这个结构体,以及这个结构体体的巧妙之处,这也是本文想要表达的东西.

再次重申一下,本文是想描述这个结构体用法的妙处,无意于实现一个完整的链表. 因此只给出了最简陋的版本.

#
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值