链表
链表的基本概念
- 链表是一种常用的数据结构,它通过指针将一些列数据结点,连接成一个数据链。相对于数组,链表具有更好的动态性(非顺序存储)。
- 数据域用来存储数据,指针域用于建立与下一个结点的联系。
- 建立链表时无需预先知道数据总量的,可以随机的分配空间,可以高效的在链表中的任意位置实时插入或删除数据。
- 链表的开销,主要是访问顺序性和组织链的空间损失。
数组和链表的区别
- 数组:一次性分配一块连续的存储区域。
优点:随机访问元素效率高
缺点:1) 需要分配一块连续的存储区域(很大区域,有可能分配失败)2) 删除和插入某个元素效率低 - 链表:无需一次性分配一块连续的存储区域,只需分配n块节点存储区域,通过指针建立关系。
优点:1) 不需要一块连续的存储区域 2) 删除和插入某个元素效率高
缺点:随机访问元素效率低
有关结构体的自身引用
typedef struct A
{
int a;
int b;
char *p;
}A;
//1、结构体可以嵌套另外一个结构体的任何类型变量
//2、结构体嵌套本结构体普通变量(不可以)
// 本结构体的类型大小无法确定,类型本质:固定大小内存块别名
//3、结构体嵌套本结构体指针变量(可以)
// 指针变量的空间能确定,32位, 4字节, 64位, 8字节
typedef struct B
{
int a;
A tmp1; //ok
A *p1; //ok
//struct B tmp2; //err 普通变量
struct B *next; //32位, 4字节, 64位, 8字节
}B;
链表节点
链表的节点实际上是结构体变量,此结构体包含数据域和指针域:
- 数据域用来存储数据
- 指针域用于建立与下一个结点的联系,当此节点为尾节点时,指针域的值为NULL
typedef struct Node
{
//数据域
int id;
char name[50];
//指针域
struct Node *next;
}Node;