实例:
以单向链表为例。建一个链表项作为一个类,名为Item,包含了数据项data和指针*next,指针用来指向下一个链表项。为了简便,它只有一个数据项用来存放数据。
再建立一个操作类,名为List,包含如下操作:
(1)显示输出一个已生成的链表;
(2)对一个空表插入链表项,插入的新表项放在表头;
(3)对一个空表追加链表项,追加的新表项放在表尾;
(4)两个链表的连接,即把一个链表接再另一个链表的后面;
(5)将一个链表的各链表项逆向输出;
(6)求得一个链表的数据项数。
把List类作为Item类的友元类,List类的对象有权创建和操作Item类的对象。代码如下:
#include<iostream>
using namespace std;
class List;
class Item {
public:
friend class List;
private:
Item(int d = 0) { data = d; next = 0; } //对象初始化
Item *next;
int data;
};
class List {
public:
List() { list = 0; }
List(int d) { list = new Item(d); }
int print(); //(1)
int insert(int d = 0); //(2)
int append(int d = 0); //(3)
void cat(List &il); //(4)
void reverse(); //(5)
int length(); //(6)
private:
Item *end();
Item *list;
};
int List::print()
{
if (list == 0) { //空链表输出empty
cout << "empty\n";
return 0;
}
cout << "(";
int cnt = 0; //计数菌
Item *pt = list;
while (pt) {
if (++cnt % 40 == 1 && cnt != 1) //40个一行
cout << endl;
cout << pt->data << " "; //输出当前项
pt = pt->next; //指针移动,指向下一项
}
cout << ")\n";
return cnt;
}
int List::insert(int d)
{
Item *pt = new Item(d); //创建新的数据项
pt->next = list; //使当前对象的next指针指向下一对象
list = pt; //使临时指针list指向当前对象
return d;
}
Item * List::end() //for循环将指针移动到了链表尾部
{
Item *prv, *pt;
for (prv = pt = list; pt; prv = pt, pt = pt->next);
return prv; //prv指向链表的末项,该项的next指针值为0
}
int List::append(int d)
{
Item *pt = new Item(d);
if (list == 0)
list = pt;
else
(end())->next = pt; //令值为0的next指针指向新项
return d;
}
void List::cat(List & il)
{
Item *pt = il.list; //pt指向链表il的头部
while (pt) {
append(pt->data); //从链表il头依次将项接到当前链表尾
pt = pt->next;
}
}
void List::reverse()
{
Item *pt, *prv, *tmp;
prv = 0;
pt = list; //pt指向链表头(第一项)
list = end();
while (pt != list) { //第一次循环
tmp = pt->next; //第二项指针值备份
pt->next = prv; //链表头指针值改为prv(初始为0)
prv = pt; //prv存放当前指针值
pt = tmp; //pt指向第二项
}
list->next = prv;
}
int List::length()
{
int cnt = 0; //计数菌
Item *pt = list;
for (; pt; pt = pt->next, cnt++);
return cnt;
}
void main()
{
List list1;
list1.print();
for (int i = 10; i < 18; i++)
list1.insert(i);
cout << "list1: ";
list1.print();
List list2;
for (int i = 15; i < 20; i++)
list2.append(i);
cout << "list2: ";
list2.print();
cout << "list1 length: " << list1.length() << endl;
list2.cat(list1);
cout << "list2: ";
list2.pr``
nt();
list2.reverse();
cout << "list2: ";
list2.print();
cout << "list2 length: " << list2.length() << endl;
}
输出如下:
empty
list1: (17 16 15 14 13 12 11 10 )
list2: (15 16 17 18 19 )
list1 length: 8
list2: (15 16 17 18 19 17 16 15 14 13 12 11 10 )
list2: (10 11 12 13 14 15 16 17 19 18 17 16 15 )
list2 length: 13
请按任意键继续. . .