双向链表(非STL)

一、链表简介

链表的优势是:能在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;
}

猜你喜欢

转载自blog.csdn.net/acm_durante/article/details/105252427