1、 strcpy(Title, ); Code = 0;Retrieval(char *title, long code) strcpy(Title, title); Code = code;void Retrieval:Show() cout 资料: Title t Code endl;class Book: public Retrieval /图书类private: char Author20; /作者名 char IndexCode10; /内部分类号 Book(); Book(char *author, char *title, char *index, long code); /显示图
2、书信息Book:Book(): Retrieval() strcpy(Author, strcpy(IndexCode, Book(char *author, char *title, char *index, long code): Retrieval(title, code) strcpy(Author, author); strcpy(IndexCode, index);void Book:图书: Author IndexCode class Magazine:public Retrieval /杂志类 int Volume; /卷号 Magazine(); Magazine(char
3、*title,int vol,long code); /显示杂志信息Magazine:Magazine(): Volume = 0;Magazine(char *title, int vol, long code): Volume = vol;void Magazine:杂志: Volume 读者类设计如下:/Reader.h class Reader /读者类 char Name20; /读者姓名 /借书证号 Book *books; /所借图书 int CounterB; /已借书数目 Magazine *magazines; /所借杂志 int CounterM; /已借杂志数目 Rea
4、der(); Reader(char *name, long code); Reader(); /显示读者信息 void ShowBooks(); /显示所借书 void ShowMagazines(); /显示所借杂志 void AddBook(Book it); /添加所借书 void AddMagazine(Magazine it); /添加所借杂志 void DelBook(Book it); /归还所借书 void DelMagazine(Magazine it); /归还所借杂志Reader:Reader() strcpy(Name, books = new Book5; Coun
5、terB = 0; magazines = new Magazine10; CounterM = 0;Reader(char *name, long code) strcpy(Name, name);Reader() delete books; delete magazines;void Reader:读者:t Name ShowBooks() if(CounterB = 0) cout 书已还清! return; for(int i = 0; i CounterB; i+) booksi.Show();ShowMagazines() if(CounterM = 0) 杂志已还清! Count
6、erM; magazinesi.Show();AddBook(Book it) if(CounterB 0; i-) if(booksi.GetCode() =it.GetCode() break; for(int j = i; j j+) booksj = booksj+1; CounterB-;AddMagazine(Magazine it) if(CounterM #include Retrieval.hReader.hvoid main(void) Book b1(朱战立, C+面向对象程序设计P306/5, 10001); Book b2(数据结构使用C语言(第3版)P306/6,
7、10002); Magazine m1(计算机学报, 13, 20001); Magazine m2(计算机应用, 12, 20002); Reader r1(张三, 30001); Reader r2(李四, 30002); r1.Show(); r2.Show(); r1.AddBook(b1); r1.AddBook(b2); r1.ShowBooks(); r2.AddMagazine(m1); r2.AddMagazine(m2); r2.DelMagazine(m1); r2.ShowMagazines();程序运行输出如下: 张三 30001 李四 30002C+面向对象程序设计
8、 朱战立 P306/5 10001数据结构使用C语言(第3版) 朱战立 P306/6 10002计算机应用 12 20002问题:进一步分析图书馆的图书和杂志管理和借阅方式,设计一个基本符合图书馆实际工作方式的图书和杂志借阅系统。.1.2 链式堆栈私有继承举例私有继承的特点是:基类的保护成员和公有成员将成为派生类的私有成员。私有继承的应用意义是:派生类在利用基类已经设计完成的代码资源的同时,限制派生类的对象调用基类中的公有成员。【例51.1】 先设计一个带头结点的单链表类,再设计一个带头结点的链式堆栈类,要求带头结点的链式堆栈类利用带头结点的单链表类的代码资源。设计:带头结点的链式堆栈和带头结
9、点的单链表在结构上完全相同,其构造都是一个由头指针指示的有size个结点的链表,惟一的差别是单链表允许在任意结点位置插入和删除,而链式堆栈只允许在头结点后插入和删除。带头结点的单链表结构如图5-7(a)所示,带头结点的链式堆栈结构如图5-7(b)所示。图51.2 单链表和链式堆栈(a)单链表;(b)链式堆栈单链表类的成员变量包括头指针和结点个数,成员函数包括:取结点个数、判链表空否、插入结点、删除结点、取结点的数据值。链式堆栈类的成员变量包括头指针和结点个数,成员函数包括:取结点个数、判堆栈空否、入栈、出栈、取栈顶结点的数据值。为了简化链式堆栈类的设计,可以把链式堆栈类设计成单链表类的派生类,
10、这样就可以利用单链表类的代码资源。以入栈为例,单链表类的插入结点是在参数指定的某个结点后插入一个结点,而链式堆栈类的入栈是在头结点后插入一个结点,因此入栈成员函数就可以用参数值固定为0调用插入结点成员函数来实现。链式堆栈类的其它成员函数设计方法类同。由于链式堆栈类只允许在栈顶位置插入结点,不允许在其他位置插入结点,因此,链式堆栈类要私有继承单链表类,这样就能保证外部程序的对象不能在其他位置随意插入结点,从而保证堆栈的正确性。带头结点的单链表类设计如下:/LinList.hstdlib.hclass ListNode /结点类 friend class LinList; ListNode *ne
11、xt; /指向下一结点的指针 float data; /数据元素 ListNode(ListNode *ptrNext = NULL) /构造函数,构造头结点 next = ptrNext; ListNode(const float& item, ListNode *ptrNext = NULL) /构造函数,构造其他结点 data = item; next = ptrNext;class LinList /单链表类 ListNode *head; /头指针 int size; /结点个数 void ClearList(void); /清空链表 ListNode *Index(int pos)
12、 const; /返回指向第pos个结点的指针 LinList(void); /构造函数 LinList(void); /析构函数 int ListSize(void) const; /取结点个数 int ListEmpty(void) const; /判链表空否 void Insert(const float& item, int pos);/插入一个结点 float Delete(int pos); /删除第pos个结点 float GetData(int pos) const; /取第pos个结点的data值LinList:LinList() /构造函数 head = new ListN
13、ode; /头指针指向头结点 size = 0; /定义size的初值为0LinList(void) /析构函数 ClearList(); /清空链表 delete head;void LinList:ClearList(void) /清空表为初始化状态 ListNode *p, *p1; p = head-next; /p指向第一个结点 while(p != NULL) /释放结点空间直至初始化状态 p1 = p; p = p- delete p1; /结点个数置为初始化值0ListNode *LinList:Index(int pos) const/返回指向第pos个结点的指针 if(po
14、s size)参数pos越界出错! exit(0); if(pos = -1) return head; /pos为-1时返回头指针head ListNode *p = head- /p指向第一个结点 int i = 0; /从0开始计数= NULL & pos) /寻找第pos个结点 i+; return p; /返回第pos个结点指针int LinList:ListSize(void) const /取结点个数 return size;ListEmpty(void) const /判链表空否 if(size next ListNode *newNode = new ListNode(ite
15、m, p-next); p-next = newNode; /新结点插入第pos个结点前 size+; /结点个数加1float LinList:Delete(int pos) /删除第pos个结点 if(size = 0) 链表已空无元素可删! ListNode *q, *p = Index(pos - 1); /p为指向第pos-1个结点指针 q = p- /q指向第pos个结点next = p-next- /第pos个结点脱链 float data = q-data; delete q; /释放第pos个结点空间 size-; /结点个数减1 return data; /返回第pos个结
16、点的data域值GetData(int pos) const /取第pos个结点的data值 ListNode *p = Index(pos); /p指向第pos个结点 return p-带头结点的链式堆栈类设计如下:/LinStack.hLinList.hclass LinStack: private LinList /私有继承 LinStack(void): LinList() LinStack(void) int StackSize(void)const /返回堆栈元素个数 return ListSize(); int StackEmpty(void) const /判堆栈空否 retu
17、rn ListEmpty(); void Push(const float& item) /入栈 Insert(item, 0); float Pop(void) /出栈 return Delete(0); float GetTop(void)const /取栈顶元素 return GetData(0);/Exam5-8.cppLinStack.h LinStack myStack; int i;初始元素个数: myStack.StackSize() for(i = 1;= 5; myStack.Push(i);入栈后元素个数:依次出栈的元素:; myStack.Pop() ;结束元素个数:程序运行输出结果为:55 4 3 2 1私有继承方式可以利用已设计完成的基类代码资源,简化派生类的代码设计,但是,这时所有成员函数的执行都是通过调用基类的成员函数实现的,其时间效率会受到一定的影响。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1