定义一个学生类CStudent,学生类的数据成员包括姓名、学号和成绩等。

定义一个学生类CStudent,学生类的数据成员包括姓名、学号和成绩等。结点类对象的数据域info为学生类对象。需要在学生类中重载比较运算符。... 定义一个学生类CStudent,学生类的数据成员包括姓名、学号和成绩等。
结点类对象的数据域info为学生类对象。需要在学生类中重载比较运算符。
展开
 我来答
伤倏臀w
推荐于2016-07-01 · TA获得超过1115个赞
知道大有可为答主
回答量:864
采纳率:60%
帮助的人:600万
展开全部
#include"Exp19_1.h"
#include<fstream>
#include<iostream>
#include<string>
using namespace std;

class student{ //为了简化,数据域仅保留学号与姓名
int key;
string name;
public:
void putkey(int k){key=k;}
void putnam(string nam){name=nam;}
void show(){cout<<key<<'\t'<<name<<endl;}//典型的应重载插入运算符
bool operator<(student& stu){return key<stu.key;}
bool operator!=(student& stu){return key!=stu.key;}
};

int main(){
int i,k;
string nam;
Node<student> * P1;
student stu;
List <student>list1,list2,list3;
ifstream infile;
infile.open("EXP19_1.txt",ios::in);
if(!infile){
cout<<"不能打开文件"<<endl;
return 1;
}
for(i=0;i<9;i++){
infile>>k;
stu.putkey(k);
infile>>nam;
stu.putnam(nam);
P1=list1.CreatNode(stu);
list1.InsertFront(P1);//向前生成list1
P1=list1.CreatNode(stu);
list2.InsertRear(P1); //向后生成list2
}
infile.close();
list1.PrintList();
cout<<"list1长度:"<<list1.Length()<<endl;
cout<<endl;
list2.PrintList();
cout<<endl;
cout<<"请输入一个要求删除的学号"<<endl;
cin>>k;
stu.putkey(k);
P1=list1.Find(stu);
if(P1!=NULL){
P1=list1.DeleteNode(P1);
delete P1;
list1.PrintList();
cout<<"list1长度:"<<list1.Length()<<endl;
}
else cout<<"未找到"<<endl;
cout<<endl;

list1.MakeEmpty();//清空list1
cout<<"清空后list1长度:"<<list1.Length()<<endl;

infile.open("EXP19_1.txt",ios::in);
infile.clear();//如果文本文件结束前缺回车,无此句会出错
if(!infile){
cout<<"不能打开文件"<<endl;
return 1;
}
for(i=0;i<9;i++){
infile>>k;
stu.putkey(k);
infile>>nam;
stu.putnam(nam);
P1=list3.CreatNode(stu);
list3.InsertOrder(P1);//升序创建list1
}
infile.close();
list3.PrintList();
cout<<endl;
return 0;
}

此为头文件:

#include<iostream>
using namespace std;
//首先看结点组织,采用结点类,凡与结点数据和指针操作有关函数作为成员函数
template<typename T>class List;
template<typename T>class Node{
T info; //数据域
Node<T> *link; //指针域
public:
Node(); //生成头结点的构造函数
Node(const T & data);//生成一般结点的构造函数
void InsertAfter(Node<T>* P); //在当前结点后插入一个结点
Node<T>* RemoveAfter(); //删除当前结点的后继结点,返回该结点备用
friend class List<T>;
//以List为友元类,List可直接访问Node的私有成员,与结构一样方便,但更安全
};
template <typename T> Node<T>::Node(){link=NULL;}
template <typename T> Node<T>::Node(const T & data){
info=data;
link=NULL;
}
template<typename T>void Node<T>::InsertAfter(Node<T>* p){
p->link=link;
link=p;
}
template<typename T>Node<T>* Node<T>::RemoveAfter(){
Node<T>* tempP=link;
if(link==NULL) tempP=NULL; //已在链尾,后面无结点
else link=tempP->link;
return tempP;
}
//再定义链表类,选择常用操作:包括建立有序链表、搜索遍历、插入、删除、取数据等
template<typename T>class List{
Node<T> *head,*tail;//链表头指针和尾指针
public:
List(); //构造函数,生成头结点(空链表)
~List(); //析构函数
void MakeEmpty(); //清空一个链表,只余表头结点
Node<T>* Find(T data); //搜索数据域与data相同的结点,返回该结点的地址
int Length(); //计算单链表长度
void PrintList(); //打印链表的数据域
void InsertFront(Node<T>* p); //可用来向前生成链表,在表头插入一个结点
void InsertRear(Node<T>* p); //可用来向后生成链表,在表尾添加一个结点
void InsertOrder(Node<T> *p); //按升序生成链表
Node<T>*CreatNode(T data); //创建一个结点(孤立结点)
Node<T>*DeleteNode(Node<T>* p); //删除指定结点
};
template<typename T>List<T>::List(){
head=tail=new Node<T>();
}
template<typename T>List<T>::~List(){
MakeEmpty();
delete head;
}
template<typename T>void List<T>::MakeEmpty(){
Node<T> *tempP;
while(head->link!=NULL){
tempP=head->link;
head->link=tempP->link; //把头结点后的第一个节点从链中脱离
delete tempP; //删除(释放)脱离下来的结点
}
tail=head; //表头指针与表尾指针均指向表头结点,表示空链
}
template<typename T> Node<T>* List<T>::Find(T data){
Node<T> *tempP=head->link;
while(tempP!=NULL&&tempP->info!=data) tempP=tempP->link;
return tempP; //搜索成功返回该结点地址,不成功返回NULL
}
template<typename T>int List<T>::Length(){
Node<T>* tempP=head->link;
int count=0;
while(tempP!=NULL){
tempP=tempP->link;
count++;
}
return count;
}
template<typename T>void List<T>::PrintList(){
Node<T>* tempP=head->link;
while(tempP!=NULL){
tempP->info.show();
tempP=tempP->link;
}
cout<<endl;
}
template<typename T>void List<T>::InsertFront(Node<T> *p){
p->link=head->link;
head->link=p;
if(tail==head) tail=p;
}
template<typename T>void List<T>::InsertRear(Node<T> *p){
p->link=tail->link;
tail->link=p;
tail=p;
}
template<typename T>void List<T>::InsertOrder(Node<T> *p){
Node<T> *tempP=head->link,*tempQ=head; //tempQ指向tempP前面的一个节点
while(tempP!=NULL){
if(p->info<tempP->info)break; //找第一个比插入结点大的结点,由tempP指向
tempQ=tempP;
tempP=tempP->link;
}
tempQ->InsertAfter(p); //插在tempP指向结点之前,tempQ之后
if(tail==tempQ) tail=tempQ->link;
}
template<typename T>Node<T>* List<T>::CreatNode(T data){//建立新节点
Node<T>*tempP=new Node<T>(data);
return tempP;
}
template<typename T>Node<T>* List<T>::DeleteNode(Node<T>* p){
Node<T>* tempP=head;
while(tempP->link!=NULL&&tempP->link!=p) tempP=tempP->link;
if(tempP->link==tail) tail=tempP;
return tempP->RemoveAfter();
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式