定义一个包含学生信息(学号,姓名,性别,专业,语数外成绩,平均分,成绩排名)的链表,使其具有如下功能:
话不多说,直接上代码!
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define Maxsize 100
//学生成绩表结构体
typedef struct stu
{
int num; //学号
char name[10]; //姓名
char sex[4]; //性别
char subject[20]; //专业学科
int Math; //数学
int Chinese; //语文
int English; //英语
double avg; //成绩平均分
int rank; //总分排名
struct stu* next; //指向后续节点
}STU; //单链表节点类型
typedef struct Index
{
int no;
int offset;
char name[20];
};
STU* Head=NULL; //定义一个指针
STU* End = NULL; //尾结点
void CreatList() //创建头结点和尾结点
{
Head = (struct stu*)malloc(sizeof(struct stu));
Head->next = NULL;
STU* End = Head;
}
void menu(){ //菜单项
cout<<"\t\t***************************************"<: ";
}
//添加学生成绩信息
void AddStudent()
{
int n, i;
cout<<"请输入您要添加的学生人数:";
cin>>n;
for (i = 0; inext = NULL;
cout<<"\n 要添加的第"<>pNew->num;
//检查是否已经添加过该学生,即检查学号是否重复
STU* temp = Head->next;
while (temp != NULL)
{
if (temp->num == pNew->num)
{
cout<<"\n 学号重复,请重新输入!"<>pNew->num;
temp = Head->next; //重新遍历检查学号
continue;
}
else
temp = temp->next;
}
cout<<"请输入第"<>pNew->name;
cout<<"请输入第"<>pNew->sex;
cout<<"请输入第"<>pNew->subject;
cout<<"请输入第"<>pNew->Math;
while (1)
{
if ((pNew->Math)< 0 || (pNew->Math > 100)) //检查成绩范围是否合理
{
cout<<"\n 输入成绩有误,请检查!\n";
cout<<"请重新输入第"<>pNew->Math;
}
else break;
}
cout<<"请输入第"<>pNew->Chinese;
while (1)
{
if ((pNew->Chinese)< 0 || (pNew->Chinese > 100))
{
cout<<"\n 输入成绩有误,请检查!\n";
cout<<"请重新输入第"<>pNew->Chinese;
}
else break;
}
cout<<"请输入第"<>pNew->English;
while (1)
{
if ((pNew->English)< 0 || (pNew->English) > 100)
{
cout<<"\n 输入成绩有误,请检查!\n";
cout<<"请重新输入第"<>pNew->English;
}
else break;
}
//按学号排序,边添加边排序;
if (Head->next == NULL)
{
Head->next = pNew; //作为首元素
End = Head->next;
}
else
{
if (pNew->num > End->num)
{
End->next = pNew;
End = End->next;
}
else
{
STU* p1 = Head->next;
if (pNew->num > p1->num) //链表中已经至少存在2个成员(至少存在首和尾);
{
STU* p2 = p1->next;
while (1)
{
if ((pNew->num > p1->num) && (pNew->num < p2->num))
{
pNew->next = p2;
p1->next = pNew;
break;
}
else //pNew->num > p2->num的情况
{
p1 = p1->next;
p2 = p2->next;
}
}
}
else //pNew->num < p1->num
{
pNew->next = p1;
Head->next = pNew;
}
}
}
}
cout<<"\n 学生信息全部添加完成!\n";
}
//通过前驱结点删除学生成绩信息
void DeleteStudent()
{
int num1;
cout<<"\n请输入您要删除的学生的学号:";
cin>>num1;
STU* pre =Head; //表中没有数据时,pre为空;
while (1)
{
if (pre->next && (pre->next->num == num1))
{
STU* q = pre->next; //保存该节点信息
pre->next = pre->next->next; //断开pre->next节点
cout<<"\n 删除操作成功!\n";
cout<<"\n 已删除的学生成绩信息如下!\n\n";
cout<<"\t学号\t姓名\t性别\t专业\t\t数学\t语文\t英语\t\n\n";
cout<<"\t"<num<<"\t"<name<<"\t"<sex<<"\t"<subject<<"\t\t"<Math
<<"\t"<Chinese<<"\t"<English;
free(q);
return;
}
else
{
if (pre->next != NULL)
pre = pre->next;
else
{
cout<<"\n 信息删除失败!\n";
return;
}
}
}
}
//更改学生成绩信息
void AlterStudent()
{
int num1;
printf("\n请输入您要更改学生的学号:");
cin>>num1;
STU* change = Head->next;
while (change && (change->num != num1))
change = change->next;
if (change)
{
cout<<"更改后的学号:";
cin>>change->num;
cout<<"更改后的姓名: ";
cin>> change->name;
cout<<"更改后的性别: ";
cin>>change->sex;
cout<<"更改后的专业: ";
cin>> change->subject;
cout<<"更改后的数学成绩: ";
cin>>change->Math;
cout<<"更改后的语文成绩: ";
cin>>change->Chinese;
cout<<"更改后的英语成绩: ";
cin>>change->English;
cout<<"\n 学生信息已经更改完毕!!!\n";
}
else
cout<<"\n 学生信息不存在,无法更改!!!\n";
}
//查询学生成绩信息
void SeekStudent()
{
while (1)
{
cout<<"\n请选择查询方式 按学号:1 按姓名:2: ";
int k;
cin>>k;
switch (k)
{
case 1:
{
int num2;
cout<<"\n请输入您要查找学生的学号:";
cin>>num2;
STU* find = Head->next;
while (find && (find->num != num2))
find = find->next;
if (find)
{
cout<<"\n查询学生信息如下:\n\n";
cout<<"\t学号\t姓名\t性别\t专业\t\t数学\t语文\t英语\n\n";
cout<<"\t"<num<<"\t"<name<<"\t"<sex<<"\t"<subject<<"\t\t"<Math
<<"\t"<Chinese<<"\t"<English;
}
else
cout<<"\n\n 没有查询到该学生信息!!!\n";
return;
}
case 2:
{
cout<<"\n请输入您要查找学生的姓名:";
char name1[20];
cin>>name1;
STU* find = Head->next;
while (find && (strcmp(find->name, name1) != 0))
find = find->next;
if (find)
{
cout<<"\n查询学生信息如下:\n\n";
cout<<"\t学号\t姓名\t性别\t专业\t\t数学\t语文\t英语\n\n";
cout<<"\t"<num<<"\t"<name<<"\t"<sex<<"\t"<subject<<"\t\t"<Math
<<"\t"<Chinese<<"\t"<English;
}
else
cout<<"\n 没有查询到该学生信息!!!\n";
return;
}
default:
{
cout<<"\n查询方式错误! 请重新选择查询方式\n";
break;
}
}
}
}
//输出全部学生信息
void DisplayAll()
{
STU* p = Head->next;
int len = 0;
int SX = 0;
int YW = 0;
int YY = 0;
double sum=0;
double avg=0;
cout<<"\n 全部学生成绩信息如下!\n\n";
cout<<"\t学号\t姓名\t性别\t专业\t\t数学\t语文\t英语\t平均分\n\n";
while (p!= NULL)
{
sum = p->Math + p->Chinese + p->English;
avg=sum/3;
p->avg=avg;
cout<<"\t"<num<<"\t"<name<<"\t"<sex<<"\t"<subject<<"\t\t"<Math
<<"\t"<Chinese<<"\t"<English<<"\t"<avg<Math;
YW = YW + p->Chinese;
YY = YY + p->English;
p = p->next; //指针后移
len++;
if (p == NULL)
{
cout<<"\n\n 成绩系统含学生总人数为:"<next;
int maxyw=0; int maxsx=0; int maxyy=0;
STU* qyw = NULL; STU* qyy = NULL; STU* qsx = NULL;
while (p != NULL)
{
if(p->Chinese>maxyw)
{
maxyw=p->Chinese;
qyw = p; //保存该节点信息
}
if(p->English>maxyy)
{
maxyy=p->English;
qyy = p; //保存该节点信息
}
if(p->Math>maxsx)
{
maxsx=p->Math;
qsx = p; //保存该节点信息
}
p = p->next;
}
if (p == NULL)
{
cout<<"\n 语文最高分学生成绩信息如下!\n";
cout<<"\t学号\t姓名\t语文\n";
cout<<"\t"<num<<"\t"<name<<"\t"<Chinese<num<<"\t"<name<<"\t"<Math<num<<"\t"<name<<"\t"<English<next;
if(p!=NULL)
{
STU* q=p->next;
p->next=NULL; //断开头结点,依次将q插入有序表中
STU* r; //r指向下一个元素
STU* s; //s指向该有序链表的表头
while(q)
{
r=q->next;
s=Head; //s从头开始移动,查找q应该插入的位置
while(s->next && (s->next->avg >q->avg))
{ s=s->next; }
q->next=s->next;
s->next=q;
q=r;
}
}
STU* p1 = Head->next;
cout<<"\t学号\t姓名\t性别\t专业\t\t总分\t\t排名\n\n";
int rank=1;
while (p1 != NULL)
{
double sum = p1->Math + p1->Chinese + p1->English;
p1->rank=rank;
rank++;
cout<<"\t"<num<<"\t"<name<<"\t"<sex<<"\t"<subject<<"\t\t"<rank<next;
}
}
//查询该专业所有人
void selectsubject()
{
cout<<"请输入你要查询的专业:";
string subject1; cin>>subject1;
STU* p = Head->next;
int sum=0;
cout<<"\t学号\t姓名\t性别\t专业\t\t数学\t语文\t英语\n\n";
while(p!=NULL)
{
if(strcmp(p->subject,subject1.c_str())==0) //dept.c_str(),把string转化成char[],strcmp字符串比较
{
sum++;
cout<<"\t"<num<<"\t"<name<<"\t"<sex<<"\t"<subject<<"\t\t"<Math
<<"\t"<Chinese<<"\t"<English<next;
}
else p=p->next;
}
cout<<"本专业一共有"<next;
while (p!=NULL)
{ num++; //统计节点数量
p=p->next;
}
if(num==0)
IO_File.open("stud.dat",ios::in|ios::app|ios::out|ios::binary|ios::trunc);
//ios::app以追加的形式写入信息,不会覆盖上次文件信息
if(!IO_File)
{
cout<<"没有找到文件"<next;
for(size_t i=0;iavg=(p->Chinese+p->English+p->Math)/3;
IO_File.write((char*)&(*p),sizeof(stu)); //把该学生对象写入文件
p=p->next;
}
IO_File.close();
cout<<"文件已保存!"<next=NULL;
if(Head->next==NULL)
{
Head->next=s;
End=End->next;
End->next=NULL;
}
else
{
End->next=s;
End=End->next;
End->next=NULL;
}
End->avg=(End->Chinese+End->English+End->Math)/3;
cout<<"\t学号\t姓名\t性别\t专业\t\t数学\t语文\t英语\t平均分\n";
cout<<"\t"<num<<"\t"<name<<"\t"<sex<<"\t"<subject<<"\t\t"<Math
<<"\t"<Chinese<<"\t"<English<<"\t"<avg;
cout<=high+1;j--)
R[j+1]=R[j];
R[high+1]=temp;
}
}
}
//创建索引文件
void CreatIdxFile()
{
stu st;
Index idex[Maxsize];
Index vessel;//一个缓存的容器
int num(0);
fstream IO_File("stud.dat",ios::in|ios::out|ios::binary);
if(!IO_File)
{
cout<<"The stud.dat file is error!"<no)
high=mid-1;
else if (idx[mid].no>no;
i=SearchNum(idx,n,no)-1; //在idx中查找
if (i==-1)
{
printf(" 提示:学号%d不存在\n",no);
cout<>name;
i=SearchNum_2(idx,n,name)-1; //在idx中查找
if (i==-1)
{
cout<<" 提示:姓名:"<>select;
switch(select)
{
case 1:
WriteFile();
break;
case 2:
OutputFile() ;
break;
case 3:
CreatIdxFile();
break;
case 4:
OutputIdxFile();
break;
case 5:
Find_Student();
break;
case 6:
FindStudentname();
break;
case 0:
break;
}
}
}
//需要执行的功能选择
void Choice(int k)
{
while (1)
{
switch (k)
{
case 1:
{
while (1)
{
AddStudent();
cout<<"\n是否继续添加学生成绩信息 继续:1 / 退出:0: ";
int select1 ; cin>>select1;
switch (select1)
{
case 1: break;
case 0: return;
default: return;
}
}
}
case 2:
{
while (1)
{
DeleteStudent();
cout<<"\n是否继续删除学生成绩信息 继续:1 / 退出:0: ";
int select2 ; cin>>select2;
switch (select2)
{
case 1: break;
case 0: return;
default: return;
}
}
}
case 3:
{
while (1)
{
AlterStudent();
cout<<"\n是否继续更改学生成绩信息 继续:1 / 退出:0: ";
int select3 ; cin>>select3;
switch (select3)
{
case 1: break;
case 0: return;
default: return;
}
}
}
case 4:
{
while (1)
{
SeekStudent();
cout<<"\n是否继续查询学生成绩信息 继续:1 / 退出:0: ";
int select4; cin>>select4;
switch (select4)
{
case 1: break;
case 0: return;
default: return;
}
}
}
case 5:
{
while (1)
{
DisplayAll();
cout<<"\n是否退出显示 退出:1 / 刷新:0: ";
int select5 ; cin>>select5;
switch (select5)
{
case 1: return;
case 0: break;
default: return;
}
}
}
case 6:
{
while (1)
{
sort();
cout<<"\n是否退出排序 退出:1 / 刷新:0: ";
int select6 ; cin>>select6;
switch (select6)
{
case 1: return;
case 0: break;
default: return;
}
}
}
case 7:
{
while (1)
{
selectsubject();
cout<<"\n是否退出查询专业 退出:1 / 刷新:0: ";
int select7 ; cin>>select7;
switch (select7)
{
case 1: return;
case 0: break;
default: return;
}
}
}
case 8:
{
while (1)
{
selectmax();
cout<<"\n是否退出查询最高分 退出:1 / 刷新:0: ";
int select8 ; cin>>select8;
switch (select8)
{
case 1: return;
case 0: break;
default: return;
}
}
}
case 9:
{
while (1)
{
file();
return;
}
}
default:
{
cout<<"\n\n 输入错误! 按任意键回到主界面\n\n";
system("pause");
return;
}
}
}
}
int main()
{
CreatList();
int key;
while (1)
{
menu();
cin>>key;
Choice(key);
}
return 0;
}
添加功能:
查询功能:
输出功能:
按专业查询:
剩余功能图请自行查看,第一次写博客,有任何问题欢迎指正