【C++】 单链表 .cpp

之前,在C语言阶段使用了C编写单链表,简单易懂,那么,今天使用C++再次编写单链表,旨在对比两者之间的区别和异同:

下面就是cpp实现的代码:

SList.h文件:

#pragma once

typedef int DataType;

class SListNode
{
    friend class SList;

public:
    SListNode(DataType x)
        :_data(x)
        ,_next(NULL)
    {}

private:
    SListNode* _next;
    DataType _data;
};
class SList
{
public:
    SList()
        :_head(NULL)
        ,_tail(NULL)
    {}

    ~SList()
    {
        Clear();
    }

    SList(const SList& s)
        :_head(NULL)
        ,_tail(NULL)
    {
        SListNode* cur = s._head;
        while(cur)
        {
            this->PushBack(cur->_data);
            cur = cur->_next;
        }
    }
    
    //赋值函数的现代写法
    SList& operator=(SList s)
    {
        swap(_head,s._head);
        swap(_tail,s._tail);

        return *this;
    }

    /*  赋值函数的传统写法
    SList& operator=(const SList &s)
    {
        if(this != &s)
        {
            this->Clear();
            SListNode* cur = s._head;
            while(cur)
            {
                this->PushBack(cur->_data);
                cur = cur->_next;
            }
        }
        return *this;
    }
    */

public:
    void PushBack(DataType x)
    {
        if(_head == NULL)
        {
            _head = new SListNode(x);
            _tail = _head;
        }
        else
        {
            _tail->_next = new SListNode(x);
            _tail = _tail->_next;        
        }

    }

    void PopBack()
    {
        if(_head == NULL)  // 空
        {
            return;
        }
        else if(_head->_next == NULL)  //一个节点
        {
            delete _head;
            _head = NULL;
        }
        else   //多个节点
        {
            SListNode *cur = _head;
            SListNode *prev = NULL;
            while(cur->_next)
            {
                prev = cur;
                cur = cur->_next;
            }
            free(cur);
            prev->_next = NULL;
        }
    }

    void PushFront(DataType x)
    {
        if(_head == NULL)   // ①.为空
        {
            _head = new SListNode(x);
            _head->_next = NULL;
        }
        else              //②.不为空
        {
            SListNode* tmp = new SListNode(x);
            tmp->_next = _head;
            _head = tmp; // 新的头节点
        }
    }

    void PopFront()
    {
        if(_head == NULL)  //空
        {
            return;
        }
        else if(_head->_next == NULL) //一个节点
        {
            delete _head;
            _head = NULL;
        }
        else              //多个节点
        {
            SListNode* tmp = _head;
            _head = _head->_next;
            delete tmp;
        }
    }

    void Insert(SListNode* pos,DataType x)
    {
        assert(pos);

        SListNode* tmp = new SListNode(x);
        tmp->_next = pos->_next;
        pos->_next = tmp;    
    }

    SListNode* Find(DataType x)
    {
        if(_head == NULL)
        {
            return NULL;
        }
        else
        {
            SListNode* cur = _head;
            while(cur)
            {
                if(cur->_data == x)
                {
                    return cur;
                }
                cur = cur->_next;
            }
        }
    }

    void Erase(SListNode* pos)
    {
        assert(pos);
        assert(_head);

        if(_head == pos)
        {
            _head = _head->_next;
            delete pos;
            return;
        }
        SListNode* prev = _head;
        while(prev)
        {
            if(prev->_next == pos)
            {
                prev->_next = pos->_next;
                delete pos;
                break;
            }
            prev = prev->_next;
        }
    }

    void Clear()
    {
        SListNode* cur = _head;

        while(cur)
        {
            SListNode* del = cur;
            cur = cur->_next;
            delete del;
        }
        
        _head = NULL;
        _tail = NULL;
    }

    void PrintSList()
    {
        SListNode* cur = _head;

        while(cur)
        {
            cout<<cur->_data<<"->";
            cur = cur->_next;
        }

        cout<<"NULL"<<endl;
    }

private:
    SListNode* _head; //指向第一个节点的指针
    SListNode* _tail; //指向最后一个节点的指针
};

