您的位置:首页 > 其它

用一个异质链表(多态性)保存学生数据

2015-06-23 18:56 351 查看
#include<iostream>
#include<string>
using namespace std;
class Student
{
public:
virtual void get()=0;
virtual void display()=0;
string name;
string num;
};
class UnderGrad :public Student
{
public:
void get()
{
cout << "姓名:"; cin >> name;
cout << "学号:"; cin >> num;
cout << "班级号:"; cin >> classnum;
}
void display();
private:
string classnum;
};
class Graduate :public Student
{
public:
void get()
{
cout << "姓名:"; cin >> name;
cout << "学号:"; cin >> num;
cout << "导师姓名:"; cin >> tutor;
}
void display();
private:
string tutor;
};
void UnderGrad::display()
{
cout << "姓名"<<"\t"<<"学号"<<"\t"<<"班级"<<endl;
cout<<name<<"\t"<<num<<"\t"<<classnum<<endl;
}
void Graduate::display()
{
cout << "姓名"<<"\t"<<"学号"<<"\t"<<"导师姓名"<<endl;
cout<<name<<"\t"<<num<<"\t"<<tutor<<endl;
}
template <typename T>
class SList;

template <typename T>
class Node
{
friend class SList<T>;
public:
Node(T *data) :data(data), next(NULL){}
private:
T *data;
Node<T> *next;
};
template < typename T>
class SList
{
public:
SList():head(NULL), tail(NULL){}
void Insert(T *newNode)
{
Node<T> *t = new Node<T>(newNode);
if (!head)
{
head = tail = t;
length++;
}
else
{
tail->next = t;
tail = t;
length++;
}
}
void Delete()
{
Node<T> *t = head;
head = head->next;
delete t;
}
void Print()
{
if (!head)
{
cout << "链表空..." << endl;
return;
}
Node<T> *t;
for (t = head; t; t = t->next)
{
t->data->display();
}
}
private:
int length;
Node<T> *head;
Node<T> *tail;
};

int main()
{
char c; UnderGrad U; Graduate G;
SList<Student> List;
for (;;)
{
cout << "创建学生:类型(U)本科生,(G)研究生,(E)结束:";
cin >> c;
if (c == 'E'){ cout << "销毁链表."<<endl; break; }
else if (c == 'U' || c == 'G')
switch (c)
{
case 'U':U.get(); List.Insert(&U); break;
case 'G':G.get(); List.Insert(&G); break;
default: break;
}
else cout << "输入无效请重新输入:" << endl;
}
List.Print();
List.Delete();
List.Delete();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: