//这是个school类的定义及实现,当中当然用到类的析构,构造等知识
//学生信息输入查询和删除查找方面都要用到字符串比较函数,另外信息的永久保存要用到文件的相关操作,贯穿始终的则是单链表的创建,查询,插入,删除等知识.其中,student类未定义,程序某些地方还不完善
class school //school类
{
public:
school()//构造函数,定义时自动调用此函数
{
head=new student;
head->next=NULL;
key=0;
}
~school()//析构函数,程序退出是调用此函数,释放一些申请过的空间
{
delete head;//删除头结点(只删除了一个节点,空间未释放完:)
}
void input();//录入函数声明
void mend();//修改函数声明
void del();//删除函数声明
int find(student **p,int num,char *pn="^");//子查找函数声明
void found();//查找函数声明
void show();//显示函数声明
void save();//保存函数声明
void begin();
void clear();
char mainmenu();
int getkey()//读取key
{
return key;
}
void setkey(int k)//设置key
{
key=k;
}
private:
student *head;
int key;
};
void school::input() //录入函数实现
{
student *p,*p2=NULL;
p=head;//标记表头,方便下面插入
int n;//此处n 初值要设置为1
while(p->next)
p=p->next;//在链表最后一个结点(空结点之前的)后面插入内容
while(n)
{
p2=new student;//申请一个结点
p2->input();//输入结点信息
p->next=p2;//插入到链表
p2->next=NULL;//将链表末节点置空,方便以后查找,以及结点的删除释放
p=p->next;//向下移动一个结点,(跳过刚刚插入的结点),以防下次继续插入
school::setkey(1);
cout<<"\t\t\t 按1继续添加,按0返回首页:";
cin>>n;
}
}
int school::find(student **p1,int num,char *pn) //子查找函数实现
{
student *p;
p=head;//标记头结点
while(p->next)//下一结点不为空时
{
(*p1)=p;
if((p->next)->getnumber()==num||!strcmp((p->next)->getname(),pn))//学号或者姓名相等则返回1(用到字符串比较函数)
return 1;
p=p->next;
}
return 0;
}
void school::found() //查找函数实现
{
student *p;
int num=-1,n=9;
char name[20]="^";
do
{
cout<<"\t\t\t 1:按编号查找 2:按姓名查找:";
cin>>n;
}
while(n<1||n>2);//不满足条件继续输入
if(n==1)
{
cout<<"输入学号:";//输入查找关键字
cin>>num;
}
if(n==2)
{
cout<<"输入姓名:";//输入要查找的学生姓名
cin>>name;
}
if(!find(&p,num,name))//调用查找子函数
{
cout<<"找不到您要查询的内容!"<
}
(p->next)->output();//输出学生信息
}
void school::del() //删除函数实现
{
student *p,*p2;
int num;
cout<<"输入学号:";//按学号删除
cin>>num;
if(!find(&p,num,"^"))
{
cout<<"找不到您要删除的内容!"<
}
(p->next)->output();
p2=p->next;
p->next=p2->next;
delete p2;
school::setkey(1);
}
void school::show() //显示函数实现
{
student *p;
p=head;
while(p->next)
{
(p->next)->output();
p=p->next;//此处为显示所有学生的信息
}
}
void school::mend() //修改函数实现
{
student *p;
int num=-1,n;
char name[20]="^";
do
{
cout<<"\t\t\t 1:按学号查找 2:按姓名查找:";
cin>>n;
}
while(n<1||n>2);//不符合要求的输入要重新输入
if(n==1)
{
cout<<"输入学号:";//输入要修改的学号
cin>>num;
}
if(n==2)
{
cout<<"输入姓名:";//输入要修改的姓名
cin>>name;
}
if(!find(&p,num,name))//结果未找到
{
cout<<"找不到你要修改的内容!"<
}
(p->next)->output();//输出修改前的信息
(p->next)->input();//输入要修改的信息
school::setkey(1);
}
void school::save() //保存函数实现
{
student *p;
p=head;
ofstream os("student.txt",ios::out);//打开名为student.txt的文本文件
if(school::getkey()==1)
{
while(p->next)
{
(p->next)->output(os);
p=p->next;
}
}//将信息写入到文件当中
cout<<"\t\t\t文件已保存! "<
}
void school::begin() //初始化函数
{
student *p,*p2;
p=head;
clear();
long t;
ifstream is("student.txt",ios::in); //创建文件
if(!is)
{
ofstream os("student.txt",ios::out);
os.close();
return ;
}
int num=-1;
while(1)//此处文件操作方面不太清楚
{
num=-1;
t=is.tellg();
is>>num;
is.seekg(t);
if(num<0)
{
is.close();
return;
}
p2=new student;
p2->input(is);
p->next=p2;
p2->next=NULL;
p=p->next;
}
}