双链表图
双链表大致结构
创建双链表结构体
//双链表结构
typedef struct DListNode
{
struct DListNode* prev; //指向上一个节点
struct DListNode* next; //指向下一个节点
DListInt data; //数据域
}DList; //定义简称
开辟链表空间
//开辟空间
DList* DListFound(DListInt x)
{
DList* NewNode = (DList*)malloc(sizeof(DList)); //开辟空间
NewNode->prev = NULL; //置空
NewNode->next = NULL; //置空
NewNode->data = x; //数据域
return NewNode; //开辟空间返回地址
}
创建头节点
int main()
{
DList* s = DListFound(0); //哨兵位
system("pause");
return 0;
}
尾插入数据
//尾插
void DListPushback(DList* Node,DListInt x)
{
DList* NewNode = DListFound(x); //传数据
DList* Tail = Node->prev; //找到尾部
if (NewNode == NULL) //判断
{
return;
}
if (Node->prev == NULL) //判断是否第一次后插
{
Node->prev = NewNode;
Node->next = NewNode;
NewNode->prev = Node;
NewNode->next = Node;
}
else //之后插入
{
Tail->next = NewNode;
NewNode->prev = Tail;
NewNode->next = Node;
Node->prev = NewNode;
}
}
打印双链表
//打印
void DListPrint(DList* Node)
{
DList* NewNode = Node->next; //头节点下一个
while (NewNode != Node) //如果等于头节点就没需要打印了
{
printf("%d->", NewNode->data); //打印数据
NewNode = NewNode->next; //遍历
}
printf("NULL\n");
}
尾删
//尾删
void DListTailDelete(DList* Node)
{
if (Node->prev != Node) //如果等于头节点就没必要删除了
{
DList* Tail = Node->prev;
DList* NewNode = Tail->prev;
Node->prev = NewNode;
NewNode->next = Node;
free(Tail); //释放内存
Tail = NULL;
}
else
{
printf("没有数据删除\n");
}
}
效果
以上是我对双链表的理解,中间插入什么的我就不说了,原理差不多。