*************************************************/
头文件
chengji.h
#ifndef chengji
#define chengji
#include
using namespace std;
typedef struct LNode//学生结构体
{
string name;
string num;
string classname;
float Cmark;
float Math;
float English;
struct LNode *next;//指针域,指向后继节点
} LinkList;
void addstudent(LNode *a);//添加学生函数的声明
int num(LNode *a);//判断学号是否重复的函数的声明
void NewNode();//创建新的一个学生结构体,新节点
void read();//从文件中读取信息
void DestroyList(LinkList *&head);//销毁线性表
void ListLength(LinkList *L);//求学生个数
void DispList();//输出线性表
void deletestudent();//删除学生信息
void findstudentname();//按姓名查找学生
void findstudentnum();//按学号查找学生
void ChangeMarkByNum();//根据学号修改学生成绩
void shuchujiedian(LNode *p);//输出一个结点信息
void DesplayMarkSegment();//输出不及格的学生成绩
void paixu();//按平均成绩排序并输出成绩
void Save();//保存链表数据到文件
void Menu();//显示菜单
#endif
各个函数代码
chengji.cpp
#include
#include
#include
#include
#include"chengji.h"
extern struct LNode *head;
/************************************
* 功能描述:申请一个新结点,并将其初始化
* 输入参数:无
* 输出参数:无
************************************/
void InitList(LinkList *&L)//创建一个头结点
{
L=(LinkList *)malloc(sizeof(LinkList));
L->next=NULL;
}
/************************************
* 功能描述:创建新的一个学生结构体,新节点。
* 输入参数:无
* 输出参数:无
************************************/
void NewNode()// 创建完成调用addstudent()函数将新节点尾插法插入链表
{
LNode *a;
a=new LNode;//申请空间
cout<<"学生姓名"<
cout<<"学生学号"<
cout<<"学生班级: "<
cout<<"c语言: "<
cout<<"高数: "<
cout<<"英语 "<
addstudent(a);
}
/************************************
* 功能描述:从文件中读学生信息到链表中
* 输入参数:无
* 输出参数:无
************************************/
void read()//从文件中读取信息
{
FILE *fp;
LNode *p;
fp=fopen("d://zou.txt","r");//以可读方式打开zou.txt文件
if(!fp)
{
printf("文件不存在\n");
return;
}
p=new LNode;
char z[30];//临时的字符数组,用来装TXT中的字符串
char b[30];
char c[30];
string e,f,g;
while(fscanf(fp,"%s %s %s %f %f %f\n",z,b,c,&p->Cmark,&p->Math,&p->English)>0)//将TXT文件中第一行数据写入到P节点的各项内容中
{
string e (z);//将字符数组转化为string类型。
string f (b);
string g (c);
p->name=e;
p->num=f;
p->classname=g;
addstudent(p);//添加该节点P到链表中
p=new LNode;//再次为P申请新的空间
}
fclose(fp);//关闭文件
}
void addstudent(LNode *a)//添加学生
{
LNode *p;
if(head==NULL)//如果链表为空
{
head =a;
a->next=NULL;
return;//插入完成返回
}
else
{
if(num(a)==1)//判断学号是否重复
{
p = head;//从头结点开始找
while(p)//p非空则一直循环
{
if(p->next==NULL)//找到尾节点
{
p->next =a;
a->next =NULL;
return;//插入完成返回
}
p= p->next;//找下一个节点
}
}
else
cout<<"学号已重复"<
}
}
/************************************
* 功能描述:销毁线性表
* 输入参数:无
* 输出参数:无
************************************/
void DestroyList(LinkList *&head)//销毁线性表
{
LinkList *pre=head,*p=head->next; //准备好前驱后置指针
while (p!=NULL)
{
free(pre);//释放内存空间
pre=p;
p=pre->next;
}
free(pre);
head=NULL;
cout<<"学生信息已清空"<
void ListLength(LinkList *L)//求学生个数
{ int n=0;
LinkList *p=L;
while (p->next!=NULL)
{
n++;
p=p->next;
}
cout<<"一共有"<
/************************************
* 功能描述:显示所有学生的信息
* 输入参数:无
* 输出参数:输出学生的姓名、学号、
* 班级、三个成绩
************************************/
void DispList()//输出线性表
{
LinkList *p=head;
if(head==NULL)
{
cout<<"现在还没学生信息,请先输入学生信息"<
}
else
{
while (p!=NULL)
{
cout<<"************************"<
p=p->next;
}
}
ListLength(head);
}
/************************************
* 功能描述:根据输入的学号删除学生信息
* 输入参数:学生学号
* 输出参数:无
************************************/
void deletestudent()//删除学生信息
{
string num;
int m;
LNode *p,*pre;
cout<<"请输入要删除学生的学号:";
cin>>num;
if (head==NULL)
{
cout<<"学号输入有误"<
}
else
{
p=pre=head;
while(p)
{
if (p->num==num)
{
cout<<"学生姓名: "<
if(m==1)
{
if(p==head)
{
head = head->next;
free(p);
p=NULL;
cout<<"学生成绩信息已删除!"<
}
else
{
pre->next =p->next;
free(p);
p=NULL;
cout<<"学生成绩信息已删除!"<
}
}
if(m==2)
{
return;
}
}
else
{
pre=p;
p=p->next;
}
}
}
cout<<"学号输入有误"<
}
/************************************
* 功能描述:根据输入的姓名查找成绩
* 输入参数:学生姓名
* 输出参数:无
************************************/
void findstudentname()//按姓名查找学生
{
string name;
cout<<"请输入要查找的学生姓名"<
LNode *p=head;
if (head==NULL)
{
cout<<"现在还没学生信息,请先输入学生信息"<
}
p=head;
while(p)
{
if (p->name==name)
{
cout<<"学生姓名: "<
}
p= p->next;
}
cout<<"没有该学生!"<
}
/************************************
* 功能描述:根据输入的学号查找成绩
* 输入参数:学生学号
* 输出参数:无
************************************/
void findstudentnum()//按学号查找学生
{
string num;
cout<<"请输入要查找的学生学号"<
LNode *p=head;
if (head==NULL)
{
cout<<"现在还没学生信息,请先输入学生信息"<
}
p=head;
while(p)
{
if (p->num==num)
{
cout<<"学生姓名: "<
}
p= p->next;
}
cout<<"没有该学生!"<
}
/************************************
* 功能描述:判断学号是否重复
* 输入参数:无
* 输出参数:无
************************************/
int num(LNode *a)//判断学号是否重复
{
LNode *p=head;
while(p)
{
if (p->num==a->num)
{
return 0;
}
p= p->next;
}
return 1;
}
/************************************
* 功能描述:根据输入的学号修改成绩
* 输入参数:学生学号
* 输出参数:无
************************************/
void ChangeMarkByNum()//根据学号修改学生成绩
{
LNode *p;//////////
string num;
int m;
float mark1;
float mark2;
float mark3;
p=head;//////////
cout<<"请输入学生学号: "<
while(p)
{
if(p->num==num)
{
cout<<"学生姓名: "<
if(m==1)
{
cout<<"请输入新的c语言成绩"<
cout<<"请输入新的高数成绩"<
cout<<"请输入新的英语成绩"<
p->Cmark=mark1;
p->Math=mark2;
p->English=mark3;
cout<<"成绩修改成功!"<
}
if(m==2)
{
cout<<"学生成绩保留!"<
}
break;
}
p=p->next;
}
//////////////
cout<<"对不起,不存在学号为"<
/************************************
* 功能描述:输出一个结点信息
* 输入参数:无
* 输出参数:输出学生的姓名、学号、
* 班级、成绩1、成绩2、成绩3
************************************/
void shuchujiedian(LNode *p)//输出一个结点信息
{
cout<<"************************"<
/************************************
* 功能描述:不及格学生成绩
* 输入参数:无
* 输出参数:不及格的信息
************************************/
void DesplayMarkSegment()//输出不及格的学生成绩
{
LNode *p=head;
int count=0;
cout<<"60分以下(不及格)的学生成绩如下: "<
{
if(p->Cmark<60 || p->Math<60 || p->English<60)
{
count++;
shuchujiedian(p);
}
p=p->next;
}
cout<<"不及格的学生一共有"<
/************************************
* 功能描述:按平均成绩排序
* 输入参数:无
* 输出参数:学生成绩信息
************************************/
void paixu()//按平均成绩排序并输出成绩
{
LNode change,*p,*q,*r;
r=head;
if(r==NULL)
{
cout<<"现在还没学生信息,请先输入学生信息"<
}
while(r)
{
p=r;
q=r->next;
while(q)
{
if((q->Cmark+q->Math+q->English)>(p->Cmark+p->Math+p->English))
{
change.name=q->name;//将q结点的信息给change
change.num=q->num;
change.Cmark=q->Cmark;
change.Math=q->Math;
change.English=q->English;
q->name=p->name;//将p结点的信息给q
q->num=p->num;
q->Cmark=p->Cmark;
q->Math=p->Math;
q->English=p->English;
p->name=change.name;//将change结点的信息给p
p->num=change.num;
p->Cmark=change.Cmark;
p->Math=change.Math;
p->English=change.English;
}
q=q->next;
}
r=r->next;
}
DispList();
}
/************************************
函数功能:保存链表数据到文件中
************************************/
void Save()//保存链表数据到文件
{
LNode *p;
FILE *fp;
p=head;
if(p==NULL)
{
printf("现在没有学生信息,请先输入学生信息\n\n");
return;
}
fp=fopen("d://zou.txt","w+");//以写方式创建zou.txt文件,若文件已存在则以不覆盖之前内容的写方式打开。
if(!fp)
{
printf("文件不存在\n");
return;
}
while(p)
{
fprintf(fp,"%s %s %s %f %f %f\n",p->name.c_str(),p->num.c_str(),p->classname.c_str(),p->Cmark,p->Math,p->English);
p=p->next;
}
fclose(fp);
}
/************************************
* 功能描述:显示菜单,根据用户的输入
* 完成相应的功能
* 输入参数:你要选择的功能的序号
* 输出参数:选择的功能
************************************/
void Menu()
{
int choose;
printf(" ☆☆☆☆☆☆☆☆请选择相应功能☆☆☆☆☆☆☆☆☆\n\n");
printf(" ☆ 1 添加学生成绩信息 ☆|\n");
printf(" ☆ 2 输出当前所有学生成绩信息 ☆|\n");
printf(" ☆ 3 按姓名查找学生成绩信息 ☆|\n");
printf(" ☆ 4 删除学生成绩信息 ☆|\n");
printf(" ☆ 5 按学号查找学生成绩信息 ☆|\n");
printf(" ☆ 6 输出不及格的学生 ☆|\n");
printf(" ☆ 7 根据学号修改学生成绩 ☆|\n");
printf(" ☆ 8 保存所有学生信息 ☆|\n");
printf(" ☆ 9 按平均成绩排序并输出成绩 ☆|\n");
printf(" ☆ 10 清空所有学生信息 ☆|\n\n");
printf(" ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆|\n");
scanf("%d",&choose);/*取得用户的选择*/
switch(choose)
{
case 1:
system("cls");
NewNode();
//创建新的一个学生结构体,新节点
cout<<"按任意键继续"<
break;
case 2:
system("cls");
DispList();
//输出学生信息
cout<<"按任意键继续"<
break;
case 3:
system("cls");
findstudentname();
//根据姓名查找学生信息
cout<<"按任意键继续"<
break;
case 4:
system("cls");
deletestudent();
//删除学生信息
cout<<"按任意键继续"<
break;
case 5:
system("cls");
findstudentnum();
//按照学生学号查找信息
cout<<"按任意键继续"<
break;
case 6:
system("cls");
DesplayMarkSegment();
//输出不及格的学生成绩
getch();
break;
case 7:
system("cls");
ChangeMarkByNum();
/*根据用户输入的学号修改学生成绩*/
getch();
break;
case 8:
system("cls");
Save();
/*保存数据*/
break;
case 9:
system("cls");
paixu();
getch();
/*按平均成绩排序*/
break;
case 10:
system("cls");
DestroyList(head);
//清空学生信息
getch();
break;
default:
break;
}
Menu();/*递归调用*/
}
主函数
main.cpp
#include"chengji.h"
struct LNode *head=NULL;//全局变量的头结点,里面有第一个学生的信息
int main()
{
read();
Menu();
return;
}
结果显示:
(1)主界面
(2)添加学生
(3)输出学生信息
(4)按姓名查找
(5)删除
(6)按学号查找
(7)输出不及格
(8)按照平均成绩排序