C++类和对象的应用实例——链表

来源:互联网 发布:三菱plc仿真软件汉化 编辑:程序博客网 时间:2024/04/30 02:33

实例:

   以单向链表为例。建一个链表项作为一个类,名为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;}

输出如下:

emptylist1: (17 16 15 14 13 12 11 10 )list2: (15 16 17 18 19 )list1 length: 8list2: (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请按任意键继续. . .
1 0