单链表

来源:互联网 发布:福建摩尔软件骗局 编辑:程序博客网 时间:2024/05/29 14:09
#ifndef SLIST_H_#define SLIST_H_template<class T>struct listNode{T element;listNode<T> *next;listNode() :element(), next() {}explicit listNode(const T &elem) :element(elem), next(nullptr) {}~listNode() { next = nullptr; }};template<class T>class slist{typedef listNode<T>* lnp;private:lnp l_head;    int l_size;public://pos=0为表头(head),不计入,从pos=1开始slist() :l_head(new listNode<T>), l_size(0) {}~slist();T value(int pos)const;bool isEmpty()const { return l_size==0? true : false; }bool isLast(int pos)const { return pos == l_size; }int size()const { return l_size; }listNode<T>* find(int pos);void insert_after(const T &elem, int pos);void erase(int pos);void erase(int begin, int end);void clear();void push_front(const T &elem);T pop_front();void push_back(const T &elem);T  pop_back();};template<class T>slist<T>::~slist(){clear();delete l_head;}template<class T>T slist<T>::value(int pos)const{lnp ptr = l_head;int i = 0;while (i != pos){ptr = ptr->next;++i;}return ptr->element;}template<class T>listNode<T>* slist<T>::find(int pos){lnp temp = l_head;int i = 0;while (i != pos){temp = temp->next;++i;}return temp;}template<class T>void slist<T>::insert_after(const T &elem, int pos){lnp ptr = find(pos);lnp nlnp = new listNode<T>;nlnp->element = elem;nlnp->next=ptr->next;//连接下一节点ptr->next = nlnp;//连接插入节点后++l_size;}template<class T>void slist<T>::erase(int pos){if (isEmpty()){std::cerr << "Empty!\n";return;}if (0 == pos) {std::cout<<"Do not delete head\n ";return;}lnp ptr = find(pos - 1);//prelnp temp = ptr->next;//to be deletedptr->next = temp->next; delete temp;--l_size;}template<class T>void slist<T>::erase(int begin, int end){if (begin > 0 && end < l_size+1){int temp = end;while (temp >=begin){lnp ptr = find(temp);erase(temp);--temp;}}elsestd::cout << "Wrong range!\n";}template<class T>void slist<T>::clear(){erase(1, l_size);}template<class T>void slist<T>::push_front(const T &elem){insert_after(elem,0);}template<class T>T slist<T>::pop_front(){if (isEmpty()){std::cerr << "Empty!\n";return 0;}T t = find(1)->element;erase(1);return t;}template<class T>void slist<T>::push_back(const T &elem){insert_after(elem, l_size);}template<class T>T slist<T>::pop_back(){if (isEmpty()){std::cerr << "Empty!\n";return 0;}if(isLast())return pop_front();T t = value(l_size);erase(l_size);return t;}#endif 
#include "slist.h"#include <iostream>int main(){slist<int> l;l.push_back(23);l.push_front(12);l.push_front(13);l.push_front(14);l.push_back(54);std::cout <<"size: "<< l.size() << std::endl;for (int i = 1; i < l.size()+1;i++)std::cout << l.value(i) << "-";std::cout << "\n";l.erase(2);for (int i = 1; i < l.size() + 1; i++)std::cout << l.value(i) << "-";std::cout << "\n";l.pop_front();for (int i = 1; i < l.size() + 1; i++)std::cout << l.value(i) << "-";std::cout << "\n";l.erase(0);l.clear();std::cout << "size(after clear): " << l.size() << std::endl;system("pause");    return 0;}
0 0
原创粉丝点击