自学内容网 自学内容网

链表头文件大更新!!!

引言

原文章:链表简介及自制链表操作头文件_自己写一个链表头文件-CSDN博客

此次更新添加了更多功能,让改头文件更 人性化

安装教程见原文章。

介绍 linked_list.h 头文件

linked_list.h 是一个 C++ 头文件,定义了一个模板类 LinkedList,用于实现单向链表。链表中的每个节点由 Node 结构体表示,包含数据和指向下一个节点的指针。LinkedList 类提供了多种操作链表的方法,包括插入、删除、查找、打印、获取链表大小、判断链表是否为空等。此外,还定义了链表的加法和减法运算。

头文件内容
#ifndef LINKED_LIST_H
#define LINKED_LIST_H
#pragma once

#include <iostream>

template <typename T>
struct Node {
    T data;
    Node* next;
    Node(T data) : data(data), next(0) {}  // 使用 0 替换 nullptr
};

template <typename T>
class LinkedList {
public:
    LinkedList();
    ~LinkedList();

    void insert(T data);
    void remove(T data);
    Node<T>* search(T data);
    void print() const;
    int size() const;
    bool isEmpty() const;
    Node<T>* getHead() const;
    Node<T>* getTail() const;

    // 加法运算
    LinkedList<T>& operator+(const LinkedList<T>& other);
    // 减法运算
    LinkedList<T>& operator-(const LinkedList<T>& other);

private:
    Node<T>* head;
};

template <typename T>
LinkedList<T>::LinkedList() : head(0) {}  // 使用 0 替换 nullptr

template <typename T>
LinkedList<T>::~LinkedList() {
    Node<T>* current = head;
    while (current) {
        Node<T>* next = current->next;
        delete current;
        current = next;
    }
}

template <typename T>
void LinkedList<T>::insert(T data) {
    Node<T>* newNode = new Node<T>(data);
    if (!head) {
        head = newNode;
    } else {
        Node<T>* current = head;
        while (current->next) {
            current = current->next;
        }
        current->next = newNode;
    }
}

template <typename T>
void LinkedList<T>::remove(T data) {
    if (!head) {
        return;
    }

    if (head->data == data) {
        Node<T>* temp = head;
        head = head->next;
        delete temp;
        return;
    }

    Node<T>* current = head;
    while (current->next && current->next->data != data) {
        current = current->next;
    }

    if (current->next) {
        Node<T>* temp = current->next;
        current->next = current->next->next;
        delete temp;
    }
}

template <typename T>
Node<T>* LinkedList<T>::search(T data) {
    Node<T>* current = head;
    while (current) {
        if (current->data == data) {
            return current;
        }
        current = current->next;
    }
    return 0;  // 使用 0 替换 nullptr
}

template <typename T>
void LinkedList<T>::print() const {
    Node<T>* current = head;
    while (current) {
        std::cout << current->data << " ";
        current = current->next;
    }
    std::cout << std::endl;
}

template <typename T>
int LinkedList<T>::size() const {
    int count = 0;
    Node<T>* current = head;
    while (current) {
        count++;
        current = current->next;
    }
    return count;
}

template <typename T>
bool LinkedList<T>::isEmpty() const {
    return head == 0;  // 使用 0 替换 nullptr
}

template <typename T>
Node<T>* LinkedList<T>::getHead() const {
    return head;
}

template <typename T>
Node<T>* LinkedList<T>::getTail() const {
    Node<T>* current = head;
    Node<T>* tail = 0;  // 使用 0 替换 nullptr
    while (current) {
        tail = current;
        current = current->next;
    }
    return tail;
}

// 加法运算
template <typename T>
LinkedList<T>& LinkedList<T>::operator+(const LinkedList<T>& other) {
    Node<T>* current = other.head;
    while (current) {
        this->insert(current->data);
        current = current->next;
    }
    return *this;
}

// 减法运算
template <typename T>
LinkedList<T>& LinkedList<T>::operator-(const LinkedList<T>& other) {
    Node<T>* current = other.head;
    while (current) {
        this->remove(current->data);
        current = current->next;
    }
    return *this;
}
#endif

使用样例

1. 创建和操作整数链表
#include "linked_list.h"

int main() {
    LinkedList<int> list1;
    list1.insert(1);
    list1.insert(2);
    list1.insert(3);

    std::cout << "List1: ";
    list1.print();  // 输出: 1 2 3

    LinkedList<int> list2;
    list2.insert(4);
    list2.insert(5);

    std::cout << "List2: ";
    list2.print();  // 输出: 4 5

    // 加法运算
    list1 = list1 + list2;
    std::cout << "List1 + List2: ";
    list1.print();  // 输出: 1 2 3 4 5

    // 减法运算
    list1 = list1 - list2;
    std::cout << "List1 - List2: ";
    list1.print();  // 输出: 1 2 3

    // 查找元素
    Node<int>* found = list1.search(2);
    if (found) {
        std::cout << "Found: " << found->data << std::endl;  // 输出: Found: 2
    } else {
        std::cout << "Not found" << std::endl;
    }

    // 删除元素
    list1.remove(2);
    std::cout << "After removing 2: ";
    list1.print();  // 输出: 1 3

    return 0;
}
2. 创建和操作字符串链表
#include "linked_list.h"

int main() {
    LinkedList<std::string> list1;
    list1.insert("apple");
    list1.insert("banana");
    list1.insert("cherry");

    std::cout << "List1: ";
    list1.print();  // 输出: apple banana cherry

    LinkedList<std::string> list2;
    list2.insert("date");
    list2.insert("elderberry");

    std::cout << "List2: ";
    list2.print();  // 输出: date elderberry

    // 加法运算
    list1 = list1 + list2;
    std::cout << "List1 + List2: ";
    list1.print();  // 输出: apple banana cherry date elderberry

    // 减法运算
    list1 = list1 - list2;
    std::cout << "List1 - List2: ";
    list1.print();  // 输出: apple banana cherry

    // 查找元素
    Node<std::string>* found = list1.search("banana");
    if (found) {
        std::cout << "Found: " << found->data << std::endl;  // 输出: Found: banana
    } else {
        std::cout << "Not found" << std::endl;
    }

    // 删除元素
    list1.remove("banana");
    std::cout << "After removing banana: ";
    list1.print();  // 输出: apple cherry

    return 0;
}

应用实例

1. 数据管理

链表可以用于管理动态数据,例如在内存管理中,链表可以用于管理空闲内存块。每个节点可以表示一个空闲内存块,链表可以动态地插入和删除节点,以适应内存分配和释放的需求。

2. 文件系统

在文件系统中,链表可以用于管理文件和目录的链接。每个节点可以表示一个文件或目录,链表可以动态地插入和删除节点,以适应文件系统的增删改查操作。

3. 队列和栈

链表可以用于实现队列和栈。队列可以通过在链表的尾部插入元素和在头部删除元素来实现,而栈可以通过在链表的头部插入和删除元素来实现。

4. 图形用户界面

在图形用户界面中,链表可以用于管理窗口和控件的层次关系。每个节点可以表示一个窗口或控件,链表可以动态地插入和删除节点,以适应用户界面的动态变化。

以上就是本文章的全部内容。安装教程见链表简介及自制链表操作头文件_自己写一个链表头文件-CSDN博客

关煮一下吧你的认可就是我最大的动力~~


求关注~


原文地址:https://blog.csdn.net/2301_81482480/article/details/144307910

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!