深入解析C++的循环链表与双向链表设计的API实现

2020-01-06 14:55:35于海丽

  • 获取当前游标指向的数据元素
  • 将游标重置指向链表中的第一个数据元素
  • 将游标移动指向到链表中的下一个数据元素
  • 将游标移动指向到链表中的上一个数据元素
  • 直接指定删除链表中的某个数据元素

    双向链表重要技术场景

    C++,循环链表,双向链表

    循环链表插入结点技术场景

    C++,循环链表,双向链表

    循环链表删除结点技术场景

    C++,循环链表,双向链表

    优点:双向链表在单链表的基础上增加了指向前驱的指针
    功能上双向链表可以完全取代单链表的使用
    双向链表的Next,Pre和Current操作可以高效的遍历链表中的所有元素
    缺点:代码复杂

    代码示例:
     dlinklist.h  

    
    // 双向链表API声明 
     
    #ifndef _DLINKLIST_H_ 
    #define _DLINKLIST_H_ 
     
    typedef void DLinkList; 
     
    typedef struct _tag_DLinkListNode 
    { 
      _tag_DLinkListNode *next; 
      _tag_DLinkListNode *pre; 
    }DLinkListNode; 
     
    // 创建链表 
    DLinkList* DLinkList_Create(); 
     
    // 销毁链表 
    void DLinkList_Destroy(DLinkList *list); 
     
    // 清空链表 
    void DLinkList_Clear(DLinkList *list); 
     
    // 获取链表长度 
    int DLinkList_Length(DLinkList *list); 
     
    // 在pos位置,插入结点node 
    int DLinkList_Insert(DLinkList *list, DLinkListNode *node, int pos); 
     
    // 获取pos位置的结点,返回给上层 
    DLinkListNode* DLinkList_Get(DLinkList *list, int pos); 
     
    // 删除pos位置的结点 
    DLinkListNode* DLinkList_Delete(DLinkList *list, int pos); 
     
    // 删除值为node的结点 
    DLinkListNode* DLinkList_DeleteNode(DLinkList* list, DLinkListNode* node); 
     
    // 重置游标 
    DLinkListNode* DLinkList_Reset(DLinkList* list); 
     
    // 获取当前游标所指的结点 
    DLinkListNode* DLinkList_Current(DLinkList* list); 
     
    // 获取游标当前所指结点,然后让游标指向下一个结点 
    DLinkListNode* DLinkList_Next(DLinkList* list); 
     
    // 获取游标当前所指结点,然后让游标指向前一个结点 
    DLinkListNode* DLinkList_Pre(DLinkList* list); 
     
     
    #endif