• 【双链表增删查改接口的实现】


    hello 大家好呀,今天向大家分享的是双链表增删查改接口的实现,如果哪里有什么不对的地方希望各位佬帮忙指正一下。

    这次博主分享的是带头双向循环链表:

    结构最复杂,一般用在单独存储数据。实际中使用的链表数据结构,都是带头双向循环链表。另外这个结构虽然结构复杂,但是使用代码实现以后会发现结构会带来很多优势,实现反而 简单了,后面我们代码实现了就知道了。
     
    17c901c6679047498ea79efe5ef81a51.png

    目录

     

     

    1 初始化链表

    2 尾插和头插

     3 尾删和头删

    4 查找和查插和查删)

    5 释放


     

     

    1 初始化链表

    1. ListNode* ListNodeCreat(LTDataType x)
    2. {
    3. ListNode* newnode = (ListNode*)malloc(sizeof(ListNode));
    4. if (newnode)
    5. {
    6. newnode->data = x;
    7. newnode->next = NULL;
    8. newnode->prev = NULL;
    9. }
    10. return newnode;
    11. }
    12. ListNode* InitList(void)
    13. {
    14. ListNode* phead = ListNodeCreat(1);
    15. phead->next = phead;
    16. phead->prev = phead;
    17. return phead;
    18. }

    链表的初始化我们将phead的prev与next都指向phead,这里的处理在后面有一些妙用,这里就先不说了,头结点这里是通过返回值实现的,当然,通过二级指针也可以,效果都差不多。头结点是不存储数据的,只是充当哨兵的作用。

    2 尾插和头插

    尾插的具体代码:

    1. void ListPushBack(ListNode* phead, LTDataType x)
    2. {
    3. assert(phead);
    4. ListNode* tail = phead->prev;
    5. ListNode* newtail = ListNodeCreat(x);
    6. tail->next = newtail;
    7. newtail->prev = tail;
    8. newtail->next = phead;
    9. phead->prev = newtail;
    10. //ListInsert(phead, x);
    11. }

    尾插的实现很简单,都能够看懂。在这里我们就可以看见将phead的prev与next都指向phead的好处了,就算phead后面一个结点都没有依然能够处理,这样写代码就很简练了。

    头插的具体代码:

    1. void ListPushFront(ListNode* phead, LTDataType x)
    2. {
    3. assert(phead);
    4. ListNode* next = phead->next;
    5. ListNode* newnode = ListNodeCreat(x);
    6. phead->next = newnode;
    7. newnode->prev = phead;
    8. newnode->next = next;
    9. next->prev = newnode;
    10. //ListInsert(phead->next, x);
    11. }

    头插的实现也比较简单,其实把图画好就能够解决问题,这里当头结点后面一个结点都没有也能够处理。

    来看看效果:

     c9c80d941d854cd3a19a8520e82b4e04.png

     3 尾删和头删

    尾删和头删对于双链表来说也比较简单,这里就放在一起写了:

    1. void ListPopBack(ListNode* phead)
    2. {
    3. assert(phead);
    4. ListNode* tail = phead->prev;
    5. ListNode* prev = tail->prev;
    6. prev->next = phead;
    7. phead->prev = prev;
    8. free(tail);
    9. //ListErase(phead->prev);
    10. }
    11. void ListPopFront(ListNode* phead)
    12. {
    13. assert(phead);
    14. ListNode* next = phead->next->next;
    15. free(phead->next);
    16. phead->next = next;
    17. next->prev = phead;
    18. //ListErase(phead->next);
    19. }

    按部就班的写,注意不要写漏了就ok了。

    效果:

    abb8f8e714c2426eb15b4927d5cda36a.png

     

    4 查找和查插和查删)

    查找的具体代码:

    1. ListNode* ListFind(ListNode* phead, LTDataType x)
    2. {
    3. assert(phead);
    4. ListNode* cur = phead->next;
    5. while (cur != phead)
    6. {
    7. if (cur->data == x)
    8. {
    9. return cur;
    10. }
    11. else
    12. {
    13. cur = cur->next;
    14. }
    15. }
    16. return NULL;
    17. }

    与单链表一样,这个也可以改变数据:

    03276fe8cdc8427f831cabe865855482.png

     查插的具体代码:

    1. void ListInsert(ListNode* pos, LTDataType x)
    2. {
    3. assert(pos);
    4. ListNode* prev = pos->prev;
    5. ListNode* newnode = ListNodeCreat(x);
    6. prev->next = newnode;
    7. newnode->prev = prev;
    8. newnode->next = pos;
    9. pos->prev = newnode;
    10. }

    这里是在pos位前面插入数据,实现起来也比较简单。

    查删的具体代码:

    1. void ListErase(ListNode* pos)
    2. {
    3. assert(pos);
    4. ListNode* prev = pos->prev;
    5. ListNode* next = pos->next;
    6. prev->next = next;
    7. next->prev = prev;
    8. free(pos);
    9. }

    有了查删和查插后我们不难发现,头插和尾插都可以用查插实现,头删和尾删都可以用查删实现。

    头插在 phead->next前插入,尾插在phead前插入,头删位置为phead->next,尾删位置为phead->prev.

    在上面实现代码的时候注释掉的就是这种方法。


    5 释放

    1. void ListDestroy(ListNode* phead)
    2. {
    3. ListNode* cur = phead;
    4. ListNode* next = phead->next;
    5. while (cur->next!=phead)
    6. {
    7. free(cur);
    8. cur = next;
    9. next = next->next;
    10. }
    11. }

    释放链表与单链表差不多,比较容易理解。

    好了,今天的分享就到这里了,如果该文对你有帮助的话能不能3连支持一下博主呢?

    d1feff5286c941c0bd431460f56c4563.gif

     

     

  • 相关阅读:
    机器学习(17)---支持向量机(SVM)
    【软件测试】软件测试的基础概念
    线性代数的艺术
    柱形图:制作图表时,有时会遇到柱形图系列没有居中显示,例如:
    【论文精读】Geometric Structure Preserving Warp for Natural Image Stitching
    软件测试月薪28K大厂面试题 (经面试官允许可以拿走试卷)
    Stable Diffusion 3 Medium 模型
    硬件工程师经常犯的几个典型错误
    能链科技完成重点项目签约
    【数据结构】线性表(九)队列:链式队列及其基本操作(初始化、判空、入队、出队、存取队首元素)
  • 原文地址:https://blog.csdn.net/m0_68872612/article/details/126187272