/ //通常使用两个类,即链表的结点类和链表类,协同表示单链表。 //一个链表包含了零个或多个结点,因此一个类型为List的对象包含有等于零个或多个类型 //为LinkNode的对象。这种关系在面向对象方法中叫做聚合关系,或叫做整体-局部关系。 //为简化问题,设一个单链表的每一个结点中的数据元素为一个整型数据,有4种方法设计 //其数据结构。 ///1复合类/ //利用在LinkNode类中声明友元类的方法,让LinkNode类与List类的成员都能够访问 //LinkNode类的私有数据成员。注意,友元类的关系不具有对称性。在LinkNode类定义中 //声明List是它的友元类,则List类的所有成员都可以直接使用LinkNode的私有成员,不 //必通过接口操作。反之则不然,LinkNode的成员不能直接使用List的私有成员。 /// class List; //List类的前视声明 class LinkNode //结点类定义 { friend class List; //声明List类为友元类 private: int data; //数据元素域 LinkNode *link; //链指针域 }; class List //List类定义 { public: //链表公共操作 ...... private: LinkNode *first; //链表头指针 }; //2嵌套类/// //在List类定义的内部对LinkNode类进行定义。由于把LinkNode类定义在List类的private部分, //这就保证了List类外部的对象和函数不能直接接触到LinkNode类的对象。但LinkNode类的数据 //成员放在它的public部分,使得LinkNode类和List类的成员都能直接访问它们。 /// class List { public: //链表操作 .... .... .... private: class LinkNode //嵌套的类 { public: int data; //结点的数据域 LinkNode *link; //结点的指针域 }; LinkNode *first; //单链表的头指针 }; 3基类和派生类// //这种结构比较特殊,把LinkNode类声明为基类,List类声明为派生类,建立继承关系,让List类 //继承LinkNode类的数据成员和某些成员函数。这表示了一种“使用”关系。 /// class LinkNode //链表结点类 { protected: int data; LinkNode *link; }; class List:public class LinkNode { //链表类,继承链表结点类的数据和操作 private: LinkNode *first; //链表头指针 public: //链表操作 .... .... .... }; /用struct定义LinkNode类// //使用这种方法定义LinkNode类,使得LinkNode类失去了封装性,但简化了描述。由于在List类 //中把first封装在其内部,属于该List的所有LinkNode实例都成为List实例的私有成员,从而 //保证不被外界直接访问。 / struct LinkNode //链表结点结构体 { int data; LinkNode *link; }; class List { //链表类,直接使用链表结点结构体的数据和操作 private: LinkNode *first; //链表头指针 public: //链表操作 .... .... .... };