双向链表
定义
:每个节点有两个指针域,分别知道直接前驱
和直接后继
节点 , 特点是可以重任意节点
出发,从两个方向
遍历链表
数据结构
typedef struct node {
int data;
struct node *font ;
struct node *next;
} NODE, *LinkList;
插入
// p 为链中节点 s 为待插入节点 把s 放在p前
s->font = p->font ; // s 的前驱在是 p 的前驱节点
p->font->next = s ; // p 前驱节点的 后继节点是 s
s->next = p ;
p->font =s ;
删除
p->font->next = p->next ; // p 的前驱节点的后继 是 p 的后继节点
p->next->font = p->font ; // p 的后继节点 的前驱节点 是 p 的前驱节点
free(p) ;
循环链表
定义
:在单向或双向链表的基础上令表尾节点的指针指向第一个节点,构成循环
静态链表
定义
: 借数组来描述线性表的链式存储,用数组元素的下标表示元素所在节点的指针
指针域代表的下一个值得地址
数据结构
typedef struct node {
int index; // 指针
int data;
} NODE;
// 遍历
void showAll(NODE[] n) {
int i = 0;
while (true) {
printf("%d\n", n[i].data);
if (n[i].index == 0) { // 如果index 为 0 表示后面没有数据了
break;
} else {
i = n[i].index;
}
}
}
插入: 需要判断是否有新的空间
删除: 就需要标记