链表数据结构

单、双链表的结点和生成

最近更新于 2022-10-09, 发布于 2022-09-29

0. 单、双链表的实现和生成函数

#ifndef DS_LINKEDLIST_H_

#define DS_LINKEDLIST_H_

template <typename DataType>
struct LNode {
	DataType data;
	LNode<DataType>* next;

	LNode() : next(nullptr) { memset(&data, 0, sizeof(DataType)); };
	LNode(DataType val) : data(val), next(nullptr) {};
	LNode(DataType val, LNode<DataType>* p) : data(val), next(p) {};
};

template <typename DataType>
using LinkedList = LNode<DataType>*;

template <typename DataType>
struct DNode {
	DataType data;
	DNode<DataType>* next;
	DNode<DataType>* pred;

	DNode() : next(nullptr), pred(nullptr) { memset(&data, 0, sizeof(DataType)); };
	DNode(DataType val) : data(val), next(nullptr), pred(nullptr) {};
	DNode(DataType val, DNode<DataType>* p) : data(val), next(p), pred(nullptr) {};
	DNode(DataType val, DNode<DataType>* p, DNode<DataType>* q) : data(val), next(p), pred(q) {};
};

template <typename DataType>
using DList = DNode<DataType>*;

template <typename DataType>
struct DFNode {
	unsigned int freq;
	DataType data;
	DFNode<DataType>* next;
	DFNode<DataType>* pred;

	DFNode() : freq(0), next(nullptr), pred(nullptr) { memset(&data, 0, sizeof(DataType)); };
	DFNode(DataType val) : freq(0), data(val), next(nullptr), pred(nullptr) {};
	DFNode(DataType val, DFNode<DataType>* p) : freq(0), data(val), next(p), pred(nullptr) {};
	DFNode(DataType val, DFNode<DataType>* p, DFNode<DataType>* q) : freq(0), data(val), next(p), pred(q) {};
};

template <typename DataType>
using DFList = DFNode<DataType>*;

#include <vector>
using std::vector;

template <typename DataType, typename ListNodeType>
ListNodeType* createSingleList(vector<DataType> initData, bool hasHead = true, bool isCyclic = false)
{
    ListNodeType* list = new ListNodeType;
    ListNodeType* newNode = nullptr;

    if (!hasHead) {
        list->data = initData.at(0);
    }
    if (isCyclic) {
        list->next = list;
    }

    for (size_t index = 0; index < ((hasHead) ? initData.size() : initData.size() - 1); ++index) {
        newNode = new ListNodeType(initData.at(initData.size() - 1 - index), list->next);
        list->next = newNode;
    }

    return list;
}

template <typename DataType, typename ListNodeType>
ListNodeType* createDoubleList(vector<DataType> initData, bool hasHead = true, bool isCyclic = false)
{
    ListNodeType* list = new ListNodeType;
    ListNodeType* newNode = nullptr;

    if (!hasHead) {
        list->data = initData.at(0);
    }
    if (isCyclic) {
        list->next = list;
        list->pred = list;
    }

    for (size_t index = 0; index < ((hasHead) ? initData.size() : initData.size() - 1); ++index) {
        newNode = new ListNodeType(initData.at(initData.size() - 1 - index), list->next);
        list->next = newNode;
        newNode->pred = list;
        if (newNode->next != nullptr) {
            newNode->next->pred = newNode;
        }
    }

    return list;
}
#endif

附录

重要内容更新日志