- 双链表顾名思义就是:两个单链表能够相互的链接起来。
- 如图所示:

- 废话不多说,我们直接上代码:首先要创建一个双链表就需要有:头文件,主文件和测试文件
分别是:(test.c List.h List.c)。
- 首先就是:初始化文件,它所对应的List.h 的代码为:
cs
#pragma once
#include<stdio.h>
typedef int LTDataType;
//定义双链表节点的结构
typedef struct ListNote
{
LTDataType data;
struct ListNote* next;
struct ListNote* prev;
}LTNode;
//声明双链表中提供的方法
//初始化
LTNode* LTInit(); //申请节点
void LTDesTroy(LTNode* phead);
LTNode* LTBuyNode(LTDataType x);
这个就是头文件所包含的初始化代码。第一步:就是要定义一个:结构体。来代表说明要创造一个基本骨架。
它所对应的List.c的代码为:
cs
#define _CRT_SECURE_NO_WARNINGS 1
#include"List.h"
void LTDesTroy(LTNode* phead)
{
//对应头节点
LTNode* pcur = phead->next;
while (pcur != phead)
{
printf("%d->", pcur->data);
pcur = pcur->next;
}
printf("\n");
}
//申请节点
LTNode* LTBuyNode(LTDataType x)
{
LTNode* node = (LTNode*)malloc(sizeof(LTNode));
if (node == NULL)
{
perror("malloc fail");
exit();
}
node->data = x;
node->next = node->prev = node;
}
LTNode* LTInit()
{
LTNode* phead = LTBuyNode(-1);
return phead;
}
首先就是要创建,申请一个空间,将所对应的x存入刚申请的空间中,这样做的好处就是:便于用x来指定下一个空间。方便第一个尾节点 与第二个的头节点相对应。
- 下一步就是:尾插,为什么呢?是因为:给定一个空间,要在其空间的尾部插上x,这样才能传入到限一个空间的头部。
则对应尾插的List.h的代码是:
cs
void LTPushBack(LTNode* phead, LTDataType x);
相对来说比较的简单,它就是函数的声明而已:
则对应尾插的 List.c****的代码为:
cs
void LTPushBack(LTNode* phead, LTDataType x)
{
assert(phead);//断言
LTNode* newnode = LTBuyNode(x);
newnode->prev = phead->prev;
newnode->next = newnode;
phead->prev->next = newnode;
phead->prev = newnode;
}
简简单单几行代码就能搞定了。
- 第二部:头插,和尾插基本一样,不过一个是在尾部,另一个是在头部插入。
则对应头插的List.h的代码是:
cs
void LTPushFront(LTNode* phead, LTDataType x);
则对应头插的 List.c****的代码为:
cs
void LTPushFront(LTNode* phead, LTDataType x)
{
assert(phead);
LTNode* newnode = LTBuyNode(x);
newnode->next = phead->next;
newnode->prev = phead;
phead->next->prev = newnode;
phead->next = newnode;
}
基本上和尾插相似,但不完全一样,主要是:头插中,头部插入到下一个节点的头部。