首页 新闻 会员 周边

C++ 类模板友元函数模板问题(高手帮帮忙呀)

0
悬赏园豆:20 [待解决问题]

#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();   
}

问题出现在那两个友元函数中,编译通不过    ,求高手解决!!

天极的主页 天极 | 初学一级 | 园豆:80
提问于:2011-08-13 18:42
< >
分享
所有回答(1)
0
    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)
{
胡屯 | 园豆:714 (小虾三级) | 2011-11-17 14:18
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册