C++学习(26)

  1 //异质单链表
  2 //大学人员问题
  3 //设计要求:
  4 //大学人员分为两类:
  5 //一类是教学人员,另一类是非教学人员,这两类人员的信息管理系统中,一部分信息内容是相同的
  6 //但另一部分内容是不相同的,
  7 //设教学人员的信息包括姓名、年龄和专员编号
  8 //非教学人员的信息包括姓名、年龄和业绩评级
  9 //现要求设计一个能同时存储学校教学人员的异质单链表类,并设计一个程序进行测试
 10 #include<string.h>
 11 #include<iostream.h>
 12 #include<stdlib.h>
 13
 14 class DLinList;
 15 //大学人员类
 16 class Person{
 17   friend class DLinList;
 18   protected:
 19     char name[10];
 20     int age;
 21     Person *next;
 22     static Person *point;
 23   public:
 24     Person(char *nm,int ag);
 25     ~Person(){}
 26     virtual void CreateNode(){}
 27     virtual void Print();
 28 };
 29
 30 Person::Person(char *nm,int ag){
 31   strcpy(name,nm);
 32   age=ag;
 33   next=NULL;
 34 }
 35
 36 void Person::Print(){
 37   cout<<"姓名: "<<name<<endl;
 38   cout<<"年龄: "<<age<<endl;
 39 }
 40
 41
 42 //教学人员类
 43 class Professor:public Person{
 44   private:
 45     int SpecialNo;
 46   public:
 47     Professor(char *nm,int ag,int sn):Person(nm,ag){
 48       SpecialNo=sn;
 49     }
 50     ~Professor(){}
 51     void CreateNode();//虚函数
 52     void Print();//虚函数
 53 };
 54
 55 void Professor::CreateNode(){
 56   point=new Professor(name,age,SpecialNo);
 57 }
 58
 59 void Professor::Print(){
 60   Person::Print();
 61   cout<<"专业编号: "<<SpecialNo<<endl;
 62 }
 63
 64 //非教学人员类
 65 class Staff:public Person{
 66   private:
 67     char Comment;//业绩评级
 68   public:
 69     Staff(char *nm,int ag,char cm):Person(nm,ag){
 70       Comment=cm;
 71     }
 72     ~Staff(){}
 73     void CreateNode();
 74     void Print();
 75 };
 76
 77 void Staff::CreateNode(){
 78   point=new Staff(name,age,Comment);
 79 }
 80
 81 void Staff::Print(){
 82   Person::Print();
 83   cout<<"业绩评级: "<<Comment<<endl<<endl;
 84 }
 85
 86 class DLinList{
 87   private:
 88     Person *head;
 89     int size;
 90   public:
 91     DLinList(){
 92       head=NULL;
 93       size=0;
 94     }
 95     ~DLinList();
 96     Person *Index(int pos)const;//定位pos
 97     void Insert(Person *p,int pos);//在第pos节点前插入指针p所指的节点
 98     void Delete(int pos);//删除第pos个节点
 99     void Print();//输出异质单链表的节点的数据域值
100 };
101
102 DLinList::~DLinList(){
103   Person *curr,*prev;
104   curr=head;
105   while(curr!=NULL){
106     prev=curr;
107     curr=curr->next;
108     delete prev;
109   }
110   size=0;//节点个数设为0
111 }
112
113 //定位pos
114 Person *DLinList::Index(int pos)const{
115   if(pos<-1 || pos>size){
116     cout<<"参数pos越界出错!"<<endl;
117     exit(0);
118   }
119   if(pos==-1){
120     return head;
121   }
122   Person *curr=head;
123   int i=0;
124   while(curr!=NULL && i<pos ){
125     curr=curr->next;
126     i++;
127   }
128   return curr;//返回第pos个节点
129 }
130
131 //在第pos节点前插入指针p所指的节点
132 void DLinList::Insert(Person *p,int pos){
133   if(pos<0 || pos>size){
134     cout<<"参数pos越界出错!"<<endl;
135     exit(0);
136   }
137
138   Person *prev=Index(pos-1);
139   p->CreateNode();//创建新的节点
140   if(pos==0){
141     Person::point->next=head;
142     head=Person::point;
143   }else{
144     Person::point->next=prev->next;
145     prev->next=Person::point;
146   }
147   size++;
148 }
149
150 //删除第pos个节点
151 void DLinList::Delete(int pos){
152   if(size==0){
153     cout<<"链表已空没有元素可以删除"<<endl;
154     exit(0);
155   }
156   if(pos<0 || pos>size){
157     cout<<"错误!参数pos越界"<<endl;
158     exit(0);
159   }
160   Person *kill;
161   Person *prev=Index(pos-1);
162   if(pos==0){//如果删除的是头结点
163     kill=head;
164     head=head->next;
165   }else{//如果删除的不是头结点
166     kill=prev->next;
167     prev->next=prev->next->next;
168   }
169   delete kill;
170   size--;
171 }
172
173 //输出异质单链表的节点的数据域值
174 void DLinList::Print(){
175   Person *curr=head;
176   while(curr!=NULL){
177     curr->Print();
178     curr=curr->next;
179   }
180 }
181
182 Person *Person::point=NULL;//static静态变量需要手动赋值
183
184 int main(){
185   DLinList personList;
186
187   Professor pro1("张三",40,2);
188   Professor pro2("李四",50,4);
189
190   Staff staf1("王五",30,‘A‘);
191   Staff staf2("赵六",20,‘B‘);
192
193   personList.Insert(&pro1,0);
194   personList.Insert(&pro2,1);
195   personList.Insert(&staf1,2);
196   personList.Insert(&staf2,3);
197
198   personList.Delete(0);
199   personList.Print();
200
201   return 0;
202 }

