代码(内有详细标注):
#include<iostream>
#include<fstream>
#include<string>
#include<iomanip>
#include <stdlib.h>
using namespace std;
#define MAXSIZE 100
typedef int Status;//将类型Status定义为int类型
typedef struct{
string no;
string name;
string xb;
int age;
}Student;//建立名为Student类型的结构体,用于录入学生的信息
typedef struct{
Student *elem;//student类型的指针
int length;
}SqList;//建立名为SqList类型的结构体,用于建立线性表
void shuru(SqList &L,int a){//手动输入
int i;
cout <<"请输入学生信息的学号 姓名 性别 年龄(用空格隔开):" <<endl;
for(i=0;i<a;i++)
cin >>L.elem[i].no >>L.elem[i].name >>L.elem[i].xb >>L.elem[i].age;//输入学生的信息
L.length=a;//更新线性表的长度
cout <<"输入成功" <<endl;
cout <<endl;
}
Status InitList(SqList &L){//建立
L.elem=new Student[MAXSIZE];//将类型为SqList的L内存分成大小为MAXSIZE,类型为Student的小内存
if(!L.elem)
exit(-2);//异常结束
L.length=0;
return 1;
}
Status LocateElem(SqList L,Student e){//姓名查找
int i;
for(i=0;i<L.length;i++){
if(L.elem[i].name==e.name)
return i;//返回查找学生的信息在线性表中的序号
}
return -1;
}
Status GetElem(SqList L,int temp,Student &e){//序号查找
if(temp<1||temp>L.length)//查找的序号小于1或者大于线性表的长度
return 0;
e=L.elem[temp-1];
return 1;
}
Status ListDelete(SqList &L,int a){//删除
int j;
if(a<1||a>L.length)//删除的序号小于1或者大于线性表的长度
return 0;
for(j=a;j<=L.length-1;j++)
L.elem[j-1]=L.elem[j];//进行学生信息的覆盖
--L.length;//线性表长度的更新
return 1;
}
Status ListInsert(SqList &L,int a,Student e){//插入
int j;
if(a<1||a>L.length+1||L.length==MAXSIZE)//插入的序号小于1或者大于线性表的长度或者线性表的长度等于MAXSIZE
return 0;
for(j=a;j<=L.length;j++)
L.elem[j]=L.elem[j-1];//进行学生信息的覆盖
L.elem[a-1]=e;
++L.length;//更新线性表的长度
return 1;
}
int main(){
SqList L;
int i=0,choose,a,temp;
Student e;
string head_1,head_2,head_3,head_4;
cout <<"1 建立\n2 手动输入\n3 文件输入\n4 输出\n5 姓名查找\n6 序号查找\n7 删除\n8 插入\n9 统计\n0 退出\n" <<endl;
choose=-1;
while(choose!=0){
cout <<"请选择:\n";
cin >>choose;
switch(choose){
case 1 :
if(InitList(L))
cout <<"建立成功\n";
else
cout <<"建立失败\n";
cout <<endl;
break;
case 2 :{
cout <<"请输入要输入的学生个数:" <<endl;
cin >> a;
shuru(L,a);
break;
}
case 3 :{
i=0;
fstream file;//fstream为文件指针类型
file.open("student.txt");//在同一文件夹中打开文件名为“student”,文件扩展名为“txt”的文件
if (!file) {
cout << "错误!未找到文件!" << endl;
exit(-1);//异常结束
}
file >> head_1 >> head_2 >> head_3 >> head_4;//将文件中第一行的内容(即学号,姓名,性别和年龄)一一赋值给这四个变量
while (!file.eof()) {
file >> L.elem[i].no >> L.elem[i].name >> L.elem[i].xb >> L.elem[i].age;
i++;
}//从第二行开始,将文件中的内容导入线性表
cout << "输入 student.txt 信息完毕\n";
cout <<endl;
L.length = i;//更新线性表的长度
file.close();//关闭文件
break;
}
case 4 :{
cout <<"当前学生信息(顺序表)读出:\n";
for(i=0;i<L.length;i++)
cout <<left <<setw(15) <<L.elem[i].no <<"\t"//"\t"表示换列
<<left <<setw(10) <<L.elem[i].name <<"\t" <<left <<setw(5)//setw(5)表示空出5个空格的位置用于填写后面输出的内容,多余的位置用空格代替
<<L.elem[i].xb <<"\t" <<left <<setw(5) <<L.elem[i].age <<endl;
cout <<endl;
break;
}
case 5 :{
cout <<"请输入查找学生的姓名:\n";
cin>>e.name;
if(a=LocateElem(L,e)+1)
cout <<left <<setw(15) <<L.elem[a-1].no <<"\t"<<left <<setw(10) <<L.elem[a-1].name <<"\t" <<left <<setw(5)
<<L.elem[a-1].xb <<"\t" <<left <<setw(5) <<L.elem[a-1].age <<endl;//输出该姓名对应的学生信息
else
cout <<"查无此人" <<endl;
cout <<endl;
break;
}
case 6 :{
cout <<"请输入查询的序号:" <<endl;
cin >>temp;
if(GetElem(L,temp,e))
cout <<left <<setw(15) <<e.no <<"\t"//换列
<<left <<setw(10) <<e.name <<"\t" <<left <<setw(5)
<<e.xb <<"\t" <<left <<setw(5) <<e.age <<endl;//输出该序号对应的学生信息
else
cout <<"没有此序号" <<endl;
cout <<endl;
break;
}
case 7 :{
cout <<"请输入删除的序号:" <<endl;
cin >>a;
if(ListDelete(L,a))
cout <<"删除成功" <<endl;
else
cout <<"删除失败" <<endl;
cout <<endl;
break;
}
case 8 :{
cout <<"请输入需要插入的学生信息 学号 姓名 性别 年龄(用空格隔开):\n";
cin >>e.no >>e.name >>e.xb >>e.age;
cout <<"请输入插入的位置:\n";
cin >>a;
if(ListInsert(L,a,e))
cout <<"插入成功\n";
else
cout <<"插入失败\n";
cout <<endl;
break;
}
case 9 :
cout <<L.length <<endl;
cout <<endl;
break;
}
}
return 0;
}