WHCSRL 技术网

带头双向循环链表~C语言(附代码)~简单实现

带头双向循环链表是链表中用起来最方便的一种了.                       

                                                                                                                                                                                                                 

 对这种链表的实现较为简单,我们来看看具体实现的功能有哪些吧

目录

创建返回链表的头结点 

双向链表销毁

双向链表打印

双向链表尾插

 双向链表尾删

双向链表头插

双向链表头删

双向链表查找

 双向链表在pos的前面进行插入

双向链表删除pos位置的节点


​​​​​​​

  1. // 创建返回链表的头结点.
  2. ListNode* ListCreate();
  3. // 双向链表销毁
  4. void ListDestory(ListNode* pHead);
  5. // 双向链表打印
  6. void ListPrint(ListNode* pHead);
  7. // 双向链表尾插
  8. void ListPushBack(ListNode* pHead, LTDataType x);
  9. // 双向链表尾删
  10. void ListPopBack(ListNode* pHead);
  11. // 双向链表头插
  12. void ListPushFront(ListNode* pHead, LTDataType x);
  13. // 双向链表头删
  14. void ListPopFront(ListNode* pHead);
  15. // 双向链表查找
  16. ListNode* ListFind(ListNode* pHead, LTDataType x);
  17. // 双向链表在pos的前面进行插入
  18. void ListInsert(ListNode* pos, LTDataType x);
  19. // 双向链表删除pos位置的节点
  20. void ListErase(ListNode* pos);

创建返回链表的头结点 

  1. // 创建返回链表的头结点.
  2. ListNode* ListCreate()
  3. {
  4. ListNode* Head = (ListNode*)malloc(sizeof(ListNode));
  5. Head->next = Head;
  6. Head->prev = Head;
  7. return Head;
  8. }

双向链表销毁

  1. // 双向链表销毁
  2. void ListDestory(ListNode* pHead)
  3. {
  4. assert(pHead);
  5. ListNode* cur = pHead->next;
  6. while (cur!=pHead)
  7. {
  8. ListNode* next = cur->next;
  9. free(cur);
  10. cur = next;
  11. }
  12. //最后释放头节点
  13. free(pHead);
  14. }

双向链表打印

  1. // 双向链表打印
  2. void ListPrint(ListNode* pHead)
  3. {
  4. assert(pHead);
  5. ListNode* cur = pHead->next;
  6. while (cur != pHead)
  7. {
  8. printf("%%d ", cur->data);
  9. cur = cur->next;
  10. }
  11. printf(" ");
  12. }

双向链表尾插

  1. // 双向链表尾插
  2. void ListPushBack(ListNode* pHead, LTDataType x)
  3. {
  4. assert(pHead);
  5. //法一
  6. //ListNode*prev = pHead->prev;
  7. //ListNode*NewNode = (ListNode*)malloc(sizeof(ListNode));
  8. //NewNode->data = x;
  9. //prev->next = NewNode;
  10. //NewNode->next = pHead;
  11. //法二
  12. ListInsert(pHead->prev, x);
  13. }

 双向链表尾删

  1. // 双向链表尾删
  2. void ListPopBack(ListNode* pHead)
  3. {
  4. assert(pHead);
  5. //assert(pHead-> next!= pHead);
  6. //ListNode*tail=pHead->prev;
  7. //ListNode* prev = tail->prev;
  8. //prev->next = pHead;
  9. //pHead->next = prev;
  10. //free(tail);
  11. ListErase(pHead->prev);
  12. }


双向链表头插

  1. // 双向链表头插
  2. void ListPushFront(ListNode* pHead, LTDataType x)
  3. {
  4. //assert(pHead);
  5. //ListNode* tmp = (ListNode*)malloc(sizeof(ListNode));
  6. //tmp->data = x;
  7. // ListNode*head = pHead->next;
  8. // tmp->next = head;
  9. // tmp->prev = pHead;
  10. // pHead->next = tmp;
  11. // head->prev = tmp;
  12. ListInsert( pHead->next, x);
  13. }


双向链表头删

  1. // 双向链表头删
  2. void ListPopFront(ListNode* pHead)
  3. {
  4. assert(pHead);
  5. /*assert(pHead->next != pHead);
  6. ListNode* head = pHead->next;
  7. pHead->next = head->next;
  8. head->next->prev = pHead;
  9. free(head);*/
  10. ListErase(pHead->next);
  11. }

双向链表查找

  1. // 双向链表查找
  2. ListNode* ListFind(ListNode* pHead, LTDataType x)
  3. {
  4. assert(pHead);
  5. ListNode* cur = pHead;
  6. while (cur->next != cur)
  7. {
  8. if(cur->data==x)
  9. {
  10. return cur;
  11. }
  12. cur = cur->next;
  13. }
  14. return NULL;
  15. }


 双向链表在pos的前面进行插入

  1. // 双向链表在pos的前面进行插入
  2. void ListInsert(ListNode* pos, LTDataType x)
  3. {
  4. assert(pos);
  5. ListNode* prev = pos->prev;
  6. ListNode* tmp = (ListNode*)malloc(sizeof(ListNode));
  7. tmp->data = x;
  8. prev->next = tmp;
  9. tmp->prev = prev;
  10. pos->prev = tmp;
  11. tmp->next = pos;
  12. }

双向链表删除pos位置的节点

  1. // 双向链表删除pos位置的节点
  2. void ListErase(ListNode* pos)
  3. {
  4. assert(pos);
  5. ListNode* prev = pos->prev;
  6. ListNode* next = pos->next;
  7. prev->next = next;
  8. next->prev = prev;
  9. free(pos);
  10. }

推荐阅读