一、链表简介
链表的优势是:能在O(1)的时间内插入和删除。
二、双向链表的储存
我们用结构体来储存链表的储存的数据和指向前和后的指针。
代码:
struct Node
{
int key;
Node *prve, *next;
};
可视化:
三、链表的初始化
NIL结点作为链表的头节点,然后prve与next都指向这个头节点,这样我们就创立了个空表。
代码:
Node *nil;
void init() //初始化list
{
nil = (Node *)malloc(sizeof(Node));
nil->prve = nil;
nil->next = nil;
}
可视化:
四、向链表中插入结点
原来的状态:
1、向结点a的前部插入结点x
代码:
void insert_prve_key(int key, Node *a) //在a前部插入
{
//动态申请内存
Node *x = (Node *)malloc(sizeof(Node));
//存入数据
x->key = key;
//将结点x与结点a的前一个结点进行连接
x->prve = a->prve; //步骤1
a->prve->next = x; //步骤2
//将结点x与结点a进行连接
x->next = a; //步骤3
a->prve = x; //步骤4
}
可视化:
2、向结点a后部插入结点x
代码:
void insert_next_key(int key, Node *a) //在a后部插入
{
//动态申请内存
Node *x = (Node *)malloc(sizeof(Node));
//存入数据
x->key = key;
//将结点x与结点a的后一个结点进行连接
x->next = a->next;
a->next->prve = x;
//将结点x与结点a进行连接
x->prve = a;
a->next = x;
}
可视化:
五、在链表中删除结点
代码:
//删除当前结点:
void erase_key(Node *cur)
{
if (cur == nil) //不能删除头节点,切记
return;
cur->prve->next = cur->next;
cur->next->prve = cur->prve;
free(cur);
}
可视化:
六、链表的查找
代码:
Node *serch_key(Node *cur, int key) //从cur位置开始查找
{
Node *now = cur;
while (now != nil && now->key != key)//链表的遍历
{
now = now->next;
}
return now;
}