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

实例:

   以单向链表为例。建一个链表项作为一个类,名为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
请按任意键继续. . .
  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值