#ifndef LINKLIST_H
#define LINKLIST_H
template<class T>
class LinkList; //提前引用声明
template<class T>
class SNode
{
friend class LinkList<T>; //声明LinkList为友元类
friend void MergeList<T>(LinkList<T>&HX,LinkList<T>&HY,LinkList<T>&HZ);
friend void ResolList<T>(LinkList<T>&HL,LinkList<T>&HO,LinkList<T>&HE);
private:
T data;
SNode<T>* next;
};
template<class T>
class LinkList
{
friend void MergeList<T>(LinkList<T>&HX,LinkList<T>&HY,LinkList<T>&HZ);
friend void ResolList<T>(LinkList<T>&HL,LinkList<T>&HO,LinkList<T>&HE);
public:
LinkList();
~LinkList();
int ListLen()const; //统计线性表长度
void InsertList(T b,T a);//在元素b之前插入元素a
bool DeleteList(T b); //删除指定元素
SNode<T>* FindList(T item)const; //元素查找
bool EmptyList()const; //判断是否空
void ClearList();//释放空间
void PrintList()const; //输出列表内容
private:
SNode<T>* head; //链表的头指针
};
#endif
#include"LinkList.h"
using namespace std;
template<class T>
LinkList<T>::LinkList()
{
head=NULL;
}
template<class T>
LinkList<T>::~LinkList()
{
ClearList();
}
template<class T>
int LinkList<T>::ListLen()const //统计线性表长度
{
SNode<T>*p=head;
int len=0;
while(p)
{
p=p->next;
len++;
}
return len;
}
template<class T>
void LinkList<T>::InsertList(T b,T a)//在元素b之前插入元素a
{
SNode<T>*newp=new SNode<T>;
assert(newp!=NULL);
newp->data=a;
//处理线性表空或元素b处于第一个结点的情况
if(head==NULL||head->data==b)
{
newp->next=head;
head=newp;
return;
}
//从线性表的第二个结点开始查找元素b的前一个节点q
SNode<T> *q=head,*p=q->next;
while(p!=NULL&&p->data!=b)
{
q=p;
p=p->next;
}
newp->next=q->next; //若找到元素b,把a插入b之前
q->next=newp; //若b不在表中,则把a插入最尾
}
template<class T>
bool LinkList<T>::DeleteList(T b) //删除指定元素
{
SNode<T>*p=head,*q=NULL; //q为p的前件
while(p!=NULL)
{
if(p->data==b)break;
q=p;
p=p->next;
}
if(p==NULL) return false;
if(q==NULL) head=p->next; //处理b在第一个结点的情况
else
q->next=p->next; //其他情况正常删除
delete p;
return true;
}
template<class T>
SNode<T>* LinkList<T>::FindList(T item)const //元素查找
{
SNode<T>*p=head;
while(p!=NULL)
{
if(p->data==item)
return p;
else
p=p->next;
}
cout<<"表中不存在制定元素!\n";
system("pause");
exit(1);
}
template<class T>
bool LinkList<T>::EmptyList()const //判断是否空
{
return head==NULL;
}
template<class T>
void LinkList<T>::ClearList()//释放空间
{
SNode<T>*p=head,*q;
while(p!=NULL)
{
q=p;
p=p->next;
delete q;
}
head=NULL;
}
template<class T>
void LinkList<T>::PrintList()const
{
SNode<T>*p=head;
while(p)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
return;
}
//(x1,x2,x3---,xm)(y1,y2,y3---yn) 合并后(x1,y1,x2,y2,x3,y3-------)
template<class T>
void MergeList<T>(LinkList<T>&HX,LinkList<T>&HY,LinkList<T>&HZ) //将HX与HY合并存放在HZ中
{
if(HX.head==NULL) HZ.head=HY.head;
else if(HY.head=NULL) HZ.head=HX.head;
else
{
HZ.head=HX.head; //取HX为合并后的指针
SNode<T>*p=HX.head,*q=HY.head,*m,*n;
while(p!=NULL&&q!=NULL)
{
m=p->next;
n=q->next;
p->next=q;
if(m!=NULL) q->next=m; //若HX还有未合并的节点,把Xi+1接在Yi之后
p=m;
q=n;
}
}
}
//线性表分解 按不同规定写出不同算法
//根据奇偶性分解
template<class T>
void ResolList<T>(LinkList<T>&HL,LinkList<T>&HO,LinkList<T>&HE)
{
SNode<T>*p=HL.head;
while(p!=NULL)
{
SNode<T>*q=p;
p=p->next;
if(q->data%2==0)
{
q->next=HE.head;
HE.head=q;
}
else
{
q->next=HO.head;
HO.head=q;
}
}
HL.ClearList();
}
问题出现在那两个友元函数中,编译通不过 ,求高手解决!!
friend void MergeList(LinkList<T>&HX,LinkList<T>&HY,LinkList<T>&HZ);
friend void ResolList(LinkList<T>&HL,LinkList<T>&HO,LinkList<T>&HE);
直接贴代码,希望看的更明了。
template<class T>
void ResolList(LinkList<T>&HL,LinkList<T>&HO,LinkList<T>&HE)
{