目录
1. 创建结构体
typedef struct DoubleLinkNode
{
/*
双链表
DoubleLinkNode 表示双链表单个结点
*/
ElemType data;
struct DoubleLinkNode *prior, *next;
}DoubleLinkNode;
2. 定义增加新节点(动态申请空间)的函数createDoubleLinkListNode
DoubleLinkNode *createDoubleLinkListNode(ElemType element)
{
/*
新增一个双链表结点
*/
DoubleLinkNode *newNode = (DoubleLinkNode *)malloc(sizeof(DoubleLinkNode));
if (newNode == NULL)
{
printf("申请空间失败!!!\n");
}else{
newNode->data = element;
newNode->next = NULL;
newNode->prior = NULL;
return newNode;
}
}
3. 获取双链表长度
int GetLengh_doublelink(DoubleLinkNode *doubleList)
{
/*
获取双链表长度
*/
int num = 0;
while(doubleList->next != NULL)
{
num++;
doubleList = doubleList->next;
}
return num;
}
4. 遍历并打印双链表
void DoubleLinkListPrint(DoubleLinkNode *doubleList)
{
/*
遍历并打印双链表
*/
DoubleLinkNode *cur = doubleList;
if (doubleList == NULL)
{
//空表
printf("null\n");
}else{
//非空表
printf("null <- ");
while (cur != NULL)
{
printf("%d -> ", cur->data);
cur = cur->next;
}
printf("null\n");
}
}
5. 双链表尾部插入元素
void DoubleLinkListPushBack(DoubleLinkNode **doubleList, ElemType element)
{
/*
双链表尾插
*/
//1. 空表
DoubleLinkNode *newNode = createDoubleLinkListNode(element);
if (*doubleList == NULL)
{
*doubleList = newNode;
}
//2. 非空
else{
DoubleLinkNode *tail = *doubleList;
//找到尾结点
while (tail->next != NULL)
{
tail = tail->next;
}
//将新的结点插入尾结点后面
tail->next = newNode;
newNode->prior = tail;
}
}
6. 双链表尾部删除元素
void DoubleLinkListPopBack(DoubleLinkNode **doubleList)
{
/*
单链表尾部删除结点
*/
//1. 空表
if (*doubleList == NULL)
{
printf("空表,无结点可删除\n");
}
//2. 非空
else{
DoubleLinkNode *tail = *doubleList;
DoubleLinkNode *pre = NULL; //记录前一个结点
//找到尾结点
while (tail->next != NULL)
{
pre = tail; //存储删除结点前一个结点
tail = tail->next;
}
pre->next = NULL; //将删除结点的前一个结点的next设为null
free(tail); //释放删除结点空间
tail = NULL;
}
}
7. 双链表头部插入元素
void DoubleLinkListPushFront(DoubleLinkNode **doubleList, ElemType element)
{
/*
双链表头部插入元素
*/
DoubleLinkNode *newNode = createDoubleLinkListNode(element);
// 1. 空表
if (*doubleList == NULL)
{
*doubleList = newNode;
}
// 2. 非空表
else{
DoubleLinkNode *tamp = *doubleList;
*doubleList = newNode;
newNode->next = tamp;
}
}
8. 双链表头部删除元素
void DoubleLinkListPopFront(DoubleLinkNode **doubleList)
{
/*
双链表头部删除元素
*/
// 1. 空表
if (*doubleList == NULL)
{
printf("空表,无需删除结点。\n");
}
// 2. 非空表
else{
DoubleLinkNode *tamp = *doubleList;
*doubleList = (*doubleList)->next;
(*doubleList)->prior = NULL;
free(tamp);
tamp = NULL;
}
}