数据结构与算法——单向链表ADT(C++)

本文介绍了一个名为Linked_list的单向链表类,包含指向链表头节点的指针head和链表节点数目size。链表节点类Node的定义以及Linked_list类的成员函数和实现细节,实现了链表的基本操作。
摘要由CSDN通过智能技术生成

该单向链表类名字为Linked_list。

1.Linked_list类的基本数据成员:

        单向链表类Linked_list的基本数据成员包括:指向链表头节点的指针head,以及链表的节点数目size,如下所示:

Node *head;                                                 //当前链表的头节点
int size;                                                   //当前链表的节点数目  

        其中链表节点Node类的实现如下:

struct Node
{
    int data;
    Node *next=NULL;
    Node(int nums):data(nums),next(NULL)
    {
    }
};

2.Linked_list类的成员函数:

        Linked_list类的成员函数如下:

    //构造函数
    Linked_list();                                              //单向链表构造函数:构造空链表
    Linked_list(int nums[],int size);                           //单向链表构造函数:由数组构造链表
    Linked_list(const Linked_list &other);                      //拷贝构造函数
    //运算符
    Linked_list operator= (const Linked_list &other);           //拷贝构造运算符
    Linked_list operator+ (const Linked_list &other);           //加法运算符:将两个单向链表相连接
    //链表节点查找
    Node *search_by_content(int target);                        //根据内容查找节点的第一次出现的地址
    int search_by_position(int pos);                            //根据下标位置查找节点的内容
    //链表节点插入
    bool insert_by_position(int nums,int pos);                  //根据位置进行插入节点
    void insert_back(int nums);                                 //将指定的内容插入到链表的末尾
    //链表节点删除
    bool delete_by_content(int nums);                           //根据内容进行删除节点
    bool delete_by_position(int pos);                           //根据位置进行删除节点
    //单向链表特殊操作
    void reverse();                                             //将当前的链表反转
    void clean();                                               //将当前链表清空
    int count();                                                //返回当前链表的节点数目
    void print();                                               //输出链表的值


3.Linked_list类成员函数的实现:

Linked_list类成员函数的实现,实现的细节和需要注意的要点可以参见注释:

Linked_list::Linked_list()                        //单向链表构造函数:构造空链表
{
    size=0;
    head=NULL;
}

Linked_list::Linked_list(int nums[],int isize)     //单向链表构造函数:由数组构造链表
{
    //该函数既可以通过调用insert_back进行实现,也可以不调用
    //若决定调用insert_back成员函数进行实现,则必须先初始化head=NULL,size=0,因为insert_back函数需要链表的相关信息
    head=NULL;
    size=0;
    for(int i=0;i<isize;i++)
    {
        (*this).insert_back(nums[i]);        //该函数已经计算了链表节点数目
    }
}

Linked_list::Linked_list(const Linked_list &other)  //拷贝构造函数
{
    //链表的拷贝构造函数仅在链表构造的时候被调用,因此不需要考虑原链表是否为空
    //同样,若决定调用本类的insert_back成员函数进行实现,则必须初始化head=NULL,size=0,因为insert_back成员函数需要这些链表的相关信息
    head=NULL;     
    size=0;
    Node *now=other.head;
    while(now!=NULL)
    {       
        (*this).insert_back(now->data);    //该函数已经计算了链表节点数目
        now=now->next;
    }
}

Linked_list Linked_list::operator= (const Linked_list &other)         //拷贝构造运算符
{
    //链表的拷贝构造运算符需要考虑原链表是否为空,原链表非空的时候需要清空链表
    if(size)               //当原链表非空的时候,这时需要将原链表清空,否则会导致内存泄漏
    (*this).clean();    
    Node *now=other.head;
    while(now!=NULL)
    {
        (*this).insert_back(now->data);
        now=now->next;
    }      
    size=other.size;
    return (*this);
}

Linked_list Linked_list::operator+ (const Linked_list &other)         //加法运算符:将两个单向链表相连接
{
    Node *now=other.head;
    while(now!=NULL)
    {
        (*this).insert_back(now->data);
        now=now->next;
    }
    size+=other.size;
    return (*this);
}

Node *Linked_list::search_by_content(int target)                          //给定内容查找该内容所在的节点
{
    Node *now=head;
    while(now!=NULL
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值