04_线性表的链式存储结构---循环链表

/*circle.h*/
#pragma once

#include <iostream>
using namespace std;
struct CircleListNode {

    CircleListNode *next;
};


struct CircleList {

    CircleListNode header;
    CircleListNode *cursor;/*游标,指示上次浏览过的位置,约瑟夫问题*/
    int length;
};


class circle {
    public:
        circle();
        ~circle();
        CircleList* CircleList_Create();

        void CircleList_Destroy(CircleList* list);

        void CircleList_Clear(CircleList* list);

        int CircleList_Length(CircleList* list);

        int CircleList_Insert(CircleList* list, CircleListNode* node, int pos);

        CircleListNode* CircleList_Get(CircleList* list, int pos);

        CircleListNode* CircleList_Delete(CircleList* list, int pos);

        CircleListNode* CircleList_DeleteNode(CircleList* list, CircleListNode* node);

        CircleListNode* CircleList_Reset(CircleList* list);

        CircleListNode* CircleList_Current(CircleList* list);

        CircleListNode* CircleList_Next(CircleList* list);
};

/*circle.cpp*/
#include "circle.h"



circle::circle() {
}


circle::~circle() {
}

CircleList * circle::CircleList_Create() { //o(1)

    CircleList *list = new CircleList;
    if ( nullptr!=list ) {
        list->header.next = nullptr;
        list->cursor = nullptr;
        list->length = 0;
    }
    return list;
}

void circle::CircleList_Destroy(CircleList * list) {//o(1)

    if ( nullptr!=list ) {
        delete list;
        list = nullptr;
    }
}

void circle::CircleList_Clear(CircleList * list) {//o(1)

    if ( nullptr!=list ) {
        list->cursor = nullptr;
        list->header.next = nullptr;
        list->length = 0;
    }
}

int circle::CircleList_Length(CircleList * list) {//o(1)

    int ret = -1;
    if ( nullptr!=list ) {
        ret = list->length;
    }
    return ret;
}

int circle::CircleList_Insert(CircleList * list, CircleListNode * node, int pos) {//o(n)

    int ret = (list!=nullptr)&&(pos>=0)&&(node!=nullptr) ;
    if ( ret ) {
        CircleListNode *current = &list->header;
        for (int i = 0; (i<pos)&&(current->next!=nullptr) ; ++i ) {
            current = current->next;
        }
        node->next = current->next;
        current->next = node;
        if ( list->length==0 ) {
            list->cursor = node;
        }
        ++list->length;
        if (current == &list->header)/*如果在头节点的位置插入,则将尾节点的指针指向头*/
        {
            CircleListNode* last = CircleList_Get(list, list->length - 1);

            last->next = current->next;
        }
    }
    return ret ;
}

CircleListNode * circle::CircleList_Get(CircleList * list, int pos) {//o(n)

    CircleListNode *ret = nullptr;
    if ( (list!=nullptr)&&(0<=pos)&&(list->length>0) ) {
        pos = pos % list->length;
        CircleListNode *current = &list->header;
        for (int i = 0; i < pos; ++i ) {
            current = current->next;
        }
        ret = current->next;
    }
    return ret ;
}

CircleListNode * circle::CircleList_Delete(CircleList * list, int pos) {//o(n)

    CircleListNode *ret = nullptr;
    if ( (list!=nullptr)&&(0<=pos)&&(list->length > 0)) {
        pos = pos%list->length;
        CircleListNode *current = &list->header;
        CircleListNode *first = list->header.next;
        CircleListNode *last = CircleList_Get(list,list->length-1) ;
        for (int i = 0; i < pos; ++i ) {
            current = current->next;
        }
        ret = current->next;
        current->next = ret->next;
        --list->length;
        if (list->length == 0) {
            list->cursor = nullptr;
            list->header.next = nullptr;
        }
        if ( first==ret ) {/*如果删除是头节点,则尾节点和头节点指针都要重新赋值*/
            list->header.next = ret->next;
            last->next = ret->next;
        }
        if ( list->cursor==ret ) {/*如果游标刚好在待删除节点位置处,则要改动游标*/
            list->cursor = ret->next;
        }
    }
    return ret ;
}

CircleListNode * circle::CircleList_DeleteNode(CircleList * list, CircleListNode * node) {//o(n)

    CircleListNode *ret = nullptr ;
    int i = 0;
    if ( (list!=nullptr)&&(node!=nullptr) ) {
        CircleListNode *current = &list->header;
        for ( i = 0; i < list->length;++i ) {
            if ( current->next==node ) {
                ret = current->next;
                break;
            }
            current = current->next;
        }
        if (ret != nullptr) {
            CircleList_Delete(list , i);
        }
    }
    return ret ;
}

CircleListNode * circle::CircleList_Reset(CircleList * list) {//o(1)

    CircleListNode *ret = nullptr;
    if ( list!=nullptr ) {
        list->cursor = list->header.next;
    }
    return ret;
}

CircleListNode * circle::CircleList_Current(CircleList * list) {//o(1)

    CircleListNode *ret = nullptr;
    if ( list!=nullptr ) {
        ret = list->cursor;
    }
    return ret;
}

CircleListNode * circle::CircleList_Next(CircleList * list) {//o(1)

    CircleListNode *ret = nullptr;
    cout << "------"<<((Values*)list->cursor)->v<< endl;
    if ( (list != nullptr)&&(list->cursor!=nullptr) ) {
        ret = list->cursor;
        list->cursor = ret->next;
    }
    return ret ;
}
/*main.cpp*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值