#include <iostream.h>
#include <string.h>
#include <conio.h>
class Student {
friend class List;
protected:
char name[20];
int number;
static Student *ptr;
Student *next;
public:
Student(char *,int);
virtual void print();
virtual void insert(){};
};
class UnderGrad:public Student{
friend class List;
int level;
public:
UnderGrad(char *,int,int);
void print();
void insert();
};
class Graduate:public Student{
friend class List;
char teaname[20];
public:
Graduate(char *,int,char *);
void print();
void insert();
};
class List //定义异质链表类
{
Student *root;
public:
List(){root=0;}
void insert_Student(Student *node);
void remove(char *name);
void print_List();
};
Student::Student(char *name,int number){
strcpy(Student::name,name);
Student::number=number;
next=0;
}
void Student::print(){ //输出基类数据成员
cout<<"name:"<<name<<"\n";
cout<<"number:"<<number<<"\n";
}
UnderGrad::UnderGrad(char *name,int number,int level):Student(name,number){
UnderGrad::level=level;
}
void UnderGrad::print(){
Student::print();
cout<<"level: "<<level<<"\n";
}
void UnderGrad::insert(){
ptr=new UnderGrad(name,number,level);
}
Graduate::Graduate(char *name,int number,char *teaname):Student(name,number){
strcpy(Graduate::teaname,teaname);
}
void Graduate::print(){
Student::print();
cout<<"teacher's name: "<<teaname<<"\n";
}
void Graduate::insert(){
ptr=new Graduate(name,number,teaname);
}
void List::insert_Student(Student *node){
char key[20];
strcpy(key,node->name);
Student *curr_node=root;
Student *previous=0;
while(curr_node!=0 && strcmp(curr_node->name,key)<0){
previous=curr_node;
curr_node=curr_node->next;
}
node->insert();
node->ptr->next=curr_node;
if(previous==0)
root=node->ptr;
else previous->next=node->ptr;
}
void List::remove(char *name){
Student *curr_node=root;
Student *previous=0;
while(curr_node!=0 && strcmp(curr_node->name,name)!=0){
previous=curr_node;
curr_node=curr_node->next;
}
if(curr_node!=0 && previous==0){
root=curr_node->next;
delete curr_node;
}
else if(curr_node!=0 && previous!=0){
previous->next=curr_node->next;
delete curr_node;
}
}
void List::print_List (){
Student *cur=root;
while(cur!=0){
cur->print();
cur=cur->next;
}
}
Student *Student::ptr=0;
void main(){
List people;
UnderGrad und("Zhangshan",000111,2);
Graduate gra("Lisi",012121,"Wangermazi");
people.insert_Student(&und);
people.insert_Student (&gra);
people.print_List ();
getch;
people.remove ("Zhangshan");
people.remove ("Lisi");
people.print_List ();
}