单链表的面向对象兑现

单链表的面向对象实现

1.利用非面向对象定义节点Node

下面是头文件LinkList.h

 

#ifndef LinkList_H
#define LinkList_H

template<class T>
struct Node{
	Node<T>* next;
	T data;
};

template<class T>
class LinkList{
	public:
		LinkList();							//建立只有头结点的空链表
		LinkList(T a[], int n); //建立有n个元素的单链表
		~LinkList();						//析构函数
		int length();						//求单链表的长度
		T get(int i);						//取单链表中第i个结点的元素值
		int locate(T x);				//求单链表中值为x的元素序号
		void insertData(int i, T x);//在单链表中第i个位置插入元素值为x的结点
		T deleteData(int i);		//在单链表中删除第i个结点
		void printList(); 			//遍历单链表,按序号依次输出各元素
		Node<T>* getFirst();		//获取头结点
	private:
		Node<T>* first;					//单链表的头指针
		void release();					//释放链表
};

#endif

在这里定义头结点是利用了原来c语言的方式,定义的结构体,这是c++从c继承过来的,现在要改成c++面向对象的方法定义节点!

 对头文件的实现LinkList.cpp就不写了

 

2.对Node节点的面向对象实现

a.LinkList.h

 

//LinkList.h  声明类LinkList
#ifndef LinkList_H
#define LinkList_H
#include "Node.h"

template <class T>
class LinkList
{
 public:
   LinkList( );  //建立只有头结点的空链表
   LinkList(T a[], int n);  //建立有n个元素的单链表
   ~LinkList( );          //析构函数
   int Length( );          //求单链表的长度
   T Get(int i);           //取单链表中第i个结点的元素值
   int Locate(T x);       //求单链表中值为x的元素序号
   void Insert(int i, T x);   //在单链表中第i个位置插入元素值为x的结点
   T Delete(int i);        //在单链表中删除第i个结点
   void PrintList( );           //遍历单链表,按序号依次输出各元素
 private:
   Node<T> *first;  //单链表的头指针
};

#endif

 b.然后在Node中将LinkList.h声明为友元类,这样可以访问Node中的私有成员

Node.h

 

//Node.h  声明类Node
#ifndef Node_H
#define Node_H

template <class T>
class LinkList;       //为是Node类的友员类而声明

template <class T>
class Node
{
   public:         
	  friend class LinkList<T>;   //将LinkList类设为友元类
   private:		    
	  T data;
      Node<T> *next;  
};

#endif

 这样就完成了彻底的对象会编程