#ifndef MLIST_H
#define MLIST_H
/*在gcc编译环境下模版类只能跟定义在一起 否则就会报错,所以我这里才放在一起了*/
#include<iostream>
using namespace std;
template<class T>
struct List
{
T data;
List<T> *next;
};
template<class T>
class MList
{
private:
List<T> *root;
int len;//长度
List<T> *createNewList(const T &val){
List<T> *p=new List<T>;
p->data=val;
p->next=NULL;
return p;}
void deleteAll()
{
List<T> *p=root;
if(p==NULL){delete p;return;}
else {
do{
root=root->next;
delete p;
p=root;
}while(root);
}
}
public:
MList(){
root=NULL;
this->len=0;
}
~MList(){deleteAll();}
int length()const//不改变内容
{
return len;
}
int size()const{return len;}
void append(const T &val){
if(this->root==NULL){this->root=createNewList(val);}
else {
List<T> *p=root;
while(p->next)
{
p=p->next;
}
p->next=createNewList(val);
}
len++;
}
void prepend(const T &val)
{
if(this->root==NULL)
this->root=createNewList(val);
else
{
List<T> *p=createNewList(val);
p->next=root;
root=p;
}
this->len=this->len+1;
}
const T& at(int index)const
{
if((index<0)||(index+1>length()))throw "index的大小应>0小于length()";
else
{
List<T> *p=this->root;
for(int i=0;i<index;i++)
{
p=p->next;
}
return p->data;
}
}
void removeAt(int index)
{
if((index>len-1)||index<0)return;
else if(index==0) {removeFirst();return;}
else if(index==len) {removeLast();return;}
{
List<T> *p=root;
for(int i=0;i<index-1;i++)//找到该节点的前一个
{
p=p->next;
}
List<T> *p_=p->next->next;
delete p->next;
p->next=p_;
len--;
}
}
void remove(int from,int to)
{
if(from>to)return;
if(from<0)return;
if(to>len)return;
for(int i=to-from+1;i>0;i--)
{
removeAt(from);
}
}
void removeFirst()
{
if(len==0)return;
List<T> *p=root;
root=root->next;
delete p;
len--;
}
void removeLast()
{
if(len==0)return;
if(len==1){delete root;root=NULL;len--;return;}
List<T> *p=root;
while(p->next->next)
{
p=p->next;
}
List<T> *p_=p->next;
delete p->next;
p_->next=NULL;
len--;
}
void replace(int index,T &val)
{
if((index>len-1)||(index<0))return;
else
{
List<T> *p=root;
for(int i=0;i<index;i++)
{
p=p->next;
}
p->data=val;
}
}
int count(const T &val)const{
int sum=0;
List<T> *p=root;
while(p)
{
if(p->data==val)sum++;
p=p->next;
}
return sum;
}
// ~MList();
};
#endif // MLIST_H