C语言学习-双链表(Link List)数据结构类型
双向链表是链表中的一种,双链表是操作系统中常用的数据结构,其特点就是,每个链表节点都具有两个指向同类型数据结构的指针变量成员。
双向链表的节点的数据结构类型模型代表:
1 struct p_list_node 2 { 3 struct p_list_node *p_next; //指向后继节点 4 struct p_list_node *p_prev; //指向前置节点 5 };
给已有的结构体数据类型起一个容易理解识别的别名:
1 typedef struct p_list_node p_list;
###双向链表的初始化函数:
1 void rt_list_init(p_list *l) 2 { 3 l->p_next = l->p_prev = l; 4 }
双向链表的初始化,就是让链表节点的成员指针指向本节点自己。
###双向链表中,向指定节点后面插入节点方法:
1 void rt_list_insert_after(p_list *l,p_list *n) 2 { 3 l->p_next->p_prev = n; //先让指定节点的后继节点指向新插入的节点 4 n->p_next = l->p_next; //再让新插入的节点指向它自己的后继节点 5 6 l->p_next = n; //让指定节点指向新插入的节点 7 n->p_prev = l; //让新插入的节点指向指定节点 8 }
思维方式:后插法,先让新节点和指定节点的后继节点建立指向关系,再让新插入节点和指定节点建立指向关系。
###双向链表中,向指定节点前面插入节点方法:
1 void rt_list_insert_before(p_list *l,p_list *n) 2 { 3 l->p_prev->p_next = n; //先让指定节点的前置节点指向新插入的节点 4 n->p_prev = l->p_prev; //再让新插入的节点指向指定节点的前置节点 5 6 l->p_prev = n; //让指定节点指向新插入的节点 7 n->p_next = l; //在让新插入的节点指向指定节点 8 }
思维方式:前插法,先让新节点和指定节点的前置节点建立指向关系,再让新插入节点和指定节点建立指向关系。
###双向链表中,删除指定节点方法:
1 void rt_list_remove(p_list *n) 2 { 3 n->p_next->p_prev = n->p_prev; //先将要删除的节点的后继节点指向要删除节点的前置节点 4 n->p_prev->p_next = n->p_next; //再将要删除的节点的前置节点指向要删除节点的后继节点 5 6 n->p_next = n->p_prev =n; //将删除的节点指向自己 7 }
思维方式:删除指定节点,先将待删除节点的后继节点指向待删除节点的前置节点,再将待删除节点的前置节点指向待删除节点的后继节点。