void Test1()
{
    SList s1;
    s1.PushBack(1);//是将s1传向this指针
    s1.PushBack(2);
    s1.PushBack(3);
    s1.PushBack(4);
    s1.PushBack(5);
    s1.PrintSList();

    SList s2(s1);//测试拷贝构造
    s2.PrintSList();

    SList s3;
    s3 = s2; //测试赋值运算符重载
    s3.PrintSList();

    s1.PopBack();
    s1.PrintSList();

    s2.PopFront();
    s2.PrintSList();

    s3.Insert(s3.Find(3),6);
    s3.PrintSList();

    s3.Erase(s3.Find(3));
    s3.PrintSList();
}

SList.cpp文件:

#include<iostream>
#include<assert.h>
using namespace std;

#include "SList.h"

int main()
{
    Test1();
    return 0;
}
时间: 2024-10-24 05:51:02

【C++】 单链表 .cpp的相关文章

创建单链表

还记得创建单链表的这些代码还是大学时候写过,现在再重新写一写,为面试做准备吧: 创建单链表的两种形式:头插法和尾插法 // 演示创建2种单链表的方式 // [C++基础]单链表.cpp #include "stdafx.h" #include <iostream> using namespace std; struct link { int data; link *next; }; //头插法建立单链表 link *creatLink_head(link *head) {

[c语言]单链表的实现

一.基础知识:链表(线性表的链式存储结构) (1)特点:逻辑关系相邻,物理位置不一定相邻. (2)分类: a.不带头节点 b.带头节点 (3)单链表的存储结构: typedef struct SListNode {  DataType data;  struct SListNode* next; }SListNode; 二.代码实现(因避开使用二级指针,所以代码中使用了c++中的引用):此处构造的为不带头节点的链表 (1)sList.h   #pragma once typedef int Da

4.2.2 算法之美--单链表实现

按照书上的要求实现了一下单链表:单链表的实现可能以前看过几次了:现在想想最主要的几个操作算法应该能够写了吧:遇到的问题: 1. 链表节点写成private;所已给出了访问的接口: 2.模板类的.h和.cpp实现写在同一个文件: 3.感觉以后的数据结构实现还是用纯c的实现好一些:然后书主要是思路 节点类: #ifndef SINGLELIST_LISTNODE_H_ #define SINGLELIST_LISTNODE_H_ template <class T> class ListNode

c++单链表基本功能

/*四川工程职业技术学院 15软件 */ head_LinkNode.h /*单链表类的头文件*/#include<assert.h>#include"compare.h"typedef int status;//整形的状态值#define OK 1;//status参数#define ERROR 0;//status参数template <class type> class LinkNode{protected: LinkNode* head;public:

单链表(C语言)

单链表:单向无循环,最后置于空 //SeqList.h #pragma once #include<string.h> #include<stdlib.h> #include<assert.h> #define MAX_SIZE 100 typedef int DataType; typedef struct Seqlist { DataType *_array; size_t _size; size_t _capacity; }Seqlist; void InitSe

单链表(C语言)基本操作

单链表:单向有序链表 最后置于空 #pragma once #include<string.h> #include<malloc.h> #include<assert.h> typedef int DataType; typedef struct ListNode { struct ListNode *_next; DataType _data; }ListNode; void PrintList(ListNode *&pHead) { while(pHead)

单链表简单实现c++

首先定义一个类,相关数据,函数封装,在头文件中 #pragma once class SingleList { public: typedef struct _NODE{ int nData; //数据域 _NODE *pNext; //指向下一个节点 }NODE,*PNODE; private: NODE * m_pHandNode; int m_nCount; public: SingleList(); ~SingleList(); bool InitList(); //初始化操作 bool

单链表的相关操作

#ifndef _SLIST_H #define _SLIST_H #ifdef __cplusplus extern "C" { #endif /*******1. 不带头结点的单链表*****/ /***** *@链表结点结构定义 *@ m_data:数据 *@m_pNext:指向下一结点的指针 ***/ struct listNode { int m_data; listNode* m_pNext; }; /******* *@ 用数组array初始化链表,数组元素个数为n *@

单链表(兼具Boost单元测试)

这是“线性表系列”中的“链表系列”文章之一——单链表.关于“线性表系列”中的“顺序表系列”请转到:基于静态分配的数组的顺序表(兼具Boost单元测试),基于动态分配的数组的顺序表(兼具Boost单元测试). 对于单链表的介绍请参考网页. 对于单链表,我定义了一个这样的类LinkedList: 1 // linkedlist.h 2 #ifndef LINKEDLIST 3 #define LINKEDLIST 4 5 #include <iostream> 6 #include <cas