数据结构之list

list(链表)

特点

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

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

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

实现简单的单向链表

#include <iostream>

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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值