数据结构之list

list(链表)

特点

链表是物理存储单元上非连续的、非顺序的存储结构,数据元素的逻辑顺序是通过链表的指针地址实现,每个元素包含两个结点,一个是存储元素的数据域 (内存空间),另一个是指向下一个结点地址的指针域。根据指针的指向,链表能形成不同的结构,例如单链表,双向链表,循环链表等。
这里写图片描述
链表的优点:
链表是很常用的一种数据结构,不需要初始化容量,可以任意加减元素;
添加或者删除元素时只需要改变前后两个元素结点的指针域指向地址即可,所以添加,删除很快;

缺点:
因为含有大量的指针域,占用空间较大;
查找元素需要遍历链表来查找,非常耗时。

适用场景:
数据量较小,需要频繁增加,删除操作的场景
————————————————
版权声明:本文为CSDN博主「鄙人薛某」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yeyazhishang/article/details/82353846

实现简单的单向链表

#include 

class Stu{
private:
    std::string name;
    int age;
    std::string num;
public :
    Stu(std::string name,int age,std::string num):name(name),age(age),num(num){}
    /*
    friend std::ostream& operator<<(std::ostream& os,const Stu& s){
        return os << s.age << std::endl
                  << s.name << std::endl;
    }
    */
    friend std::ostream& operator<<(std::ostream& os,const Stu& s){
        os << " "<< s.name << " " << s.age << " " << s.num << std::endl;
        return os;
    }
};

template<typename T=int>
class list{
    typedef struct Node
    {
        T value;
        Node *next;
        Node(T value,Node* next):value(value),next(next){}
    }Node;
private:
    Node *first;            //首地址
    size_t size;             //总个数
public :
    list(T value):first(new Node(value,nullptr)),size(1){
    }
    list():first(nullptr),size(0){
    }
    ~list(){
        while(first != nullptr){
            Node *mid = first->next;
            delete first;
            first = mid;
        }
    }

/*-------------------------基本功能---------------------------*/
    void insert(size_t pos,T value){
        if(pos > size ){
            std::cout << "insert failed" << std::endl;
            return;
        }
        Node *node = new Node(value,nullptr);
        Node *mid = first;
        for (int i = 1; i < pos;i++){
            mid = mid->next;
        }
        if(pos == 0){
            node->next = first;
            first = node;
        }else{
            node->next = mid->next;
            mid->next = node;
        }
        size++;
    }

    T front(){
        if(size != 0)
            return first->value;
    }

    void push_front(T value){
        Node *node = new Node(value, nullptr);
        node->next = first;
        first = node;
    }

    bool empty(){
        return size == 0;
    }

    void print(){
        std::cout << "size:"<< size << std::endl;
        Node *mid = first;
        for (int i = 0; i < size;i++){
            std::cout << mid->value << std::endl;
            mid = mid->next;
        }
    }
};

int main(){
    list<int> a;
    
    a.insert(0, 10);
    a.insert(0, 9);

    a.insert(0, 7);
    a.insert(0, 6);
    a.insert(0, 5);
    
    std::cout << "front() : "<<a.front() << std::endl;
    a.print();

    std::cout << a.empty() << std::endl;

    std::cout << "------------------------------" << std::endl;

    list<Stu> s;

    s.insert(0, {"ycj",18,"11110"});
    s.insert(1, {"zz", 20, "11111"});
    std::cout << s.front() << std::endl;
    s.print();
    return 0;
}

你可能感兴趣的:(数据结构,list,链表)