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*/
阅读全文
0 0
- 04_线性表的链式存储结构---循环链表
- 线性表的链式存储结构---循环链表
- 数据结构_线性表_链式存储_单向循环链表的基本操作
- 数据结构_线性表_链式存储_双向循环链表的基本操作
- 数据结构:线性表的链式存储结构_单链表
- 02_线性表的链式存储结构---单链表
- 【线性表】链式存储结构之:循环链表
- 线性表-链式存储结构之循环链表
- 大话数据结构四:线性表的链式存储结构(单向循环链表)
- 大话数据结构四:线性表的链式存储结构(单向循环链表)
- JAVA数据结构之线性表的链式存储结构——循环链表
- 03_线性表的链式存储结构---静态链表
- 05_线性表的链式存储结构---双向链表
- 线性表_顺序存储结构和链式存储结构的优缺点比较(区别)
- 线性表的链式存储结构
- 链式存储结构的线性表
- 线性表的链式存储结构
- 【数据结构】线性表的链式存储结构
- POJ 1200 Crazy Search 笔记
- mysql case when then else 用法
- 02_线性表的链式存储结构---单链表
- plant(植物)
- 03_线性表的链式存储结构---静态链表
- 04_线性表的链式存储结构---循环链表
- 05_线性表的链式存储结构---双向链表
- RTP over RTSP(TCP)
- WIN10电脑,安装双系统(CentOS 6.4) 各种出错
- 项目调错笔记
- 06_栈的顺序存储
- 07_栈的链式存储
- RTP协议解析
- 08_栈的实例1---括号匹配