数据结构----线性表(链式存储)
1.链表的头指针和头结点
头指针是指向第一个结点的指针。
如果存在头结点,那么头指针则指向头结点,头结点的指针指向存储的首结点(第一个元素);
如果不存在头结点,那么头指针直接指向存储的首结点。
2.为何可以在定义结构体时可以在结构体中定义指向自己类型的指针
struct list_node_t
{
int data;
struct list_node_t * next;
};
这样并不会报错, 编译器会计算结构体的大小, 在计算这个结构体大小的时候不会有问题(32位机器,int是4字节, 指针也是4字节, 共8字节).如果你不用指针就会报错, 因为那时候编译器还不知道结构体大小。
3.单链表的读取
查找单链表中的第i个元素,从第一个元素开始,一个一个的向后查找,直到找到第i个。
p=L->next; j=1; 让p指向链表的第一个结点,j为计数器
while(p&&j<i)
{
p=p->next;
++j;
}
4.链表插入
链表插入操作,s->next=p->next;p->next=s;顺序不能颠倒
5.链表删除
链表删除操作:p->next=p->next->next其实就执行了这一个操作
添加中介q:q=p->next;p->next=q->next
6.头插法创建链表
链表表头插入操作:p->next=L->next;L-next=p;
7.尾插法创建链表
链表表尾插入操作:r->next=p;r=p;r代表的是尾结点
7.循环链表
将链表的尾结点的空指针改为头结点的地址,即组成了带有头结点的循环链表,判断带有头结点的循环链表是否为空,可以判断尾结点的指针等不等于头指针,如果相等,则为空
8.用尾指针代替头指针的循环链表
用尾指针替代头指针,使检索头结点和尾结点的复杂度都为O(1),头结点rear->next->next
9.静态链表
结点的组成跟链表差不多,用一个游标代替了指针域,用结构体数组来容纳所有的元素,构成一个静态的链表。
10.静态链表的插入
先从备用链表中取一个数据空间,然后接下来的操作跟动态链表一致。
11.静态链表的删除
删除需要删除的结点,然后将结点的空间归还给备用链表。
12.循环链表尾指针表示法
可以很快的查找到链表的头结点和尾结点
13.双向链表
在每一个元素添加另一个指针域,使其指向它的前驱
14.双向链表添加元素
双向链表添加元素:s->prior=p;s->next=p-next;
p->next->prior=s;p->next=s;顺序必须这样,非常严格
15.双向链表删除元素
双向链表删除元素:p->prior->next=p->next;
p->next->prior=p->prior;