目录
目录
正文:
双向链表的定义:
双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。
Dlist.h
// 带头+双向+循环链表增删查改实现
#pragma once
typedef int LTDataType;
typedef struct ListNode
{
LTDataType data;
struct ListNode* next;
struct ListNode* prev;
}ListNode;
// 初始化链表
void DListInit(ListNode** pHead);
// 双向链表销毁
void ListDestory(ListNode** pHead);
// 双向链表打印
void ListPrint(ListNode* pHead);
// 双向链表尾插
void ListPushBack(ListNode* pHead, LTDataType x);
// 双向链表尾删
void ListPopBack(ListNode* pHead);
// 双向链表头插
void ListPushFront(ListNode* pHead, LTDataType x);
// 双向链表头删
void ListPopFront(ListNode* pHead);
// 双向链表查找
ListNode* ListFind(ListNode* pHead, LTDataType x);
// 双向链表在pos的前面进行插入
void ListInsert(ListNode* pos, LTDataType x);
// 双向链表删除pos位置的节点
void ListErase(ListNode* pos);
//*****************测试******************//
void Test();
DList.c
#include"DList.h"
#include<stdio.h>
#include<malloc.h>
#include<assert.h>
ListNode* BuyDlistNode(LTDataType data)
{
ListNode*newNode = (ListNode*)malloc(sizeof(ListNode));
if (NULL == newNode)
{
assert(0);
return NULL;
}
newNode->data = data;
newNode->next = NULL;
newNode->prev = NULL;
return newNode;
}
// 初始化链表
void DListInit(ListNode** pHead)
{
assert(pHead);
*pHead = BuyDlistNode(0);//这个值随便填
(*pHead)->next = *pHead;
(*pHead)->prev = *pHead;
}
// 双向链表尾插
void ListPushBack(ListNode* pHead, LTDataType x)
{
ListInsert(pHead, x);
}
// 双向链表尾删
void ListPopBack(ListNode* pHead)
{
assert(pHead);
ListErase(pHead->prev);
}
// 双向链表头插
void ListPushFront(ListNode* pHead, LTDataType x)
{
ListInsert(pHead->next, x);
}
// 双向链表头删
void ListPopFront(ListNode* pHead)
{
assert(pHead);
ListErase(pHead->next);
}
// 双向链表查找
ListNode* ListFind(ListNode* pHead, LTDataType x)
{
}
// 双向链表在pos的前面进行插入
void ListInsert(ListNode* pos, LTDataType x)
{
ListNode *newNode = NULL;
if (NULL == pos)
return;
newNode = BuyDlistNode(x);
newNode->prev = pos->prev;
newNode->next = pos;
pos->prev->next = newNode;
pos->prev = newNode;
}
// 双向链表删除pos位置的节点
void ListErase(ListNode* pos)
{
if (NULL == pos)
return;
pos->prev->next = pos->next;
pos->next->prev = pos->prev;
free(pos);
}
// 双向链表销毁
void ListDestory(ListNode** pHead)
{
assert(pHead);
ListNode* cur = (*pHead)->next;
while (cur != pHead)
{
(*pHead)->next = cur->next;
free(cur);
cur = (*pHead)->next;
}
free(*pHead);
*pHead = NULL;
}
// 双向链表打印
void ListPrint(ListNode* pHead)
{
assert(pHead);
ListNode*cur = pHead->next;
while (cur != pHead)
{
printf("%d", cur->data);
cur = cur->next;
}
printf("\n");
}
void Test()
{
ListNode* head = NULL;
DListInit(&head);
ListPushBack(head, 1);
ListPushBack(head, 2);
ListPushBack(head, 3);
ListPushBack(head, 4);
ListPushBack(head, 5);
ListPushBack(head, 6);
ListPrint(head);
ListPushFront(head, 0);
ListPrint(head);
ListPopFront(head);
ListPrint(head);
ListPopBack(head);
ListPopBack(head);
ListPrint(head);
ListDestory(&head);
}
20210518.c
写一个test.c让程序开始运行
#include"DList.h"
int main()
{
Test();
return 0;
}
运行结果:
像链表这种题多画图很容易解决的,感谢小伙伴们的支持与帮助,希望大家都可以越来越好!