学生学籍管理通常使用数据库为基础的管理信息系统(MIS)系统,但是这里要求不使用数据库技术,而是使用数据结构struct和链表操作完成管理任务。利用链表对文件的操作,实现对学生信息的存储,基本功能都实现了,但是没有实现真正意义上的与数据库等同,文件操作里面有个ftell给文件指针定位的函数,但是这个貌似是按字节来定位的,我就没有深入下去了,现把我实现的代码奉上,若有不完善之处,欢迎留言指正,大家相互学习,谢谢。
#include <iostream> #include <stdlib.h> #define MaxStuNum 2//定义添加的最大学生数量 using namespace std; typedef struct student { char sno[10]; char sname[10]; int sage; char sprof[20]; char sclass[5]; }student; typedef struct LNode { student stu; LNode *next; }LNode,*LinkList; void Initial(LinkList &head) { head=(LinkList)malloc(sizeof(LNode)); if(!head) exit(0); head->next=NULL; } //添加操作 void Add(LinkList &head) { int i; FILE *fp; LinkList L=head; LinkList p; if(L!=NULL){ fp=fopen("stuInfo.txt","w"); if(!fp){ cout<<"打开文件错误!!!"<<endl; exit(0); } fprintf(fp," 学号 姓名 年龄 专业 班级\n"); for(i=0;i<MaxStuNum;i++){ p=(LinkList)malloc(sizeof(LNode)); cout<<"学生 "<<i+1<<" 学号<1-8位数字>:"; cin>>p->stu.sno; cout<<"学生 "<<i+1<<" 姓名<1-8个字符>:"; cin>>p->stu.sname; cout<<"学生 "<<i+1<<" 年龄<2位整数>:"; cin>>p->stu.sage; cout<<"学生 "<<i+1<<" 专业名<1-8个字符>:"; cin>>p->stu.sprof; cout<<"学生 "<<i+1<<" 班级<1-5个字符>:"; cin>>p->stu.sclass; fprintf(fp,"%10s%10s%5d%10s%5s\n",p->stu.sno,p->stu.sname,p->stu.sage,p->stu.sprof,p->stu.sclass); p->next = L->next; L -> next = p; while (L ->next != NULL) /*每次for循环后在NULL与p之间插入下一个节点*/ { L = L ->next; } } cout<<"添加信息完成!"<<endl; fclose(fp); } } //修改操作 void Modify(LinkList &head) { FILE *fp; LinkList p=head; LinkList L=head; char num[10]; int choice; cout<<"请输入需要修改学生的学号:"<<endl; cin>>num; int flag=1; while(flag!=0 && p->next != NULL){ if( strcmp(p->next->stu.sno,num)==0){//查找匹配学号 flag=0;//修改状态,已经查到需要修改的位置 cout<<"请选择需要进行修改的信息<1-学号,2-姓名,3-年龄,4-专业,5-班级>:"; cin>>choice; cout<<endl; switch (choice) { case 1: cout<<"请输入该学生新学号<1-8位数字>:"; cin>>p->next->stu.sno; cout<<endl; break; case 2: cout<<"请输入该学生新姓名<1-8位字符>:"; cin>>p->next->stu.sname; cout<<endl; break; case 3: cout<<"请输入该学生新年龄<2位整数>:"; cin>>p->next->stu.sage; cout<<endl; break; case 4: cout<<"请输入该学生新专业名<1-8位字符>:"; cin>>p->next->stu.sprof; cout<<endl; break; case 5: cout<<"请输入该学生新班级名<1-5位字符>:"; cin>>p->next->stu.sclass; cout<<endl; break; default: cout<<"选择错误!!!"<<endl;break; } cout<<"修改成功!!!"<<endl; } else p=p->next; } fp=fopen("stuInfo.txt","w"); if(!fp){ cout<<"打开文件错误!!!"<<endl; exit(0); } fprintf(fp," 学号 姓名 年龄 专业 班级\n"); while(L->next!=NULL) { L=L->next; fprintf(fp,"%10s%10s%5d%10s%5s\n",L->stu.sno,L->stu.sname,L->stu.sage,L->stu.sprof,L->stu.sclass); } fclose(fp); } //删除操作 void Delete(LinkList head) { FILE *fp; LinkList p=head,q; LinkList L=head; char num[10]; cout<<"请输入需要删除学生的学号:"<<endl; cin>>num; while ( strcmp(p->next->stu.sno,num) != 0)//查找匹配学号 { p=p->next; } q=p->next;//q指向要删除的节点 p->next=q->next; fp=fopen("stuInfo.txt","w"); if(!fp){ cout<<"打开文件错误!!!"<<endl; exit(0); } fprintf(fp," 学号 姓名 年龄 专业 班级\n"); while(L->next != NULL) { L=L->next; fprintf(fp,"%10s%10s%5d%10s%5s\n",L->stu.sno,L->stu.sname,L->stu.sage,L->stu.sprof,L->stu.sclass); } cout<<"删除操作成功!!!"<<endl; free(q);//释放掉删除的节点 fclose(fp); } //查询操作 void Find(LinkList head) { //FILE *fp; LinkList p=head,q; char num[10]; cout<<"请输入需要查询学生学号:"; cin>>num; while ( strcmp(p->next->stu.sno,num) != 0)//查找匹配学号 { p=p->next; } q=p->next;//q指向查询学生当前节点 cout<<"学号:"<<q->stu.sno<<" 姓名:"<<q->stu.sname <<" 年龄:"<<q->stu.sage<<" 专业:"<<q->stu.sprof <<" 班级:"<<q->stu.sclass<<endl; cout<<"查询操作完成!!!"<<endl; } //输出打印 void Print(LinkList head) { FILE *fp; LinkList p=head; fp=fopen("stuInfo.txt","r"); while (p->next!=NULL) { p=p->next; fprintf(fp,"%10s%10s%5d%10s%5s\n",p->stu.sno,p->stu.sname,p->stu.sage,p->stu.sprof,p->stu.sclass); } system("start stuInfo.txt"); cout<<"输出操作完成!!!"<<endl; fclose(fp); } //菜单设置 void Menu() { cout<<"************学生基本信息管理************"<<endl; cout<<"0-返回主菜单"<<endl; cout<<"1-添加学生"<<endl; cout<<"2-查询学生信息"<<endl; cout<<"3-删除学生信息"<<endl; cout<<"4-修改学生信息"<<endl; cout<<"5-打印输出学生信息"<<endl; cout<<"6-退出"<<endl; cout<<"选择需要进行的操作: "; } int main() { LinkList L; Initial(L); int choice; Menu(); while(cin>>choice){ switch(choice) { case 0: Menu();break; case 1: Add(L);Menu();break; case 2: Find(L);Menu();break; case 3: Delete(L);Menu();break; case 4: Modify(L);Menu();break; case 5: Print(L);Menu();break; case 6: exit(0);//退出 default: cout<<"选择错误!!!"<<endl;Menu();break; } } return 0; }