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

来源:互联网 发布:有没有正规的网络兼职 编辑:程序博客网 时间:2024/06/18 06:57
/*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*/
原创粉丝点击