使用双向链表实现:
// Project1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
///*
/*
#ifdef _MSC_VER
#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )
#endif
*/
#include <iostream>
#include <windows.h>
using namespace std;
class Node
{
public:
void* data;
Node *prev;
Node *next;
Node(void* data) {
this->data = data;
}
~Node() {
free(&this->data);
free(prev);
free(next);
}
};
class List
{
public:
List();
~List();
Node* getItem(long index);
void append(void* data);
void delItem(long index);
void insert(long index, void* node);
Node* pop(long index);
void setItem(long index, void* data);
private:
long len;
Node *head;
Node *tail;
};
List::List()
{
len = 0;
Node *node = new Node(0);
this->head = node;
this->tail = node;
}
List::~List()
{
for (size_t i = 0; i < this->len; i++)
{
free(this->pop(i));
}
}
Node* List::getItem(long index) {
if (index < 0 || index >= len) {
return NULL;
}
long half = len * 10 / 2;
Node* res;
if ((index + 1) * 10 > half) {
res = this->head;
for (size_t i = 1; i < this->len - index; i++)
{
res = res->prev;
}
}
else {
res = this->tail->next;
for (size_t i = 0; i < index; i++)
{
res = res->next;
}
}
return res;
}
void List::append(void* data) {
Node* node = new Node(data);
this->head->next = node;
node->prev = this->head;
this->len++;
node->next = this->tail;
this->head = node;
this->tail->prev = node;
}
void List::delItem(long index) {
free(this->pop(index));
}
void List::insert(long index, void* data) {
Node* node = new Node(data);
if (index == this->len) {
return this->append(node);
}
Node* cur = this->getItem(index);
Node* prev = cur->prev;
prev->next = node;
node->prev = prev;
node->next = cur;
cur->prev = node;
this->len++;
}
Node* List::pop(long index) {
Node* res = this->getItem(index);
Node* prev = res->prev;
Node* next = res->next;
prev->next = next;
next->prev = prev;
this->len--;
if (index == this->len - 1) {
this->head = prev;
}
return res;
}
void List::setItem(long index, void* data) {
Node* node = this->getItem(index);
node->data = data;
}
int main()
{
std::cout << "Hello World!\n";
List* list = new List();
int arr[] = {0,1,2,3,4,5,6 };
for (size_t i = 0; i < 7; i++)
{
list->append(&arr[i]);
}
for (size_t i = 0; i < 7; i++)
{
cout << *(int *)(list->getItem(i)->data) <<"asdsadasd"<< endl;
}
delete list;
}