关闭

用模板实现单链表

242人阅读 评论(0) 收藏 举报
分类:
#include<iostream>
using namespace std;

template <class T>
struct Node
{
    T _data;
    Node* next;
    Node(const T& d)
        :_data(d)
        ,next(NULL)
    {}
};

template <class T>
class LinkList
{
public:
    LinkList()
        :_head(NULL)
        ,_tail(NULL)
    {}

    ~LinkList()
    {
        if(_head == NULL)
    {}
    else if((_head == _tail)&&(_head != NULL))
    {
        delete _head;
        _head = _tail = NULL;
    }
    else
    {
        Node<T>* cur = _head;
        Node<T>* del = _head;
        while(cur)
        {
            del = cur;
            cur = cur->next ;
            delete del;
        }
    }
    }

public:
    void PushBack(const T& d);
    void PopBack();
    void PushFront(const T& d);
    void PopFront();
    void Display();
    int ListLen();
    void Insert(const int& pos,const T& d);
    void Del_Insert(const int& pos);


private:
    Node<T>* _head;
    Node<T>* _tail;
};

template <class T>
void LinkList<T>::PushBack (const T& d)
{
    if(_head == NULL)
    {
        Node<T>* cur = new Node<T>(d);
        _head = cur;
        _tail = cur;
    }
    else
    {
        Node<T>* cur = new Node<T>(d);
        Node<T>* tmp = _head;

        while(tmp->next )
        {
            tmp = tmp->next ;
        }
        tmp->next = cur;
        _tail = cur;
    }

}


template <class T>
void LinkList<T>::PopBack ()
{
    if(_head == NULL)
    {
        return ;
    }
    else if((_head == _tail)&&(_head != NULL))
    {
        delete _head;
        _head = _tail = NULL;
    }
    else
    {
        /*delete _tail;   
        _tail = NULL;    //只是转移了_tail的指向,使其指向了NULL,并没有改变链表最后一个节点为NULL
        Node<T>* cur = _head;
        while(cur->next)
        {
            cur = cur->next;
        }
        _tail = cur;*/
        Node<T>* cur = _head;
        while(cur->next)
        {
            _tail = cur;
            cur = cur->next;
        }
        delete cur;
        _tail->next = NULL;

    }
}

template <class T>
void LinkList<T>::PushFront(const T& d)
{
    if(_head == NULL)
    {
        Node<T>* cur = new Node<T>(d);
        _head = cur;
        _tail = cur;
    }
    else 
    {
        Node<T>* cur = new Node<T>(d);
        cur->next = _head;
        _head = cur;
    }
}

template <class T>
void LinkList<T>::PopFront ()
{
        if(_head == NULL)
    {
        return ;
    }
    else if((_head == _tail)&&(_head != NULL))
    {
        delete _head;
        _head = _tail = NULL;
    }
    else
    {
        Node<T>* cur = _head;
        _head = _head->next ;
        delete cur;
    }
}

template <class T>
void LinkList<T>::Display()
{
    Node<T>* cur = _head;
    while(cur )
    {
        cout<<cur->_data <<" ";
        cur = cur->next ;
    }
    cout<<endl;
}
template <class T>
int LinkList<T>::ListLen()
{
    int count = 0;
    Node<T>* cur = _head;
    while(cur)
    {
        count++;
        cur= cur->next ;
    }
    return count;
}


template <class T>
void LinkList<T>:: Insert(const int& pos,const T& d)
{
    int num  = pos;
    if(num > ListLen()+1 )
    {
        cout<<"NULL 链表"<<endl;
        return ;
    }
    else
    {
        Node<T>* cur = new Node<T>(d);
        if(num == 1)
        {
            cur->next = _head;
            _head = cur;
        }
        else
        {
            Node<T>* tmp1 = _head;
            Node<T>* tmp2 = _head;
            while(--num)
            {
                tmp2 = tmp1;
                tmp1 = tmp1->next ;

            }
            cur->next = tmp1;
            tmp2->next = cur;
            //_head->next = cur;  应该是tmp的上一个节点指向cur
        }
    }

}
template <class T>
void LinkList<T>::Del_Insert(const int& pos)
{
    int num  = pos;
    if(_head == NULL)
    {
        cout<<"NULL 链表"<<endl;
        return ;
    }
    else if((_head == _tail)&& (_head != NULL))
    {
        delete _head;
        _head = _tail = NULL;
    }
    else
    {
        Node<T>*  cur = _head ;
        if(num == 1)
        {
            _head= _head ->next ;
            delete cur;
        }
        else 
        {
            Node<T>* tmp1 = _head;
            Node<T>* tmp2 = _head;
            while(--num)
            {
                tmp2 = tmp1;
                tmp1 = tmp1->next ;
            }
            tmp2->next = tmp1->next ;
            delete tmp1;

        }

    }
}

