【数据结构单链表】CC++学⽣信息管理系统(⽂件导⼊、查询、添加、修改、
删除、保存)
⽂章⽬录
1. 头⽂件及链表结构
#include<iostream>//标准输⼊输出流
#include<cstdio>//⽂件读取写⼊
#include<cstdlib>//动态分配内存
#include<cstring>//操作字符数组
using namespace std;
//结点储存的数据
typedef struct{
int num;//学号
char  name[10];//姓名
float score;//成绩
}Student;system的头文件
//单链表储存结构
typedef struct LNode {
Student data;//数据域
struct LNode* next;//指针域
}LNode,* LinkList;//LinkList L 等效于 LNode* L
LinkList  L =NULL;//链表L
FILE* fp;//⽂件指针
char filename[10];//⽂件名
2. 主函数
int main(){
int choise =-1;
case5:
DeleteMenu();//5. 删除学⽣信息主函数
break;
case6:
ModifyData();//6. 修改学⽣信息
break;
case7:
ListSort();//7. 按学号进⾏排序
break;
case8:
SaveData();//8. 保存到⽂件
break;
default:
break;
}
}
return0;
}
3. 函数声明部分
void menu();//      主菜单
void CreateList();//      创建链表
void OpenFile();//1. 打开⽂件并导⼊学⽣信息void PrintAll();//2. 显⽰学⽣信息
void SearchMenu();//3. 查询学⽣信息主函数void SearchName();//3.1 按姓名查
void SearchNum();//3.2 按学号查
void SearchCnt();//3.3 查看总⼈数
void SearchMaxScore();//3.4  查看最⾼分void AddStuData();//4. 添加学⽣信息
void DeleteMenu();//5. 删除学⽣信息主函数void DeleteLocation();//5.1 按位置删除
void DeleteNum();//5.2 按学号删除
void DeleteName();//5.3 按姓名删除
void DeleteScore();//5.4 按成绩删除void ModifyData();//6. 修改学⽣信息
void ListSort();//7.    按学号进⾏排序
void SaveData();//8. 保存到⽂件
4. 主菜单函数
void menu(){
cout << endl << endl;
cout <<"\t\t\t ------------------------------\n";
cout <<"\t\t\t|        学⽣成绩管理          |\n";
cout <<"\t\t\t|------------------------------|\n";
cout <<"\t\t\t|      1.导⼊学⽣信息        |\n"; cout <<"\t\t\t|      2.显⽰学⽣信息        |\n"; cout <<"\t\t\t|      3.查询学⽣信息        |\n"; cout <<"\t\t\t|      4.添加学⽣信息        |\n"; cout <<"\t\t\t|      5.删除学⽣信息        |\n"; cout <<"\t\t\t|      6.修改学⽣信息        |\n"; cout <<"\t\t\t|      7.按学号来排序        |\n"; cout <<"\t\t\t|   
  8.保存学⽣信息        |\n"; cout <<"\t\t\t|      0.退出管理系统        |\n"; cout <<"\t\t\t ------------------------------\n";
}
5. 链表初始化
//链表初始化成⼀个空链表,没有数据
void CreateList(){
L =(LNode*)malloc(sizeof(LNode));
L->next =NULL;
}
6. 打开⽂件
CreateList();//先初始化链表
LNode * p,*q;//p是创建的新的结点
q = L;//q是指向头结点的指针,⽤于创建链表
while(true){
cout <<"\n\n\t\t\t请输⼊⽂件名:";
cin >> filename;
if((fp =fopen(filename,"r"))==NULL){//没有该⽂件
cout <<"\t\t\t没有该⽂件信息,是否创建(y/n):";
char ch; cin >> ch;
if(ch =='Y'|| ch =='y'){
if((fp =fopen(filename,"a+"))==NULL){//创建⽂件失败
cout <<"\t\t\t创建失败!"<< endl;
}
else break;
}
else continue;
}
else break;
}
while(true){
p =(LNode*)malloc(sizeof(LNode));//为新创建的结点p分配空间
if(fscanf(fp,"%d\t%s\t%f\n",&p->data.num, p->data.name ,&p->data.score)==EOF){//从⽂件读⼊信息free(p);//没有读出来,需要释放掉该结点空间
cout <<"\t\t\t读⼊成功!";
system("pause");
break;
}
//尾插法创建链表①新创建的结点p指针域置为空②将头结点指向p ③q向右移⼀位
p->next =NULL;
q->next = p;
q = q->next;
}
fclose(fp);//关闭⽂件
}
7. 显⽰学⽣信息
void PrintAll(){
system("cls");
cout <<"\n\n\t\t\t-----已显⽰学⽣信息----\n";
LinkList p;
p = L->next;//p指向第⼀个有数据的结点
cout <<"\t\t\t学号\t姓名\t成绩\n";
if(p ==NULL){
cout <<"\t\t\t没有数据!";
system("pause");
return;
}
while(p!=NULL){
printf("\t\t\t%d\t%s\t%.2f\n", p->data.num, p->data.name,  p->data.score);
p = p->next;
}
cout <<"\t\t\t-----------------------\n";
cout <<"\t\t\t";
system("pause");
}
8. 查询主函数
int choise =-1;
while(choise !=5){
system("cls");
cout << endl << endl;
cout <<"\t\t\t ------------------------- \n";
cout <<"\t\t\t|      查询学⽣信息      |\n";
cout <<"\t\t\t|-------------------------|\n";
cout <<"\t\t\t|      1.按姓名查      |\n";
cout <<"\t\t\t|      2.按学号查      |\n";
cout <<"\t\t\t|      3.查看总⼈数      |\n";
cout <<"\t\t\t|      4.查看最⾼分      |\n";
cout <<"\t\t\t|      5.返回主菜单      |\n";
cout <<"\t\t\t -------------------------\n";
cout <<"\t\t\t请选择:";
cin >> choise;
switch(choise)
{
case1:
SearchName();//3.1 按姓名查
break;
case2:
SearchNum();//3.2 按学号查
break;
case3:
SearchCnt();//3.3 查看总⼈数
break;
case4:
SearchMaxScore();//3.4 查看最⾼分
break;
default:
break;
}
}
}
8.1 按姓名查询
//结果可能不⽌⼀个
void SearchName(){
system("cls");
cout << endl << endl;
cout <<"\t\t\t-------正在查询学⽣信息----- \n";
cout <<"\t\t\t请输⼊要查的姓名:";
char name[10]; cin >> name;
LinkList q = L->next;// q是指向第⼀个元素的指针
int n =0;
while(q !=NULL){
if(strcmp(name, q->data.name)==0){//名字相同
if(n==0)
cout <<"\t\t\t学号\t姓名\t成绩"<< endl;
printf("\t\t\t%d\t%s\t%f\n", q->data.num, q->data.name, q->data.score);  n++;
}
q = q->next;
}
cout <<"\t\t\t----------------------------\n";
if(n ==0)
cout <<"\t\t\t查⽆此⼈,\n";
cout <<"\t\t\t";
system("pause");
}
8.2 按学号查询
void SearchNum(){
system("cls");
cout << endl << endl;
cout <<"\t\t\t-------正在查询学⽣信息----- \n";
cout <<"\t\t\t请输⼊学号:";
int num; cin >> num;
LinkList q = L->next;
while(q !=NULL){
if(q->data.num == num){
cout <<"\t\t\t学号\t姓名\t成绩"<< endl;
printf("\t\t\t%d\t%s\t%f\n", q->data.num, q->data.name, q->data.score);  cout <<"\t\t\t----------------------------\n";
cout <<"\t\t\t";
system("pause");
return;
}
q = q->next;
}
cout <<"\t\t\t----------------------------\n";
cout <<"\t\t\t查⽆此⼈,";
system("pause");
}
8.3 查看总⼈数
void SearchCnt(){
system("cls");
cout << endl << endl;
cout <<"\t\t\t-------正在查询学⽣信息----- \n";
cout <<"\t\t\t总⼈数为:";
int cnt =0;
LinkList q = L->next;
while(q !=NULL){
if(q!=NULL) cnt++;
q = q->next;
}
cout << cnt << endl;
cout <<"\t\t\t----------------------------\n";
cout <<"\t\t\t";
system("pause");
}
8.4 查看最⾼分

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。