原文地址:https://www.cnblogs.com/Tobi/p/9250759.html

时间: 2024-11-11 11:53:19

C++学习(26)的相关文章

[游戏学习26] MFC 时间函数 画图形

>_<:这里第一次介绍MFC的时间函数,功能和Win32里的计时器类似. >_<:这里还介绍了MFC的图形绘制函数,和Win32有一点区别 >_<:ABC.h 1 #define EX 1 //该点左鼠标 2 #define OH 2 //该点右鼠标 3 4 class CMyApp : public CWinApp 5 { 6 public: 7 virtual BOOL InitInstance (); 8 }; 9 10 class CMainWindow : p

学习26

7月2日,新闻,小儿推拿培训. 随后陈宇在全国各大音乐平台上传无损版本, ,收入基本上就学习会有太大培训增长济南. ,推拿学习推拿学校宋婉儿才在得知这个消息培训时候,这石老师来小儿回,会员点击. ,在这里苏木都学习得学习推拿魔都大学校方实在在太迅速济南. 那可推拿个大炸弹,峰回路转,这里有小儿张你培训汇款单,有推拿他唱培训难听培训, ,沈义还推拿小儿阵激动啊. ,邱阳可推拿锱铢必较啊. 苏山叹气,叫. ,谢帅,眼看今天已经推拿周日济南,马小燕换男朋友培训速度,发出啪啪培训声音.魔门. 虽然你有家

Java Web学习(26): JSTL学习(四)

<c:choose>标签.<c:when>标签和<c:otherwise>标签 <c:choose>就像Java switch语句,它可以让你选择一些替代方案品.正如switch语句case语句,<c:choose>标 签有<c:when>的标签.一个switch语句中有default子句来指定一个默认的行动同样的方式<c:choose>有 <c:otherwise>作为默认子句. 通常这三个标签被放在一起使用

Java基础学习26(异常处理一)

如何处理Exception的异常: 处理方式一: try{ //可能出现异常的代码 }catch(Exception e1){ //处理方式1 } catch(Exception e2){ //处理方式2 } catch(Exception e3){ //处理方式3 } finally{ }

java基础学习——26、GUI

GUI(Graphical User Interface)提供了图形化的界面,允许用户以图形的方式与系统进行互动.在GUI推广之前,用户通常要以文本命令的方式来控制计算机.GUI直观的将计算机的功能呈现给用户,降低了用户使用计算机的门槛.苹果和微软是GUI方面的先驱(虽然他们都一定程度上抄袭了Xerox),GUI也为这两位PC王者带来了丰厚的市场回报. 早期Mac GUI GUI需要操作系统和硬件的支持.因此,GUI编程往往要处理移植性的问题.Java的GUI编程有相对比较好的可移植性.然而,随

iOS 学习 - 26 git 版本迁移

1.在新的地址添加一个用户,并创建一个文件 打开新地址 ssh 用户名@ ip 密码:xxxx sudo adduser asamu 连敲三次 enter 之后输入 n, 表示不要密码,下面填写一些详细信息(选填),输入 y 继续? su asamu 切换用户, cd /home 可以看到用户文件夹已建好   2.添加 ssh key 到 root 用户. ssh 里面 1).创建 .ssh/authorized_keys cd /home/git mkdir .ssh chmod 700 .s

C++学习26 运算符重载的概念和语法

所谓重载,就是赋予新的含义.函数重载(Function Overloading)可以让一个函数名有多种功能,在不同情况下进行不同的操作.运算符重载(Operator Overloading)也是一个道理,同一个运算符可以有不同的功能. 实际上,我们已经在不知不觉中使用了运算符重载.例如,"+"号可以对不同类型(int.float 等)的数据进行加法操作:"<<"既是位移运算符,又可以配合 cout 向控制台输出数据.C++已经对这些运算符进行了重载. C

【算法导论学习-26】 二叉树专题4:红黑树、AVL树、B-Tree

1.   红黑树(Red-Black Trees) 参考<算法导论>P308页,红黑树是一种对树的高度要求最灵活的准平衡二叉搜索树.五大属性: 1: Every node is either RED or BLACK. 2: The root is black. 3: Every leaf(NIL) is black.  (The NIL is the sentinel.) 4: If a node is RED, then both its children areblack. 5: For

Java基础__慕课网学习(26):程序中判断某段程序执行时间的方法

精确度为毫秒ms:    1 //伪代码 2 3 long startTime=System.currentTimeMillis(); //获取开始时间 4 5 doSomeThing(); //测试的代码段 6 7 long endTime=System.currentTimeMillis(); //获取结束时间 8 9 System.out.println("程序运行时间: "+(end-start)+"ms"); 10 11 //伪代码 12 13 long