void test()
{
    LinkList<int> l1;
    l1.PushBack (1);
    l1.PushBack (2);
    l1.PushBack (3);
    l1.PushBack (4);
    l1.PushBack (5);
    l1.PopBack ();
    l1.PushFront (0);
    l1.PopFront ();
    l1.Display ();
    l1.PushFront (5);
    l1.Display ();
    cout<<"Listlen:"<<l1.ListLen ()<<endl;

    l1.Insert (1,6);
    l1.Display ();
    l1.Insert (2,7);
    l1.Display ();
    l1.Insert (8,8);
    l1.Display ();
    cout<<"Listlen:"<<l1.ListLen ()<<endl;

    l1.Del_Insert (1);
    l1.Display ();
    cout<<"Listlen:"<<l1.ListLen ()<<endl;

}

int main()
{

    test();
    return 0;

}
0
0
查看评论

C++模板类实现单链表

c++模板类实现单链表#include<iostream> using namespace std; #include<assert.h> #include<string> template<class T> struct LinkNode { ...
  • Nou_Camp
  • Nou_Camp
  • 2017-04-08 17:15
  • 850

单链表的模板类实现

数据结构是初学编程时候的一个天坑,去年大一的时候学的那叫一个惨烈,虽然C++提供标准的list类库,但是自己动手实现这些常用的数据结构,不仅能对数据结构的认识更深,也对C++中深浅复制,重载,复用等内容更好的理解。 线性表的链式存储结构是用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是...
  • Avalon_Y
  • Avalon_Y
  • 2016-03-13 11:38
  • 3825

C++数据结构 单链表(模板类)

利用模板类实现单链表及其功能 需要实现的操作: [1] push_back       [2] push_front  [3] show_list       [0] quit_system [4] pop_back  ...
  • ZhongQi0808
  • ZhongQi0808
  • 2015-05-24 16:09
  • 1223

用c++实现 c++单链表的实现(采用模板类)

函数实现数据的插入(头插&&尾插)、删除(头删&&尾删)、查找、按值插入、按值删除、求长、单链表清除、单链表摧毁、数据的逆置以及数据排序 main函数 #include"List.h"//单链表 void main() { List...
  • S0Soul
  • S0Soul
  • 2015-05-25 15:40
  • 3768

C++模板实现的单向链表

C++模板实现的单向链表,实现了链表的初始化创建,元素插入,元素链表末尾添加,元素删除,链表清空 //Lists.h #ifndef DDXXLISTS_H #define DDXXLISTS_H #include using namespace std; template class Lists...
  • zhuhuangtianzi
  • zhuhuangtianzi
  • 2014-02-27 00:57
  • 1404

C++用模板实现单链表

用模板实现单链表 话不多说 直接上代码 #include using namespace std; template class CLink; template class Node { friend class CLink; public: /* 构造函数和析构函数一般不加类...
  • MOON5555
  • MOON5555
  • 2018-01-25 10:55
  • 47

单链表----java语言实现

节点   数据域:存放数据   指针域:存放下一个数据的地址 1、常用操作   查找   插入   删除 查找: (1)按照索引查找index位置上的节点:从头节点head开始依次向下找到第index...
  • snow_7
  • snow_7
  • 2016-06-07 15:43
  • 683

用单链表实现快速排序

用单链表实现快速排序 前言:快速排序我们都知道,通过一个基准数字,一趟排序就将数据划分为两个部分:左边的部分小于这个基准数字,右边的部分大于等于这个基准数字。我们知道,实现快速排序的关键在于随机访问数据元素,所以,以往的快排都是基于数组实现的。但是在面试中,经常会遇到面试官要求我们用链表实现快排...
  • u010429424
  • u010429424
  • 2017-09-01 20:42
  • 338

单链表的应用———简单的通讯录

本人初学数据结构,代码还不够完善,还望各位大神,可以指点一二。#include //建立通讯录 #include #include typedef struct Node{ char name[20]; char Iphonedata[11]; int qq; stru...
  • x_zhaohu
  • x_zhaohu
  • 2015-04-21 23:08
  • 2531

线性表的单链表实现

玩玩课本的数据结构感觉也还挺好玩的。虽然,理论性很强但是却增加了我的很多学术性的知识,感觉挺有收获的。 /* 线性表的单链表实现插入删除和查找及创建 */ #include #include #include #define ElemType int #define Status ...
  • u010016150
  • u010016150
  • 2014-04-25 21:21
  • 1283
    个人资料
    • 访问:44613次
    • 积分:1127
    • 等级:
    • 排名:千里之外
    • 原创:69篇
    • 转载:16篇
    • 译文:0篇
    • 评论:0条