网站/小程序/APP个性化定制开发,二开,改版等服务,加扣:8582-36016

循环链表是另一种形式的链式存储结构。它的特点是表中最后一个结点的指针域指向头结点,整个链表形成一个环。本文将为大家详细介绍一下循环链表的特点与使用,需要的可以了解一下

    contenteditable="true" data-cke-enter-mode="2" data-cke-saved-name="_label0" data-cke-widget-data="%7B%22url%22%3Anull%2C%22text%22%3A%22%5Cn%22%2C%22desc%22%3A%22%22%2C%22icon%22%3A%22%22%2C%22isCard%22%3Afalse%2C%22hasResquest%22%3Atrue%2C%22iconDefault%22%3A%22https%3A%2F%2Fcsdnimg.cn%2Frelease%2Fblog_editor_html%2Frelease1.9.5%2Fckeditor%2Fplugins%2FCsdnLink%2Ficons%2Ficon-default.png%3Ft%3DLA92%22%2C%22id%22%3A%22yfCT3s-1640663089382%22%2C%22classes%22%3Anull%7D" data-cke-widget-editable="text" data-cke-widget-keep-attr="0" data-cke-widget-upcasted="1" data-link-icon="https://csdnimg.cn/release/blog_editor_html/release1.9.5/ckeditor/plugins/CsdnLink/icons/icon-default.png?t=LA92" data-link-title=" " data-widget="csdnlink" title=" " name="_label0">

    存储结构示意图

    优点 : 能够通过任意结点遍历整个链表结构

    https%3A%2F%2Fcsdnimg.cn%2Frelease%2Fblog_editor_html%2Frelease1.9.5%2Fckeditor%2Fplugins%2FCsdnLink%2Ficons%2Ficon-default.png%3Ft%3DLA92%22%2C%22id%22%3A%22My84fS-1640663089368%22%2C%22classes%22%3Anull%7D" data-cke-widget-editable="text" data-cke-widget-keep-attr="0" data-cke-widget-upcasted="1" data-link-icon="https://csdnimg.cn/release/blog_editor_html/release1.9.5/ckeditor/plugins/CsdnLink/icons/icon-default.png?t=LA92" data-link-title=" " data-widget="csdnlink" title=" " name="_label1">

    初始化循环链表 

    1.循环链表的结点

    typedef struct CircularNode {
        ElementType date; //数据域
        struct CircularNode* next; //指向下一个结点的指针域
      
    }CircularNode;


    2.循环链表结构 

    typedef struct CircularLinkList {
        CircularNode* next;   //指向第一个结点的头指针,头指针
        int length;          
    }CircularLinkList;

     

    循环链表的插入

    需要考虑两种情况

    1.插入的链表长度为 0   node -> next = node;

    2.插入的链表长度不为0 node -> next = clList -> next   lastNode -> next = node 

    首位置

    代码实现

    其他位置

    代码实现(总)

    void InsertCircularLinkList(CircularLinkList* clList, int pos, ElementType element)
    {
        //创建一个空节点
        CircularLinkList* node = (CircularLinkList*)malloc(sizeof(CircularLinkList));
       node->date = element;
        node->next = NULL;
        if (pos == 1) {
            node->next = clList->next;
            if (!node->next) {
                //如果插入的链表长度为0
                node->next = node;
            }
            else {
                //如果长度不为0,就要找到链表的最后一个结点并改变其指针域
                CircularLinkList* lastNode = clList->next;
                for (int i = 1; i < clList->length; i++)
                {
                    lastNode = lastNode->next;
                }
                clList->next = node;
                clList->length++;
            }
            return;
        }
        //插入的不是第一个结点
        CircularLinkList* currNode = clList->next;
        for (int i = 1; i < pos - 1; i++)
            currNode = currNode->next;
        if (currNode) {
            node->next = currNode->next;
            currNode->next = node;
            clList->length++;
            if (pos == clList->length) {
                node->next = clList->next;
            }
        }
    }


     

    循环链表的删除

    1.操作的为第一个元素

    代码实现

    2.操作元素不为第一个元素

    代码实现

    代码实现(总)

    ElementType DeleteCircularLinkList(CircularLinkList* clList, int pos)
    {
        ElementType element;
        element.id = -999;
        if (pos == 1) {
            CircularLinkList* node = clList->next;
            if (node) {
                //找到最后一个结点,改变其指针域的指向
                CircularLinkList* lastNode = clList->next;
                for (int i = 1; i < clList->length; i++) {
                    lastNode = lastNode->next;
                }
                clList->next = node->next;
                lastNode->next = clList->next;
                free(node);
                clList->length--;
            }
            return;
        }
        CircularLinkList* preNode;
        CircularLinkList* node = clList->next;
        for (int i = 1; node && i < pos; i++) {
            preNode = node;
            node = node->next;
        }
        if (node) {
            element = node->date;
            preNode->next = node->next;
            free(node);
            clList->length--;
        }
        return element;
    }


     

    循环链表的常见操作 

    已知 P 结点是循环链表的中间结点,通过该节点遍历循环链表

    代码实现

    CircularNode* GetCircularLinkListNode(CircularLinkList* clList, ELementType element)
    {
        CircularNode* node = clList->next;
        if (!node) return NULL;
        do {
            if (element.id == node->date.id && strcmp(element.name, node->date.name) == 0) {
                return node;
            }
        } while (node == clList->next);
        return NULL;
    }


     


    评论 0

    暂无评论
    0
    0
    0
    立即
    投稿
    发表
    评论
    返回
    顶部