单链表的面向对象兑现
单链表的面向对象实现
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
这样就完成了彻底的对象会编程