【C++】用类实现单向单链表的尾插PushBack(),尾删PopBack(),打印PrintSlist()。

建立源文件,命名为:Slist.cpp。

#include"Slist.h"
int main()
{
    Test();
    system("pause");
    return 0;
}

建立头文件,命名为:Slist.h。

#ifndef __SLISH_H__
#define __SLIST_H__

#include<iostream>
using namespace std;

typedef int DataType;

class SlistNode
{
    friend class Slist;
public:
    SlistNode(DataType x)
        :_next(NULL)
        , _data(x)
    {}
private:
    DataType _data;
    SlistNode* _next;
};

class Slist
{
public:
    Slist()
        :_head(NULL)
        , _tail(NULL)
    {}

    Slist(const Slist& s)
        :_head(NULL)
        , _tail(NULL)
    {
        SlistNode* cur = s._head;
        while (cur)
        {
            this->PushBack(cur->_data);
            cur = cur->_next;
        }
    }

    Slist& operator= (const Slist& s)
    {
        Slist tmp;
        SlistNode* pcur = _head;
        while (pcur)
        {
            SlistNode* del = pcur;
            pcur = pcur->_next;
            delete del;
            del = NULL;
        }
        tmp = s;
        SlistNode* cur = s._head;
        while (cur)
        {
            this->PushBack(cur->_data);
            cur = cur->_next;
        }    
    }

    ~Slist()
    {
        SlistNode* cur = _head;
        while (cur)
        {
            SlistNode* del = cur;
            cur = cur->_next;
            delete del;
            del = NULL;
        }
    }

    void PushBack(DataType x)
    {
        //0  1多
        if (_head == NULL)
        {
            _head = new SlistNode(x);
            _tail = _head;
        }
        else
        {
            /*_tail->_next = new SlistNode(x);
            _tail = _tail->_next;    */    
            SlistNode* cur = new SlistNode(x);
            _tail->_next = cur;
            _tail = cur;
        }
    }

    void PopBack()
    {
        if (_head == _tail)
        {
            if (_head == NULL)
            {
                return;
            }
            else
            {
                delete _head;
                _head = NULL;
                _tail = NULL;
            }
        }
        else
        {
            SlistNode* cur = _head;
            while (cur)
            {
                SlistNode* _next = cur->_next;
                if (_next == _tail)
                {
                    delete _tail;
                    _tail = NULL;
                    _tail = cur;
                    _tail->_next = NULL;
                }
                cur = cur->_next;
            }
        }
    }

    void PrintSlist()
    {
        if (_head== NULL)
        {
            return;
        }
        else
        {
            SlistNode* cur = _head;
            while (cur)
            {
                cout << cur->_data << " ";
                cur = cur->_next;
            }
            cout << endl;
        }

    }
private:
    SlistNode* _head;
    SlistNode* _tail;
};

void Test()
{
    Slist s;
    s.PushBack(1);
    s.PushBack(2);
    s.PushBack(3);
    s.PushBack(4);
    s.PushBack(5);
    s.PrintSlist();

    s.PopBack();
    s.PrintSlist();

}

#endif    //__SLIST_H__
时间: 2024-10-10 23:07:44

【C++】用类实现单向单链表的尾插PushBack(),尾删PopBack(),打印PrintSlist()。的相关文章

单链表 初始化 创建 头插法 尾插法 插入 删除 查找 合并 长度

#include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR -1 #define TRUE 1 #define FALSE -1 #define NULL 0 #define OVERFLOW -2 #define ElemType int #define Status int typedef int ElemType typedef int Status #define LEN sizeof(LNode) #

给定数组,创建(带头节点)的单链表(头插法、尾插法)

一般有两种常用的方法来建立单链表:头插法与尾插法. (1)头插法:每次将新申请的节点插在头节点的后面: 简单来说,就是把新加进的元素放在表头后的第一个位置: 首先,让新节点的next指向头节点之后:然后,让表头的next指向新节点. (2)尾插法:每次将新申请的节点插在终端节点的后面. #include <stdio.h> #include <stdlib.h> typedef struct node { int data; struct node *next; } NODE; /

c++实现单向单链表及常见面试题

1.单链表 链表中的数据是以结点来表示的,每个结点的构成:元素+ 指针,元素就是存储数据的存储单元,指针就是连接每个结点的地址数据. 2.链表的结点结构 │data │next | data域--存放结点值的数据域 next域--存放结点的直接后继的地址(位置)的指针域 注:链表通过每个结点的链域将线性表的n个结点按其逻辑顺序链接在一起的. "LSist.h" #pragma once #include <iostream> using namespace std; typ

链表学习一:单链表创建-头插入与尾插入

链表的创建过程是一个动态的生成过程,创建链表有两种思路,一种是从表头插入,另一种是从表尾插入. 表头插入思路:从一个空表开始,重复读入数据,生成新结点,将读入数据存放在新结点的数据域中,然后将新结点插入到当前链表的表头上,直到读入结束标志为止. 表尾插入思路:从一个空表开始,重复读入数据,生成新结点,将读入数据存放在新结点的数据域中,然后将新结点插入到当前链表的表尾上,直到读入结束标志为止. 两种方法C++实现如下: 1 #include<iostream> 2 using namespace

单链表(建立、插入、删除、打印)

单向链表创建 链表是动态分配存储空间的链式存储结构. 其包括一个"头指针"变量,其中第0个结点称为整个链表的头结点,头结点中存放一个地址,该地址指向一个元素,头结点一般不存放具体数据,只是存放第一个结点的地址. 链表中每一个元素称为"结点",每个结点都由两部分组成:存放数据元素的数据域和存储直接后继存储位置的指针域.指针域中存储的即是链表的下一个结点存储位置,是一个指针.多个结点链接成一个链表. 最后一个结点的指针域设置为空(NULL),作为链表的结束标志,表示它没

线性表--单链表(C++)

单链表演示图: 单链表结构体: struct Node { Node(const DataType& d)//节点的构造函数 :_data(d) ,_next(NULL) {} DataType _data;        //数据   struct Node *_next;    //指向下一个节点的指针 }; 带头结点和尾节点的单链表: 多一个Tail指针的好处就是很方便可以找到链表尾部,方便在尾部插入一个元素什么的. 下面我们用类来实现单链表: class SList { friend o

线性单链表的操作

#include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define INFEASIBLE -1 #define OVERFLOW -2 /* #define ElemType int #define Status int */ typedef int ElemType; typedef int Status; /* #define LNo

C++ 数据结构学习二(单链表)

模板类 //LinkList.h 单链表#ifndef LINK_LIST_HXX#define LINK_LIST_HXX#include <iostream>using namespace std; template<class T>struct Node{ T data; Node * next;}; template<class T>class LinkList{ public: LinkList(); //无参构造函数,建立只有头结点的空链表 LinkList

Java-反转单链表

单链表的反转比较简单,迭代和递归都可以做. 先定义一个类用于表示单链表中的结点: public class ListNode { private int val; private ListNode next; public ListNode(int value){ this.val = value; this.next = null; } public int getVal() { return val; } public void setVal(int val) { this.val = va