c++使用鏈表實現列表List

使用雙向鏈表實現:

// 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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章