在C++实现中如果遇到结点结构好定义为struct,否则会像上述情况一样需要声明多次友元,反而破坏了类的封装性
  测试代码:
  [cpp] view plain copy print?
  void menu() 
  { 
  cout<<"************1.尾插************2.尾删**************"<<endl; 
  cout<<"************3.头插************4.头删**************"<<endl; 
  cout<<"************5.指定位置后插****6.指定位置前插******"<<endl; 
  cout<<"************7.删除指定元素****8.删除所有指定元素**"<<endl; 
  cout<<"************9.排序************0.退出*************"<<endl; 
  cout<<"************11.Erase**********0.退出*************"<<endl; 
  } 
  void test() 
  { 
  LinkList list; 
  Node *ret=NULL; 
  int input=1; 
  DataType x,num; 
  while(input) 
  { 
  menu(); 
  cout<<"请输入您的选择>"; 
  cin>>input; 
  switch(input) 
  { 
  case 1: 
  cout<<"请输入您要插入的数据>"; 
  cin>>x; 
  list.PushBack(x); 
  break; 
  case 2: 
  list.PopBack(); 
  break; 
  case 3: 
  cout<<"请输入您要插入的数据>"; 
  cin>>x; 
  list.PushFront(x); 
  break; 
  case 4: 
  list.PopFront(); 
  break; 
  case 5: 
  cout<<"请输入您要查找的数据>"; 
  cin>>x; 
  ret=list.FindNum(x); 
  if(ret != NULL) 
  { 
  cout<<"请输入您要插入的数据>"; 
  cin>>num; 
  list.Insert(ret,num); 
  } 
  else 
  { 
  cout<<"您所查找的数据不存在"<<endl; 
  } 
  break; 
  case 6: 
  cout<<"请输入您要查找的数据>"; 
  cin>>x; 
  ret=list.FindNum(x); 
  if(ret != NULL) 
  { 
  cout<<"请输入您要插入的数据>"; 
  cin>>num; 
  list.Insert(0,ret,num);  //0用于占位,构成重载 
  } 
  else 
  { 
  cout<<"您所查找的数据不存在"<<endl; 
  } 
  break; 
  case 7: 
  cout<<"请输入您要删除的数据>"; 
  cin>>x; 
  list.Remove(x); 
  break; 
  case 8: 
  cout<<"请输入您要删除的数据>"; 
  cin>>x; 
  list.RemoveAll(x); 
  break; 
  case 9: 
  list.Sort(); 
  break; 
  case 10: 
  cout<<list<<endl; 
  break; 
  case 11: 
  cout<<"请输入您要擦除的数据>"; 
  cin>>x; 
  ret=list.FindNum(x); 
  if(ret != NULL) 
  { 
  list.Erase(ret); 
  } 
  else 
  { 
  cout<<"您所查找的数据不存在"<<endl; 
  } 
  break; 
  case 0: 
  break; 
  default: 
  cout<<"您的输入错误"<<endl; 
  break; 
  } 
  } 
  }