#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);
};
#include "circle.h"
circle::circle() {
}
circle::~circle() {
}
CircleList * circle::CircleList_Create() {
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) {
if ( nullptr!=list ) {
delete list;
list = nullptr;
}
}
void circle::CircleList_Clear(CircleList * list) {
if ( nullptr!=list ) {
list->cursor = nullptr;
list->header.next = nullptr;
list->length = 0;
}
}
int circle::CircleList_Length(CircleList * list) {
int ret = -1;
if ( nullptr!=list ) {
ret = list->length;
}
return ret;
}
int circle::CircleList_Insert(CircleList * list, CircleListNode * node, int pos) {
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) {
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) {
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) {
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) {
CircleListNode *ret = nullptr;
if ( list!=nullptr ) {
list->cursor = list->header.next;
}
return ret;
}
CircleListNode * circle::CircleList_Current(CircleList * list) {
CircleListNode *ret = nullptr;
if ( list!=nullptr ) {
ret = list->cursor;
}
return ret;
}
CircleListNode * circle::CircleList_Next(CircleList * list) {
CircleListNode *ret = nullptr;
cout << "------"<<((Values*)list->cursor)->v<< endl;
if ( (list != nullptr)&&(list->cursor!=nullptr) ) {
ret = list->cursor;
list->cursor = ret->next;
}
return ret ;
}