您的位置:首页 > 理论基础 > 数据结构算法

用C++实现数据结构二 带头结点的单链表

2013-04-10 16:21 766 查看
ListNode.h

template<typename Type> class SingleList;

template<typename Type> class ListNode
{
private:
friend typename SingleList<Type>;   //建立一对一的映射,只将与ListNode类用同样类型实例化的SingleList类设为友元

ListNode():next(NULL) {}
//初始化结点的数据,next指针默认指向空
ListNode(const Type item, ListNode<Type> *nex= NULL):data(item), next(nex) {}

~ListNode()
{
next = NULL;
}

public:
friend ostream& operator<< <Type>( ostream&, ListNode<Type>& );
Type GetData();

private:
Type data;
ListNode *next;

};
template<typename Type>
Type ListNode<Type>::GetData()
{
return this->data;
}

template<typename Type>
ostream& operator<< (ostream &os, ListNode<Type> &l)
{
os<<l.data;
return os;
}


 

 

SingleList.h

#include "ListNode1.h"

template<typename Type> class SingleList
{
private:
ListNode<Type> *head;

public:
SingleList(): head( new ListNode<Type>() ){}
~SingleList()
{
MakeEmpty();
delete head;
}

void MakeEmpty();
int Length();
ListNode<Type> *Find(int n);
bool Insert( Type item, int n);
Type Remove( int n=0);
bool RemoveAll(Type item);
Type Get( int n);
void Print();
};

template<typename Type>
void SingleList<Type>::MakeEmpty()
{
ListNode<Type> *pmov = head->next, *pdel;
while(pmov != NULL)
{
pdel = pmov;
pmov = pmov->next;
delete pdel;
}
head->next = NULL;
}

template<typename Type>
int SingleList<Type>::Length()
{
int count=0;
ListNode<Type> *pmov = head->next;

while(pmov != NULL)
{
count++;
pmov = pmov->next;
}

return count;
}

template<typename Type>
ListNode<Type>* SingleList<Type>::Find(int n)
{
if(n < 1)
{
cout<<"the input is illegal"<<endl;
return NULL;
}

int i = 0;
ListNode<Type> *pmov = head;

while(i<n && pmov != NULL)
{
i++;
pmov= pmov->next;
}

if( pmov == NULL)
{
cout<<"cannot find the node at "<<n<<endl;
return NULL;
}

return pmov;
}

template<typename Type>
bool SingleList<Type>::Insert(Type item, int n)
{
if(n ==0 )
{
ListNode<Type> *pin = new ListNode<Type>(item);
pin->next = head->next;
head->next = pin;
return true;
}
ListNode<Type> *p = Find(n);

if( p == NULL)
{
cout<<"cannot insert the data "<<item<<" at "<<n<<endl;
return false;
}

ListNode<Type> *pin = new ListNode<Type>(item);

pin->next = p->next;
p->next = pin;
return true;
}

template<typename Type>
Type SingleList<Type>::Remove(int n=0)
{
if(n<1)
{
cout<<"the n is illegal"<<endl;
return 0;
}
ListNode<Type> *pdel = Find(n);
if(pdel == NULL)
{
cout<<"can not remove the node at "<<n<<endl;
return 0;
}
//是第一个节点
if(head->next == pdel)
{
head->next = pdel->next;
int item = pdel->data;
delete pdel;
return item;
}
//其他节点
ListNode<Type> *p = Find(n-1);
p->next = pdel->next;
int item = pdel->data;
delete pdel;
return item;
}
template<typename Type>
bool SingleList<Type>::RemoveAll(Type item)
{
int count=0;
ListNode<Type> *pmov = head->next, *pdel;
ListNode<Type> *p =head;
while(pmov != NULL)
{
p->next = pmov;
pdel = pmov;
if(pmov->data == item)
{
count++;
p->next = pmov->next;
pmov = pmov->next;
delete pdel;
}
else
{
pmov = pmov->next;
p=p->next ;
}
}
if(count != 0)
return true;
else
return false;
}

template<typename Type>
Type SingleList<Type>::Get(int n)
{
if(n<1)
{
cout<<"can not get the data at "<<n<<endl;
return 0;
}
ListNode<Type> *p = Find(n);
if(p == NULL)
{
cout<<"can not get the data at "<<n<<endl;
return 0;
}

return p->data;
}

template<typename Type>
void SingleList<Type>::Print()
{
cout<<"head-->";
ListNode<Type> *p = head->next ;
while(p != NULL)
{
cout<<p->data<<"-->";
p= p->next;
}
cout<<"over"<<endl;
}


 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: