【说明】设单链表的结点类和链表类的定义如下,链表不带有表头结点。请填空: #include<iostream.h> #include<assert.h> template<class T>class List; template<class T>class ListNOde{ friend (1) ; private: T data; ListNode<T> *link; public: ListNode():link(NULL)() ListNOde(const T& item,ListNOde<T>*next=NULL) :data(item),link(next){} }; template<class T>class List{ private: ListNode<T>*first; void createList(T A[],int n,int i,ListNOde<T>*&p); void printList(ListNOde<T>*p); public: List(); ~List(); friend ostream& operator<<(ostream& ost,List<T>&L); friend istream& operator>>(istream& ist,List<T>&L); }; template<class T> istream& operator>>(istream& ist,List<T>&1){ int i,n; ist>>n; T A[n]; for(i=0;i<n;i++) (2) ; createList(A,n,0,first); } template<class T> void List<T>::createList(TA[],int n,int i,ListNOde<T>*& p){ //私有函数:递归调用建立单链表 if(i==n)p=NULL; else{ p=new ListNode<T>(A[i]); assert(p !=NULL); createList( (3) ); } } template<class T> ostream& operator<<(ostream& ost,List<T>& L){ (4) ; } template<class T> void List<T>::printList(ostream& ost,ListNode<T>*p){ if(p!=NULL){ost<<p->data; (5) ; } }
参考答案:
解析: (1)class List<T> 模板类<class T>class List必须声明为模板类<class T>class ListNode的友元类,这样模板类<class T>class List的所有成员函数都可以直接访问模板类<class T>class ListNode的私有成员。 (2)ist>>A[i] 重载友元函数>>,从输入流对象ist读取具有n个值的数组A[],调用成员函数createList建立链表L。 (3)A,n,i+1,p->link 递归成员函数createList,根据给定的具有n个值的数组A[],建立以指针p为头指针的单链表。 (4)printList(ost,first) 重载友元函数<<,将first链表输出到输出流对象ost,调用成员函数printList实现。 (5)printList(p->link) 递归成员函数printLisk,输出以指针p为头指针的链表各结点所包含的数据到输出流对象ost中。