带头节点的双向循环链表基本操作 --- (尾插,尾删,查找节点,指定位置插入,指定位置删除)

链表分为单向链表和双向链表,前两篇都是关于单向链表的函数,这篇是有关双向循环链表的函数,

首先,我们我要知道双向循环链表长什么样子

这里写图片描述

双向循环链表结构体:

typedef int DataType;

typedef struct DListNode {
    struct DListNode* _pNext;
    struct DListNode* _pPre;
    DataType _data;

}DListNode;

函数:

DListNode* BuyDListNode(DataType data)//创建节点
{
    DListNode* pNewNode = (DListNode*)malloc(sizeof(DListNode));
    if (NULL == pNewNode)
    {
        assert(0);
        return NULL;
    }
    pNewNode->_pNext = NULL;
    pNewNode->_pPre = NULL;
    pNewNode->_data = data;
}

void DListInit(DListNode** pHead)//初始化//输出型参数
{
    assert(pHead);
    *pHead = BuyDListNode(0);
    (*pHead)->_pNext = (*pHead);
    (*pHead)->_pPre = (*pHead);
}

void DListPushBack(DListNode* pHead,DataType data)//尾部插入
{
    DListNode* pNewNode = NULL;
    assert(pHead);
    pNewNode = BuyDListNode(data);
    //尾插
    pNewNode->_pPre = pHead->_pPre;
    pNewNode->_pNext = pHead;
    pNewNode->_pPre->_pNext = pNewNode;
    pHead->_pPre = pNewNode;

}
void DListPopBack(DListNode* pHead)//尾部删除
{
    DListNode* pDelNode = NULL;
    assert(pHead);
    pDelNode = pHead->_pPre;
    if (pDelNode != pHead)
    {
        pDelNode->_pPre->_pNext = pDelNode->_pNext;
        pDelNode->_pNext->_pPre = pDelNode->_pPre;
        free(pDelNode);
    }
}


DListNode* DListFind(DListNode* pHead,DataType data)//查找节点
{
    DListNode* pCur;
    assert(pHead);
    pCur = pHead->_pNext;
    while (pCur != pHead)
    {
        if (data == pCur->_data)
            return pCur;
        pCur = pCur->_pNext;
    }
    return NULL;

}

void DListInsert(DListNode* pos, DataType data)//插到pos前面
{
    DListNode* pNewNode = NULL;
    //assert(pos);
    if (NULL == pos)
        return;
    pNewNode = BuyDListNode(data);
    pNewNode->_pNext = pos;
    pNewNode->_pPre = pos->_pPre;
    pos->_pPre = pNewNode;
    pNewNode->_pPre->_pNext = pNewNode;
}
void DListErase(DListNode* pos)//删除pos节点
{
    if (NULL == pos)
        return;
    pos->_pPre->_pNext = pos->_pNext;
    pos->_pNext->_pPre = pos->_pPre;
    free(pos);
}

有问题的欢迎留言,

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
双向循环链表是一种链表结构,它的每个节点都有两个指针,一个指向前一个节点,一个指向后一个节点。与单向链表不同的是,双向循环链表的头节点的前一个节点指向节点节点的后一个节点指向头节点,形成一个循环。以下是双向循环链表基本操作: 1. 头文件 ```c #include <stdio.h> #include <stdlib.h> ``` 2. 双向链表的基本结构 ```c typedef struct node { int data; struct node *prev; // 指向前一个节点 struct node *next; // 指向后一个节点 } Node, *DoubleLinkedList; ``` 3. 初始化双链表 ```c DoubleLinkedList init() { DoubleLinkedList head = (DoubleLinkedList)malloc(sizeof(Node)); head->prev = head; head->next = head; return head; } ``` 4. 双链表判空 ```c int isEmpty(DoubleLinkedList head) { return head->next == head; } ``` 5. 双链表 ```c void insertTail(DoubleLinkedList head, int data) { Node *newNode = (Node *)malloc(sizeof(Node)); newNode->data = data; newNode->prev = head->prev; newNode->next = head; head->prev->next = newNode; head->prev = newNode; } ``` 6. 双链表头 ```c void insertHead(DoubleLinkedList head, int data) { Node *newNode = (Node *)malloc(sizeof(Node)); newNode->data = data; newNode->prev = head; newNode->next = head->next; head->next->prev = newNode; head->next = newNode; } ``` 7. 创建一个新节点 ```c Node *createNode(int data) { Node *newNode = (Node *)malloc(sizeof(Node)); newNode->data = data; newNode->prev = NULL; newNode->next = NULL; return newNode; } ``` 8. 在某一节点插入一个新节点 ```c void insertBefore(DoubleLinkedList head, Node *node, int data) { Node *newNode = createNode(data); newNode->prev = node->prev; newNode->next = node; node->prev->next = newNode; node->prev = newNode; } ``` 9. 删除当前节点 ```c void deleteNode(DoubleLinkedList head, Node *node) { node->prev->next = node->next; node->next->prev = node->prev; free(node); } ``` 10. 双链表头 ```c void deleteHead(DoubleLinkedList head) { if (isEmpty(head)) { printf("List is empty.\n"); return; } deleteNode(head, head->next); } ``` 11. 双链表 ```c void deleteTail(DoubleLinkedList head) { if (isEmpty(head)) { printf("List is empty.\n"); return; } deleteNode(head, head->prev); } ``` 12. 双链表打印 ```c void printList(DoubleLinkedList head) { if (isEmpty(head)) { printf("List is empty.\n"); return; } Node *p = head->next; while (p != head) { printf("%d ", p->data); p = p->next; } printf("\n"); } ``` 13. 查找 ```c Node *search(DoubleLinkedList head, int data) { Node *p = head->next; while (p != head) { if (p->data == data) { return p; } p = p->next; } return NULL; } ``` 14. 销毁双链表 ```c void destroy(DoubleLinkedList head) { Node *p = head->next; while (p != head) { Node *temp = p; p = p->next; free(temp); } free(head); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值