学习数据结构的链表章节,如果对结构体的基础知识掌握不牢,就很难理解,下面先带大家理解结构体知识基础
- struct 结构体类型名
- {
- 数据类型名1 成员名1;
- 数据类型名1 成员名1;
- ...
-
- 数据类型名n 成员名n;
-
- };
我们自己定义的结构体类型地位上等价于int char,只是用起来稍微麻烦些
间接定义法
- struct 结构体类型名
- {
- 数据类型名1 成员名1;
- 数据类型名1 成员名1;
- ...
-
- 数据类型名n 成员名n;
-
- };
- struct 结构体类型名 变量名;
直接定义法
- struct 结构体类型名
- {
- 数据类型名1 成员名1;
- 数据类型名1 成员名1;
- ...
-
- 数据类型名n 成员名n;
-
- }变量名;
typedef是类型定义的意思。typedef struct 是为了使用这个结构体方便。
- typedef struct Student
- {
- int a;
-
- }Stu;
- //如果没有typedef就必须用struct Student stu1;来声明
- //如果有typedef就可以用Stu stu1;来声明
- //这里的“类型名”Stu实际上就是struct Student的别名
单链表分为两个部分:数据域和结构域,简单来看就是结构体与指针的结合体,与递归的思想密不可分。

模板
- typedef struct Lnode
- {
- ElemType data; //节点数据域
- struct Lnode; //节点指针域
- }Lnode,*LinkList; //LinkList为指向struct Lnode的指针
-
- // 这里的 Lnode,*LinkList 都是类型名,struct Lnode 的不同表达形式
- LinkList L; //定义链表L
- LNode *p; //定义节点指针
小贴士:
| 头结点 | 会在单链表的第一个结点之前附加一个结点,数据域可以不设任何信息,也可以记录表长等信息,指针域指向线性表的第一个元素结点 |
| 头指针 | 通常会用头指针来标识一个单链表,不管带不带头结点,头指针始终指向单链表的第一个结点 |
- void InitList(LinkList &L)
- {
- L = (LinkList)malloc(sizeof(LNode));
- L->next = NULL;
- }
程序解释:
LinkList &L:在调用函数时,实参一般不会被形参改变,但是在C++中,使用引用 & ,之后形参就可以影响实参了,LinkList L、LinkList& L、和LinkList *L这三者的区别
malloc(sizeof(LNode)),动态获取LNode的字节数,从而开辟新的空间,返回LinkList类型,详细解释请查看,malloc函数详解
- //销毁
- void DestoryList_L(LinkList &L)
- {
- LNode *p;
- while (L)
- {
- p=L;
- L=L->next;
- free(p);
- }
- }
注意事项:
因为单链表使用的空间是我们使用malloc动态开辟的,所以是需要我们手动去释放的。
但是要注意,对于单链表空间的释放,我们不能做到像顺序表那样一次性就释放掉,因为顺序表空间是一块连续的空间,但是,链表是一个一个结点构成的,一个结点malloc一次,它们不一定连续的空间,所以我们要一个结点一个结点的释放。
持续更新中...