c++链表简单实现
2013-07-24 08:32
405 查看
链表:
#include<iostream>
using namespace std;
template<class T>
struct Node{
Tdate;
Node<T> * next;
Node():date(T()),next(NULL){}
};
template<class T>
class LinkList
{
public:
LinkList()
{
Node<T> * p=new Node<T>;
head=p;
p->next=NULL;
}
Node<T> * push_front(const T &);
Node<T> * push_back(const T &);
Node<T> * insert(int pos,const T &);
Node<T> * pop_front();
Node<T> * pop_back();
const T& front();
const T& back();
const T& del(int pos);
void delelm(const T &);
void clear();
int size();
void display();
~LinkList()
{
this->clear();
}
private:
Node<T> * head;
};
/*
在链表的前边插入数据
返回类型:Node<T> * 返回插入数据的位置指针
const T &e :插入的数据
*/
template<class T>
Node<T> *LinkList<T>::push_front(const T & e)
{
Node<T> * p=new Node<T>;
head->date=e;
Node<T> * q=head;
p->next=head;
head=p;
return q;
}
/*
在链表的最后一个位置插入数据
返回类型:Node<T> * 返回插入数据的位置指针
const T &e :插入的数据
*/
template<class T>
Node<T> *LinkList<T>::push_back(const T & e)
{
Node<T> *p=new Node<T>;
p->date=e;
p->next=NULL;
Node<T> * q=head;
Node<T> * k=NULL;
while(q)
{
k=q;
q=q->next;
}
k->next=p;
return p;
}
/*
删除链表的第一个数据
返回类型:Node<T> * 返回删除数据的后一个位置指针
*/
template<class T>
Node<T> *LinkList<T>::pop_front()
{
if(!head->next)
{
cout<<"链表为空,pop_front失败!"<<endl;
return NULL;
}
else
{
Node<T> *p=head->next;
head->next=p->next;
delete p;
return head->next;
}
}
/*
删除链表的最后一个数据
返回类型:Node<T> * 返回删除数据的前一个位置指针
*/
template<class T>
Node<T> *LinkList<T>::pop_back()
{
if(!head->next)
{
cout<<"链表为空,pop_back失败!"<<endl;
return NULL;
}
else
{
Node<T> * p=head->next;
Node<T> * q=NULL;
while(p->next)
{
q=p;
p=p->next;
}
q->next=NULL;
delete p;
return q;
}
}
/*
返回链表的第一个数据
返回类型:const T & 返回链表的第一个数据的引用
*/
template<class T>
const T & LinkList<T>::front()
{
if(!head->next)
{
cout<<"链表为空,front失败!"<<endl;
return NULL;
}
else
{
return head->next->date;
}
}
/*
返回链表的最后一个数据
返回类型:const T & 返回链表的最后一个数据的引用
*/
template<class T>
const T & LinkList<T>::back()
{
if(!head->next)
{
cout<<"链表为空,back失败!"<<endl;
return NULL;
}
else
{
Node<T> * p=head->next;
Node<T> * q=NULL;
while(p)
{
q=p;
p=p->next;
}
return q->date;
}
}
/*
在链表的任意位置插入数据
返回类型:Node<T>* 返回插入的数据的指针位置
int pos :插入的数据的位置
const T & e:插入的数据
*/
template<class T>
Node<T> *LinkList<T>::insert(int pos,const T &e)
{
if(!head->next)
{
cout<<"链表为空,insert失败!"<<endl;
return NULL;
}
else if(pos>this->size())
{
cout<<"pos位置超出链表长度,insert失败!"<<endl;
return NULL;
}
else if(pos<0)
{
cout<<"pos位置不存在,insert失败!"<<endl;
return NULL;
}
else
{
int i=1;
Node<T> * p=head->next;
Node<T> * q=NULL;
while(i<pos)
{
q=p;
p=p->next;
i++;
}
Node<T> * k =newNode<T>;
k->date=e;
q->next=k;
k->next=p;
return k;
}
}
/*
删除任意位置的数据
返回类型:const T & 返回链表被删除数据的引用
int pos :要删除数据的位置
*/
template<class T>
const T & LinkList<T>::del(int pos)
{
if(!head->next)
{
cout<<"链表为空,del失败!"<<endl;
return NULL;
}
else if(pos<0|pos>this->size())
{
cout<<"pos位置不存在,del失败!"<<endl;
return NULL;
}
else
{
int i=1;
Node<T> * p=head->next;
Node<T> * q=NULL;
while(i<pos)
{
q=p;
p=p->next;
i++;
}
q->next=p->next;
T e=p->date;
delete p;
return e;
}
}
/*
删除与e相同的数据
*/
template<class T>
void LinkList<T>::delelm(const T&e)
{
if(!head->next)
{
cout<<"链表为空,del失败!"<<endl;
return NULL;
}
else
{
Node<T> * p=head->next;
Node<T> * q=NULL;
while(p->date!=e)
{
q=p;
p=p->next;
}
q->next=p->next;
delete p;
}
}
/*
返回链表的长度
*/
template<class T>
int LinkList<T>::size()
{
if(!head->next)
{
cout<<"链表为空!"<<endl;
return 0;
}
else
{
Node<T> * p=head->next;
int i=1;
while(p->next)
{
p=p->next;
i++;
}
return i;
}
}
/*
清空链表
*/
template<class T>
void LinkList<T>::clear()
{
Node<T> * p=head;
while(p)
{
head=p;
p=p->next;
deletehead;
}
}
/*
遍历输出链表中的数据
*/
template<class T>
void LinkList<T>::display()
{
if(!head->next)
{
cout<<"链表为空,display失败!"<<endl;
return ;
}
else
{
Node<T> * p=head->next;
while(p)
{
cout<<p->date<<",";
p=p->next;
}
cout<<endl;
}
}
int main()
{
LinkList<int> l;
l.push_back(10);
l.push_front(9);
l.push_back(8);
l.push_front(7);
l.display();
l.pop_back();
l.pop_front();
l.display();
cout<<"链表长度:"<<l.size()<<endl;
l.push_back(3);
l.push_front(4);
l.insert(2,6);
l.display();
l.del(2);
l.delelm(9);
l.display();
l.clear();
return 0;
}
#include<iostream>
using namespace std;
template<class T>
struct Node{
Tdate;
Node<T> * next;
Node():date(T()),next(NULL){}
};
template<class T>
class LinkList
{
public:
LinkList()
{
Node<T> * p=new Node<T>;
head=p;
p->next=NULL;
}
Node<T> * push_front(const T &);
Node<T> * push_back(const T &);
Node<T> * insert(int pos,const T &);
Node<T> * pop_front();
Node<T> * pop_back();
const T& front();
const T& back();
const T& del(int pos);
void delelm(const T &);
void clear();
int size();
void display();
~LinkList()
{
this->clear();
}
private:
Node<T> * head;
};
/*
在链表的前边插入数据
返回类型:Node<T> * 返回插入数据的位置指针
const T &e :插入的数据
*/
template<class T>
Node<T> *LinkList<T>::push_front(const T & e)
{
Node<T> * p=new Node<T>;
head->date=e;
Node<T> * q=head;
p->next=head;
head=p;
return q;
}
/*
在链表的最后一个位置插入数据
返回类型:Node<T> * 返回插入数据的位置指针
const T &e :插入的数据
*/
template<class T>
Node<T> *LinkList<T>::push_back(const T & e)
{
Node<T> *p=new Node<T>;
p->date=e;
p->next=NULL;
Node<T> * q=head;
Node<T> * k=NULL;
while(q)
{
k=q;
q=q->next;
}
k->next=p;
return p;
}
/*
删除链表的第一个数据
返回类型:Node<T> * 返回删除数据的后一个位置指针
*/
template<class T>
Node<T> *LinkList<T>::pop_front()
{
if(!head->next)
{
cout<<"链表为空,pop_front失败!"<<endl;
return NULL;
}
else
{
Node<T> *p=head->next;
head->next=p->next;
delete p;
return head->next;
}
}
/*
删除链表的最后一个数据
返回类型:Node<T> * 返回删除数据的前一个位置指针
*/
template<class T>
Node<T> *LinkList<T>::pop_back()
{
if(!head->next)
{
cout<<"链表为空,pop_back失败!"<<endl;
return NULL;
}
else
{
Node<T> * p=head->next;
Node<T> * q=NULL;
while(p->next)
{
q=p;
p=p->next;
}
q->next=NULL;
delete p;
return q;
}
}
/*
返回链表的第一个数据
返回类型:const T & 返回链表的第一个数据的引用
*/
template<class T>
const T & LinkList<T>::front()
{
if(!head->next)
{
cout<<"链表为空,front失败!"<<endl;
return NULL;
}
else
{
return head->next->date;
}
}
/*
返回链表的最后一个数据
返回类型:const T & 返回链表的最后一个数据的引用
*/
template<class T>
const T & LinkList<T>::back()
{
if(!head->next)
{
cout<<"链表为空,back失败!"<<endl;
return NULL;
}
else
{
Node<T> * p=head->next;
Node<T> * q=NULL;
while(p)
{
q=p;
p=p->next;
}
return q->date;
}
}
/*
在链表的任意位置插入数据
返回类型:Node<T>* 返回插入的数据的指针位置
int pos :插入的数据的位置
const T & e:插入的数据
*/
template<class T>
Node<T> *LinkList<T>::insert(int pos,const T &e)
{
if(!head->next)
{
cout<<"链表为空,insert失败!"<<endl;
return NULL;
}
else if(pos>this->size())
{
cout<<"pos位置超出链表长度,insert失败!"<<endl;
return NULL;
}
else if(pos<0)
{
cout<<"pos位置不存在,insert失败!"<<endl;
return NULL;
}
else
{
int i=1;
Node<T> * p=head->next;
Node<T> * q=NULL;
while(i<pos)
{
q=p;
p=p->next;
i++;
}
Node<T> * k =newNode<T>;
k->date=e;
q->next=k;
k->next=p;
return k;
}
}
/*
删除任意位置的数据
返回类型:const T & 返回链表被删除数据的引用
int pos :要删除数据的位置
*/
template<class T>
const T & LinkList<T>::del(int pos)
{
if(!head->next)
{
cout<<"链表为空,del失败!"<<endl;
return NULL;
}
else if(pos<0|pos>this->size())
{
cout<<"pos位置不存在,del失败!"<<endl;
return NULL;
}
else
{
int i=1;
Node<T> * p=head->next;
Node<T> * q=NULL;
while(i<pos)
{
q=p;
p=p->next;
i++;
}
q->next=p->next;
T e=p->date;
delete p;
return e;
}
}
/*
删除与e相同的数据
*/
template<class T>
void LinkList<T>::delelm(const T&e)
{
if(!head->next)
{
cout<<"链表为空,del失败!"<<endl;
return NULL;
}
else
{
Node<T> * p=head->next;
Node<T> * q=NULL;
while(p->date!=e)
{
q=p;
p=p->next;
}
q->next=p->next;
delete p;
}
}
/*
返回链表的长度
*/
template<class T>
int LinkList<T>::size()
{
if(!head->next)
{
cout<<"链表为空!"<<endl;
return 0;
}
else
{
Node<T> * p=head->next;
int i=1;
while(p->next)
{
p=p->next;
i++;
}
return i;
}
}
/*
清空链表
*/
template<class T>
void LinkList<T>::clear()
{
Node<T> * p=head;
while(p)
{
head=p;
p=p->next;
deletehead;
}
}
/*
遍历输出链表中的数据
*/
template<class T>
void LinkList<T>::display()
{
if(!head->next)
{
cout<<"链表为空,display失败!"<<endl;
return ;
}
else
{
Node<T> * p=head->next;
while(p)
{
cout<<p->date<<",";
p=p->next;
}
cout<<endl;
}
}
int main()
{
LinkList<int> l;
l.push_back(10);
l.push_front(9);
l.push_back(8);
l.push_front(7);
l.display();
l.pop_back();
l.pop_front();
l.display();
cout<<"链表长度:"<<l.size()<<endl;
l.push_back(3);
l.push_front(4);
l.insert(2,6);
l.display();
l.del(2);
l.delelm(9);
l.display();
l.clear();
return 0;
}
相关文章推荐
- linkList C++简单链式链表的实现
- C++简单实现顺序表与单链表
- 我认为是最简单的c++实现线性表中链表相关过程
- C++简单实现双链表
- 简单数据结构之循环链表(C++实现)
- 几种简单的数据结构的C++实现,树,图,链表,环形队列,栈等---环形队列篇
- C++实现简单的双向链表
- 简单双向链表(C++模版技术实现)
- 几种简单的数据结构的C++实现,树,图,链表,环形队列,栈等---栈篇
- C++ 带有头结点的单链表的简单实现
- 用c++实现简单的单向链表
- [C++] 模板类实现简单链表
- C++实现简单链表
- c++简单链表实现
- C++实现简单的单链表
- C++模板实现简单的链表和顺序表
- C++中实现一个简单的单向链表
- 一个简单链表的C++实现
- 简单数据结构之双向链表(C++实现)
- 简单单链表C++实现