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
这样就完成了彻底的对象会编程