介绍
特点
双链表特点:可进可退,存储密度更低一点
单链表特点:无法逆向检索,有时候不太方便
代码定义
typedef struct DNode{//定义双链表结点类型
Elemtype data;//数据域
struct DNode *prior,*next;//前驱和后继指针
}DNode,*DLinkList;
操作
双链表的初始化
/**
* 双链链表
* @author five-five
* @created 2022/5/12
*
*/
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
typedef struct DNode {
int data;
struct DNode *prior;
struct DNode *next;
} DNode, *DLinkList;
/**
* 初始化双链链表
* @param dLinkList 双链链表指针的指针
* @return true?成功:失败
*/
bool initDLinkList(DLinkList *dLinkList) {
*dLinkList = (DNode *) malloc(sizeof(DNode));
if (*dLinkList == NULL) {
return false;
}
(*dLinkList)->prior = NULL;
(*dLinkList)->next = NULL;
return true;
}
/**
* 双链链表是否为空
* @param dLinkList 双链链表
* @return true?空:非空
*/
bool empty(DLinkList dLinkList) {
return dLinkList->next == NULL;
}
插入(后插)
/**
* 双链表的插入,脑补一下
* @param dLinkList 双链链表
* @param dNode 链表结点
* @return true?成功:失败
*/
bool insertNextDNode(DNode *p, DNode *s) {
if (p == NULL || s == NULL) {
return false;
}
s->next = p->next;
if (p->next != NULL) {
p->next->prior = s;
}
s->prior = p;
p->next = s;
return true;
}
删除结点
/**
* 删除链表结点
* @param p 链表结点
* @return true?成功:失败
*/
bool deleteDNode(DNode *p) {
if (p == NULL) {
return false;
}
//后继节点操作相关
DNode *next = p->next;
DNode *prior = p->prior;
if (next != NULL) {
prior->next = next;
next->prior = prior;
}
if (next == NULL) {
prior->next = NULL;
}
//是否内存
free(p);
return true;
}
测试方法
int main() {
DLinkList dLinkList = NULL;
initDLinkList(&dLinkList);
DLinkList dLinkList1 = NULL;
initDLinkList(&dLinkList1);
DLinkList dLinkList2 = NULL;
initDLinkList(&dLinkList2);
insertNextDNode(dLinkList, dLinkList1);
insertNextDNode(dLinkList1, dLinkList2);
deleteDNode(dLinkList1);
return 1;
}