-
2019-10-22 18:52:03
数据结构线性表实现学生信息管理系统
方法一:顺序表实现
#include <stdio.h> #include <iostream> #include <stdlib.h> #include <string.h> #define MAXSIZE 1000 #define OVERFLOW -1 using namespace std; typedef struct{ char num[8];//8位学号 char name[20];//学生姓名 int score;//学生成绩 }Student; typedef struct{ Student *elem;//指向数据元素的基地址 int length;//线性表的长度 }SqList; SqList L; //初始化顺序表 int InitList(SqList &L){ L.elem=new Student[MAXSIZE];//为顺序表分配一个大小为MAXSIZE的数组空间 if (!L.elem) exit(OVERFLOW);//存储分配失败推出 L.length=0;//空表长度为0 return 1;//成功返回1 } //顺序表的取值 int GetElem(SqList L,int i,Student &s){ if(i<1||i>L.length){ return 0;//若i值不合理,返回0 }else{ s=L.elem[i-1];//取出第i个元素 存放在i里面 加&是让形参影响到实参 return 1; } } //按学生姓名进行学生信息的查找 int LocateElem(SqList L,Student &s){ //在顺序表L中查找值e的数据元素,返回其序号 for(int i=0;i<L.length;i++){ if(!strcmp(L.elem[i].name,s.name)) { s = L.elem[i]; return 1;//查找成功 } } return 0;//查找失败 } //插入学生信息 int ListInsert(SqList &L,int i,Student &s){ if((i<1)||(i>L.length+1)) return 0; if(L.length==MAXSIZE) return 0;//顺序表已达到最大长度 for(int j=L.length-1;j>=i-1;j--){ L.elem[j+1]=L.elem[j];//插入位置及之后的元素全部后移 } L.elem[i-1]=s;//将新元素s插入第i个位置 ++L.length;//顺序表长度加1 return 1;//插入成功,返回1 } //顺序表的删除 int ListDelete(SqList &L,int i){ //在顺序表L中删除第i个元素,i值的合法范围是1<=i<=L.length if((i<1)||(i>L.length)) return 0; for(int j=i;j<=L.length-1;j++){//被删除的元素是第i个元素,但是其下标i-1。j=i,此时j指向的是i后面的一个元素 L.elem[j-1]=L.elem[j];//被删除元素之后的元素前移(删除数据的真实操作其实是覆盖) } --L.length;//顺序表表长度减1 return 1;//删除成功返回1 } //输入学生表 void InputList(SqList &L,int i,Student e) { L.length+=1; L.elem[i]=e; } //主函数 int main(){ Student student; InitList(L); int a; while(1) { printf("------------学生信息系统------------\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("请输入您的选择:"); scanf("%d",&a); printf("--------------------------------------------------------"); printf("\n"); switch(a)//输入学生的信息; { case 1: { for(int i=0;i<5;i++) { printf("学号:"); scanf("%s",&student.num); printf("姓名:"); scanf("%s",&student.name); printf("成绩:"); scanf("%d",&student.score); InputList(L,i,student); printf("\n"); } printf("输入学生信息成功,请选择接下来的操作…………"); printf("\n\n\n\n\n\n"); break; } case 2://显示全部学生的信息; { printf("NO\t\tName\t\t\tScore\t\n"); for(int i=1;i<=L.length;i++) { GetElem(L,i,student); printf("%s\t\t%s\t\t\t%3d\t\n",student.num,student.name,student.score); } printf("\n\n\n\n\n\n"); break; } case 3://根据学生姓名查找学生信息 { int i; printf("请输入您要查找学生的名字:"); scanf("%s",&student.name); i=LocateElem(L,student); if(!i) { printf("系统中无记录\n"); } printf("学号:%s\t\t姓名:%s\t\t成绩:%3d\n",student.num,student.name,student.score); printf("\n\n\n\n\n\n"); break; } case 4://根据位置查找学生信息 { int local; printf("请输入要查询的位置:"); scanf("%d",&local); GetElem(L,local,student); printf("学号:%s\t\t姓名:%s\t\t成绩:%d\n",student.num,student.name,student.score); printf("\n\n\n\n\n\n"); break; } case 5://给定一个学生信息,插入到表中指定位置; { int t,i; printf("请输入学生的学号:"); scanf("%s",&student.num); printf("请输入学生的姓名:"); scanf("%s",&student.name); printf("请输入学生的成绩:"); scanf("%d",&student.score); printf("请输入插入的位置:"); scanf("%d",&t); i = ListInsert(L,t,student); if(i) { printf("添加成功…………"); printf("\n") ; printf("NO\t\tName\t\t\tScore\t\n"); for(int i=1;i<=L.length;i++) { GetElem(L,i,student); printf("%s\t\t%s\t\t\t%3d\t\n",student.num,student.name,student.score); } } else printf("插入失败,请选择正确的插入位置…………"); printf("\n\n\n\n\n\n"); break; } case 6://删除指定位置的学生信息; { int i; printf("请输入要删除的位置:"); scanf("%d",&i); ListDelete(L,i); printf("删除成功…………"); printf("\n"); printf("NO\t\tName\t\t\tScore\t\n"); for(int i=1;i<=L.length;i++) { GetElem(L,i,student); printf("%s\t\t%s\t\t\t%3d\t\n",student.num,student.name,student.score); } printf("\n\n\n\n\n\n"); break; } case 7://统计系统中学生个数 { printf("系统中学生个数:%d\n",L.length); printf("\n\n\n\n\n\n"); break; } case 8://退出系统; { return 0; } default: { printf("输入错误,请重新输入"); printf("\n\n\n\n\n\n"); } } } }
方法二:链表实现
#include<stdio.h> #include <iostream> #include <stdlib.h> #include <string.h> #define MAXSIZE 1000 using namespace std; //定义学生 typedef struct{ char num[8];//8位学号 char name[20];//学生姓名 int score;//学生成绩 }Student; Student student; //---单链表的存储结构--- typedef struct LNode { Student data; struct LNode *next;//节点的指针域 }LNode,*LinkList;//LinkList为指向结构体LNode的结构体类型 typedef struct{ int length; }T; T list; LinkList L; LNode *p,*s,*q,*head; //初始化单链表 int InitList(LinkList &L) { //构造一个空的单链表 L = new LNode; L->next=NULL; list.length=0; return 1; } //单链表按照序号取值 int GetElem(LinkList L,int i,Student &e) { //在带头节点的链表L中根据序号i获取元素的值,用e返回L中第i个数据元素的值 p=L->next; int j=1; while(p&&j<i) { p=p->next; ++j; } if(!p||j>i) return 0; e=p->data; return 1; } //单链表的姓名查找 int LocateElem(LinkList L,Student &e) { int j=0; p=L->next; while(p && strcmp((p->data).name,e.name))//如果p不为空,且p指向的数据与发送过来的数据名字不相等。执行while循环语句 { p=p->next; ++j; } if(!p||j>list.length) return 0; e=p->data; return 1; } //单链表的插入 int ListInsert(LinkList $L,int i,Student &e) { //在带头结点的链表L中第i个位置插入值为e的新节点 p=L;int j=0; while(p && (j<i-1)) { p=p->next;++j; } if(!p||j>i-1) return 0; s = new LNode; s->data=e; s->next=p->next; p->next=s; list.length++; return 1; } //单链表的删除 int ListDelete(LinkList &L,int i) { //在带头节点的链表L中删除第i个元素 p=L;int j=0; while((p->next) && (j<i-1)) {p=p->next;++j;} if(!(p->next)||(j>i-1)) return 0;//当i>n或i<1时,删除位置不合理 q=p->next;//临时保存被删除的节点的地址以备释放 p->next=q->next;//改变删除节点前驱节点的指针域 delete q; list.length--; return 1; } //单链表的创建(后插法) void CreateList_H(LinkList &L,int n) {//逆位序输入n个元素的值,建立带表头结点的单链表L //L=new LNode;//先建立一个带头结点的空链表 L->next=NULL; Student stu; LNode *r; r=L; for(int i=0;i<n;++i) { p=new LNode; printf("学号:"); scanf("%s",&student.num); printf("姓名:"); scanf("%s",&student.name); printf("成绩:"); scanf("%d",&student.score); list.length++;//输入元素值赋给新结点*p的数据域 printf("\n\n"); p->data=student; p->next=NULL; r->next=p; r=p;//将新结点*p插入到头结点之后 } } //主函数 int main() { Student student; InitList(L); int a; while(1) { printf("------------学生信息系统------------\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("请输入您的选择:"); scanf("%d",&a); printf("--------------------------------------------------------"); printf("\n"); switch(a)//输入学生的信息; { case 1: { CreateList_H(L,5); printf("输入学生信息成功,请选择接下来的操作…………"); printf("\n\n\n\n\n\n"); break; } case 2://显示全部学生的信息; { printf("NO\t\tName\t\t\tScore\t\n"); for(int i=1;i<=list.length;i++) { GetElem(L,i,student); printf("%s\t\t%s\t\t\t%d\t\n",student.num,student.name,student.score); } printf("\n\n\n\n\n\n"); break; } case 3://根据学生姓名查找学生信息 { int i; printf("请输入您要查找学生的名字:"); scanf("%s",&student.name); i=LocateElem(L,student); if(!i) printf("系统中没有此学生\n"); printf("学号:%s\t\t姓名:%s\t\t成绩:%d\n",student.num,student.name,student.score); printf("\n\n\n\n\n\n"); break; } case 4://根据位置查找学生信息 { int i; int local; printf("请输入要查询的位置:"); scanf("%d",&local); GetElem(L,local,student); printf("学号:%s\t\t姓名:%s\t\t成绩:%d\n",student.num,student.name,student.score); printf("\n\n\n\n\n\n"); break; } case 5://给定一个学生信息,插入到表中指定位置; { int t,i; printf("学号:"); scanf("%s",&student.num); printf("姓名:"); scanf("%s",&student.name); printf("成绩:"); scanf("%d",&student.score); printf("插入位置:"); scanf("%d",&t); ListInsert(L,t,student); if(1) { printf("添加成功…………"); printf("\n") ; printf("NO\t\tName\t\t\tScore\t\n"); for(int i=1;i<=list.length;i++) { GetElem(L,i,student); printf("%s\t\t%s\t\t\t%3d\t\n",student.num,student.name,student.score); } } else printf("插入失败,请选择正确的插入位置…………"); printf("\n\n\n\n\n\n"); break; } case 6://删除指定位置的学生信息; { int i; printf("请输入要删除的位置:"); scanf("%d",&i); ListDelete(L,i); printf("删除成功…………"); printf("\n"); printf("NO\t\tName\t\t\tScore\t\n"); for(int i=1;i<=list.length;i++) { GetElem(L,i,student); printf("%s\t\t%s\t\t\t%3d\t\n",student.num,student.name,student.score); } printf("\n\n\n\n\n\n"); break; } case 7://统计系统中学生个数 { printf("系统中学生个数:%d\n",list.length); printf("\n\n\n\n\n\n"); break; } case 8://退出系统; { return 0; } default: { printf("输入错误,请重新输入"); printf("\n\n\n\n\n\n"); } } } }
更多相关内容 -
数据结构 学生信息管理系统
2017-12-22 09:28:23吴玉然 学生信息管理系统 main.cpp #include "list.h" #include #include #include #include using namespace std; void xinjian(Listtype &L,Data data) { cout新建学生信息输入"; do {吴玉然
学生信息管理系统
main.cpp
#include "list.h" #include <iostream> #include <stdio.h> #include <cstdlib> #include<fstream> using namespace std; void xinjian(Listtype &L,Data data) { cout<<"新建学生信息输入"<<endl; do { //循环添加结点数据 cout<<"Please enter the student id:"; cin>>data.num; cout<<"Please enter the student name:"; cin>>data.name; cout<<"Please enter the student age ( if the age entry is 0, you can end the entry ):"; cin>>data.age; cout<<endl; if(data.age) { //若年龄不为0 if(!Adddata(&L,data)) { cout<<"Failure!"<<endl; break; } } else break; }while(1); cout<<"长度为:"<<GetLength(&L); cout<<"添加成功!"<<endl; system("pause"); return; } void Add(Listtype &L,int i,Data data) { cout<<"插入学生信息输入"<<endl; cout<<"请输入要插入位置:"<<endl; cin>>i; cout<<"请输入学生学号:"; cin>>data.num; cout<<"请输入学生姓名:"; cin>>data.name; cout<<"请输入学生年龄:"; cin>>data.age; cout<<"插入前长度为:"<<GetLength(&L); Insertdata(&L,i,data); cout<<"插入后长度为:"<<GetLength(&L); cout<<"插入成功!"<<endl; system("pause"); return; } void Delete(Listtype &L,int i,int j,Data data) { cout<<"删除从第i位置起的j个学生数据:"<<endl; cout<<"请输入i的值:"; cin>>i; cout<<endl; cout<<"请输入j的值:"; cin>>j; cout<<endl; IjDelete(&L,i,j); cout<<"删除成功!"<<endl; system("pause"); return; } void Show(Listtype &L) { cout<<"以下为所有学生的信息:"<<endl; Show(&L); cout<<endl; system("pause"); return; } void Save(Listtype &L,Data data) //保存文件函数 { cout<<"保存已输入数据中......"<<endl; Savefile(&L,data); system("pause"); return; } void xiugai(Listtype &L,int i,int j,Data data) //学生信息修改函数 { system("cls"); //清屏 int choice2; do { cout<<"\n********************************************************************************\n"<<endl; cout<<" 学生信息修改"<<endl; cout<<"\n"<<endl; cout<<" 1.新建 2.增添"<<endl; cout<<" 3.删除 4.显示"<<endl; cout<<" 5.保存 0.返回"<<endl; cout<<"\n"<<endl; cout<<"\n"<<endl; cout<<"\n********************************************************************************\n"<<endl; cout<<"\n"<<endl; cout<<"\n 请输入您的选择(1 or 2 or 3 or 4 or 0):"; cin>>choice2; switch(choice2) { case 1:xinjian(L,data);break; //进入新建学生信息操作的函数 case 2:Add(L,i,data);break; //进入增添学生信息操作的函数 case 3:Delete(L,i,j,data);break; //进入删除学生信息操作的函数 case 4:Show(L);break; //进入显示学生信息操作的函数 case 5:Save(L,data);break; //进入保存文件的函数 case 0:cout<<endl<<"返回上一菜单!"<<endl;break; //返回上一菜单,即初始菜单界面 default:cout<<"无此选项!请重试!"<<endl;break; //若输入异常,显示异常操作,提示错误! } }while(choice2!=0); } void Icha(Listtype &L,int i,Data *&xian) //按位置查找函数 { cout<<"长度为:"<<GetLength(&L); cout<<"请输入要查找的学生的位置:"; cin>>i; xian=DataGet(&L,i); cout<<"姓名:"<<xian->name<<endl; cout<<"学号:"<<xian->num<<endl; cout<<"年龄:"<<xian->age<<endl; system("pause"); return; } void chaxun(Listtype &L,int i,Data data,Data *&xian) //学生信息查询函数 { system("cls"); cout<<"\n********************************************************************************\n"<<endl; cout<<" 学生信息查询"<<endl; cout<<endl; cout<<" 1、按位置查询 0、返回"<<endl; cout<<endl; cout<<"\n********************************************************************************\n"<<endl; int choice3=0; cout<<" 请输入您的选择(1 or 2 or 3 or 0):"; cin>>choice3; switch(choice3) { case 1:Icha(L,i,xian);break; //进入按位置查询的函数 case 0:cout<<endl<<"返回上一菜单!"<<endl;break; //返回上一菜单,即初始菜单界面 default:cout<<"无此选项!请重试!"<<endl;break; //若输入异常,显示异常操作,提示错误! } } int main() //主函数 { int i=0; int j=0; Listtype L; Data data; Data *xian; ChuShiHua(&L); system("cls"); //清屏 int choice1; do //进入初始菜单界面 { cout<<"\n*********************************************************************************"<<endl; cout<<"\n**************************** *************************************"<<endl; cout<<" *学生信息查询系统 \n"<<endl; cout<<"\n"<<endl; cout<<"\n"<<endl; cout<<"\n************************** 1、学生信息管理 ***********************************"<<endl; cout<<"\n************************** 2、学生信息查询 ***********************************"<<endl; cout<<"\n*************************** 0、退出系统 ***********************************"<<endl; cout<<"\n"<<endl; cout<<"\n*********************************************************************************"<<endl; cout<<"\n 请输入您的选择(1 or 2 or 0):"; cin>>choice1; switch(choice1) { case 1:xiugai(L,i,j,data);break; //进入学生信息修改菜单界面 case 2:chaxun(L,i,data,xian);break; //进入学生信息查询菜单界面 case 0:cout<<"\n您已安全退出系统."<<endl;break; //退出系统,即结束此函数 default:cout<<"\n没有此选项.请重选."<<endl;break; //若输入异常,显示异常操作,提示错误! } }while(choice1!=0); cout<<"\n------------------------------欢迎您下次再使用!---------------------------------"<<endl; return 0; return 0; }
List.cpp
List.h#include "List.h" #include <iostream> #include <cstdlib> #include <string> #include<fstream> using namespace std; /************************************************************************** 功能描述:本函数是给顺序表进行初始化赋值,主要是给顺序表的长度 Length赋初值为0 输入参数:Listtype类型的指针变量L 输出参数:无 返回值:无 其他说明:无 ***************************************************************************/ void ChuShiHua(Listtype*L) //顺序表的初始化函数 { L->Length=0; } /************************************************************************** 功能描述:本函数可以的到顺序表的长度,即返回Length的值 输入参数:Listtype类型的指针变量L 输出参数:无 返回值:Length值 其他说明:无 ***************************************************************************/ int GetLength(Listtype*L) //计算顺序表的长度 { return(L->Length); } /************************************************************************** 功能描述:本函数是按照位置查找已经录入的学生信息,若输入的i值不 在有效内,输出错误信息;输入正确则返回要查询的地址 输入参数:Listtype类型的指针变量L,int类型的变量i 输出参数:错误信息 返回值:0或者查询的地址 其他说明:无 ***************************************************************************/ Data *DataGet(Listtype*L,int i) //按照位置查找学生位置 { if(i<1||i>MAXLEN) { cout<<"位置输入错误!"<<endl; return 0; } else { return &(L->listData[i]); } } /************************************************************************** 功能描述:本函数是按照名字查询录入的学生信息,输入要查找的姓名, 若找到与之匹配的,便返回其地址 输入参数:Listtype类型的指针变量L,string类型的变量name 输出参数:无 返回值:0或者要查找的地址 其他说明:无 ***************************************************************************/ Data *NameGet(Listtype *L,string name) //按照姓名查找学生位置 { int n; for(n=1;n<=L->Length;n++) { cout<<n; if(L->listData[n].name==name) { return &(L->listData[n]); break; } else return 0; } } /************************************************************************** 功能描述:本函数是按照学号查询录入的学生信息,输入要查找的学号, 若找到与之匹配的,便返回其地址 输入参数:Listtype类型的指针变量L,string类型的变量num 输出参数:无 返回值:0或者要查找的地址 其他说明:无 ***************************************************************************/ Data *NumGet(Listtype *L,string num) //按照学号查找学生位置 { int n; for(n=1;n<=L->Length;n++) { cout<<n; if(L->listData[n].num==num) { return &(L->listData[n]); break; } else return 0; } } /************************************************************************** 功能描述:本函数是在已经录入的学生信息里插入一条新的学生信息,判断 若顺序表满则不能继续存储,输入的i不在有效范围输出错误信息, 输入正确则插入成功 输入参数:Listtype类型的指针变量L,int类型的变量i,Data类型的变量data 输出参数:错误信息 返回值:0或者1 其他说明:无 ***************************************************************************/ int Insertdata(Listtype*L,int i,Data data) //插入学生信息 { int j; if(L->Length>=MAXLEN) { cout<<"储存已满,不能添加!"<<endl; return 1; } if(i<1||i>MAXLEN) { cout<<"插入序号错误!"<<endl; return 1; } else { for(j=L->Length;j>=i;j--) L->listData[j+1]=L->listData[j]; L->listData[i]=data; L->Length++; return 0; } } /************************************************************************** 功能描述:本函数是删除指定位置的学生的信息,输入的i不在有效范围输出 错误信息,输入正确则删除成功。 输入参数:Listtype类型的指针变量L,int类型的变量i 输出参数:错误信息 返回值:0或者1 其他说明:无 ***************************************************************************/ int Deletedata(Listtype*L,int i) //删除学生信息 { int j; if(i<1||i>MAXLEN) { cout<<"输入删除节点错误!"<<endl; return 1; } else { for(j=i;j<L->Length;j++) L->listData[j]=L->listData[j+1]; L->Length--; return 0; } } /************************************************************************** 功能描述:本函数是删除指定位置的学生的信息,输入的i,k不在有效范围输出 错误信息,输入正确则删除成功。 输入参数:Listtype类型的指针变量L,int类型的变量i,int类型的变量k 输出参数:无 返回值:0或者1 其他说明:无 ***************************************************************************/ int IjDelete(Listtype*L,int i,int k) //删除顺序表中从第i个学生起的j个学生 { if(i<1||k<0||i+k>L->Length+1) return 1; else { int j; int count; for(count=1;count<=k;count++) { for(j=i;j<i+k;j++) { L->listData[j]=L->listData[j+1]; } L->Length--; } return 0; } } /************************************************************************** 功能描述:本函数显示出所有的录入的学生的信息,按照制定格式输出到 电脑屏幕上 输入参数:Listtype类型的指针变量L 输出参数:无 返回值:无 其他说明:无 ***************************************************************************/ void Show(Listtype*L) //显示所有的学生信息 { int i; for(i=1;i<=L->Length;i++) { cout<<"学号:"<<L->listData[i].num; cout<<"姓名:"<<L->listData[i].name; cout<<"年龄:"<<L->listData[i].age; cout<<endl; } } /************************************************************************** 功能描述:本函数能够连续添加学生信息,判断若线性表到达最大值, 输出提示信息 输入参数:Listtype类型的指针变量L,Data类型的变量data 输出参数:提示信息 返回值:0或者1 其他说明:无 ***************************************************************************/ int Adddata(Listtype*L,Data data) //新建学生信息 { if(L->Length>MAXLEN) { cout<<"存储已满,不能再添加学生!"<<endl; return 0; } else { L->listData[++L->Length]=data; return 1; } } /************************************************************************** 功能描述:本函数能把所有的录入信息保存进入文件中,如果打开失败输出 错误信息,打开成功按照指定格式保存入文件 输入参数:Listtype类型的指针变量L 输出参数:无 返回值:无 其他说明:无 ***************************************************************************/ void Savefile(Listtype *L,Data data) //保存文件 { ofstream out("学生.txt",ios::out); if(!out) { cout<<"打开失败!"<<endl; return; } cout<<"打开成功!"<<endl; for(int i=1;i<=L->Length;i++) { out<<"以下为所有学生信息:"<<endl; out<<"学生姓名:"<<L->listData[i].name<<" "<<"学生学号:"<<L->listData[i].num<<" "<<"学生年龄:"<<L->listData[i].age<<" " <<endl; } cout<<"写入成功!"<<endl; out.close(); }
#ifndef LIST_H #define LIST_H #include <string> using namespace std; #define MAXLEN 100 //定义顺序表的最大长度 struct Data { //定义顺序表结点类型 string num; //节点关键字 string name; int age; }; struct Listtype { //定义顺序表结构 Data listData[MAXLEN+1]; //结构体中嵌套结构体 int Length; }; void ChuShiHua(Listtype*L); //顺序表的初始化函数 int GetLength(Listtype*L); //计算顺序表的长度 Data *DataGet(Listtype*L,int i); //按照位置查找节点 Data *NameGet(Listtype*L,string name); //按照姓名查找节点 Data *NumGet(Listtype*L,string num); //按照学号查找节点 int Insertdata(Listtype*L,int i,Data data); //插入节点 int Deletedata(Listtype*L,int i); //删除节点 int IjDelete(Listtype*L,int i,int k); //删除顺序表中从第i个学生起的k个学生 void Show(Listtype*L); //显示所有的节点 int Adddata(Listtype*L,Data data); //追加节点 void Savefile(Listtype *L,Data data); //保存文件 #endif // LIST_H
-
数据结构课设 | 学生信息管理系统(C语言实现)
2021-02-05 15:32:54StuManage.h(头文件) #include <stdio.h> #include <stdlib.h>...#define MAXSIZE 11 //默认存入的学生个数 typedef int Status; // Status是函数的类型,其值是函数结果状态代码,如OK等.- StuManage.h(头文件)
#include <stdio.h> #include <stdlib.h> #include <string.h> #define OK 1 #define ERROR 0 #define INFINITY INT_MAX //计算机允许的整数最大值,即无穷大 #define MAXSIZE 11 //默认存入的学生个数 typedef int Status; // Status是函数的类型,其值是函数结果状态代码,如OK等 //学生信息结构体 typedef struct{ int num;//学号,默认为8位数字,前4位表示年级,第5和6位表示性别,01表示男,00表示女 char *name;//姓名 char gender;//性别 ,M表示男,W表示女 int avscore;//平均成绩 int clas;//班级,与类class区分开 char *major;//专业,都是计算机学院的专业 }Stu; //学生链表 typedef struct SLNode{ Stu data;//学生信息 struct SLNode *next; }SLNode,*SLinkList; /*创建学生信息链表*/ //学生链表初始化 Status InitList(SLinkList &SL){ SL = (SLinkList)malloc(sizeof(SLinkList));//创建一个头节点分配空间 //为专业和姓名两个数组分配空间 SL->data.major = (char *)malloc(sizeof(char)); SL->data.name = (char *)malloc(sizeof(char)); if(!SL||!SL->data.major||!SL->data.name) return ERROR;//分配失败,返回失败 SL->next = NULL;//分配成功,创建头节点,返回OK return OK; } //构建一个学生节点 SLNode *MakeNode(Stu s){ SLNode *p; p = (SLNode *)malloc(sizeof(SLNode)); if(!p) return NULL;//构建失败,返回空指针 //分配空间成功,构建新节点p,并返回 p->data = s; p->next = NULL; return p; } //录入学生信息(插入),按学号大小升序插入 Status EnterNode(SLinkList &SL, SLNode *p){ if(!SL||!p) return ERROR;//头节点或要插入的节点为空,参数不合理,返回ERROR SLNode *q; q = SL->next;//q指向第一个学生节点 if(!q){ //若第一个学生节点为空,直接插入新学生节点作为第一位学生 SL->next = p; p->next = NULL; return OK; //插入完成,返回OK; }else{//第一个学生节点不为空,按照学号大小升序插入 //若p学号比第一位学生的学号还小,则在最前面插入 if(p->data.num < q->data.num){ p->next = q; SL->next = p; return OK; }else{ while(q->next){ //若原来学生中已有p学生的信息,插入失败 if(p->data.num == q->data.num) return ERROR; //若p学号大小大于当前节点且小于当前节点下一个节点,则插入 if(q->data.num < p->data.num&&(q->next)->data.num > p->data.num){ p->next = q->next; q->next = p; return OK; } q = q->next;//未找到继续遍历下一个节点 } //若p学号大小比最后一个学生节点还大,直接插到最后 q->next = p; p->next = NULL; return OK; } } return ERROR; } //构建长度为n的学生有序单链表,数组S[]提供n个元素值(学生) Status CreateList(SLinkList &SL, int n, Stu *S){ SLNode *sp; //初始化失败或参数不合理,返回ERROR if(!InitList(SL)||n <= 0||!S) return ERROR; //依次插入n个节点 for(int i = 0;i < n;i++){ sp = MakeNode(S[i]);//以S[i]提供的信息创建新的节点 if(!EnterNode(SL,sp)) return ERROR;//有序插入,如果插入失败,返回ERROR; } return OK; } /*对学生信息进行操作*/ //输出全部学生信息 void OutputAll(SLinkList SL){ SLNode *p; p = SL->next; printf("学号\t\t姓名\t性别 平均成绩\t班级\t专业\n"); while(p){ printf("%d\t%s\t%c\t%d\t%d\t%s\n", p->data.num,p->data.name,p->data.gender,p->data.avscore,p->data.clas,p->data.major); p = p->next; } } //输出单个学生信息 void Output(SLNode *p){ //printf("学号\t\t姓名\t性别 平均成绩\t班级\t专业\n"); printf("%d\t%s\t%c\t%d\t%d\t%s\n", p->data.num,p->data.name,p->data.gender,p->data.avscore,p->data.clas,p->data.major); } //通过学号查找目标学生的前一个学生(方便删除操作),找到返回该学生结点,找不到返回空指针 SLNode *NumFindNode(SLinkList SL, int n){ SLNode *p; p = SL->next; //如果目标节点为第一位学生,则返回头节点 if(p->data.num == n) return SL; //遍历每一个结点,找到目标节点的前一个节点就返回 while(p->next){//如果写p会出错 if(p->next->data.num == n) return p; p = p->next; } return NULL; } //初始化一个学生信息结构体类型变量 void InitStu(Stu &S){ S.major = (char *)malloc(sizeof(char)); S.name = (char *)malloc(sizeof(char)); } /*对信息进行检查*/ //汉字比较 Status CompareChinese(char *c, SLNode *p){ char a[3];//定义一个字符数组来存储一个汉字 for(int j = 0;j < strlen(p->data.name);j += 2){//汉字的存储占两个字节,故j每次加2 //一个汉字占两个字节,把每个字节当成一个字符赋给数组a,最后赋值一个字符0作为结束。 a[0] = *(p->data.name+j); a[1] = *(p->data.name+j+1); a[2] = '\0'; //用strcmp函数比较两个汉字 if(!strcmp(a,c)) return OK;//找到直接返回OK } //没找到 return ERROR; } //检查学生信息的合理性 Status CheckManage(Stu s){ int j = 0; char *maj[4] = {"软件工程","计算机科学与技术","信息安全","网络工程"}; //先检查学号、班级、成绩合理性 if(s.num <= 20170000||s.num >= 20200199||s.clas <= 0||s.clas > 5||s.avscore < 0||s.avscore > 100) return ERROR; if((s.num%10000)/1000 != 0&&((s.num%1000)/100 != 0||(s.num%1000)/100 != 1)) return ERROR; //再检查性别合理性 if(((s.num%1000)/100 == 1&&s.gender != 'M')||((s.num%1000)/100 == 0&&s.gender != 'W')) return ERROR; //再检查姓名合理性 for(int i = 0;i < strlen(s.name);i += 2) if(*(s.name+i) > 0) return ERROR; //最后检查专业合理性 for(int i = 0;i < strlen(s.major);i += 2) if(*(s.major+i) > 0) return ERROR; //如果专业都是汉字就看是不是计算机专业 for(j = 0;j < 4;j++) if(!strcmp(maj[j],s.major)) break;//如果输入有符合的专业就结束循环 if(j == 4) return ERROR;//for循环进行到最后,说明专业不符合 return OK; } //检查有无信息冲突 Status CheckMaConflict(Stu s, SLinkList SL){ if(!SL) return ERROR; SLNode *p = SL->next; while(p){ if(s.num == p->data.num) return ERROR;//学号不能一样,直接返回ERROR //如果其他信息完全一样,则产生冲突,返回ERROR if(!strcmp(s.name,p->data.name)&&s.gender == p->data.gender&& s.avscore == p->data.avscore&&s.clas == p->data.clas&&!strcmp(s.major,p->data.major)) return ERROR; p = p->next; } return OK; }
- StuManage.cpp(源文件)
#include "StuManage.h" //修改学生信息 void ModifyManage(SLinkList &SL, int num){ // 参数不合理,直接返回 if(!SL||num <= 0||num <= 20170000||num >= 20200099){//学号默认大于0且为大于20170000的8位数字 printf("\n参数不合理,修改失败!(@.@)\n"); return ; } int flag; SLNode *p,*q; q = NumFindNode(SL,num);//调用函数找到该学生的前一个学生 //找到该结点 if(q&&q->next){ p = q->next;//p指向目标学生节点 printf("\n您要修改的学生信息为:\n"); printf("学号\t\t姓名\t性别 平均成绩\t班级\t专业\n"); Output(p);//输出修改前该学生信息 Stu s1; InitStu(s1);//先初始化一个新的学生信息结构体变量,再替换原来学生链表中的学生信息 printf("\n请您按照如下格式依次重新输入该学生信息:\n"); printf("学号(8位学号) 姓名 性别(M/W) 平均成绩 班级 专业\n"); scanf("%d %s %c %d %d %s",&s1.num,s1.name,&s1.gender,&s1.avscore,&s1.clas,s1.major); printf("\n请问您是否确认修改信息?是(1)/否(0):"); scanf("%d",&flag); //如果用户不确认,则重新输入 if(!flag){ Stu s2; InitStu(s2); printf("\n请重新输入:\n"); printf("学号(8位学号) 姓名 性别(M/W) 平均成绩 班级 专业\n"); scanf("%d %s %c %d %d %s",&s2.num,s2.name,&s2.gender,&s2.avscore,&s2.clas,s2.major); if(!CheckManage(s2)){ printf("\n输入参数不合理,修改失败!(@.@)\n"); return ; } //如果信息由冲突,则修改失败 if(!CheckMaConflict(s2,SL)){ printf("\n输入信息有冲突,修改失败!(@.@)\n"); return ; } //如果学号没有被修改,则直接替换原来信息 if(s2.num == p->data.num) p->data = s2;//用外部输入的新信息替换原来的学生信息 else{//如果学号被修改,则需重新排序插入 p->data = s2; q->next = p->next; p->next = NULL; //重新插入 EnterNode(SL,p); } }else{ if(!CheckManage(s1)){ printf("\n输入参数不合理,修改失败!(@.@)\n"); return ; } //检查输入信息有无冲突 if(!CheckMaConflict(s1,SL)){ printf("\n输入信息有冲突或与原信息相同,修改失败!(@.@)\n"); return ; } //如果学号没有被修改,则直接替换原来信息 if(s1.num == p->data.num) p->data = s1;//用外部输入的新信息替换原来的学生信息 else{//如果学号被修改,则需重新排序插入 p->data = s1; q->next = p->next; p->next = NULL; //重新插入 EnterNode(SL,p); } } printf("\n修改成功!(^0^)\n当前全部学生信息为:\n"); OutputAll(SL);//输出当前全部学生信息 }else printf("\n修改失败!未找到该学生信息(@.@)\n"); } //删除学生信息 void DeleteNode(SLinkList &SL, int num){ //参数不合理,直接返回 if(!SL||num <= 20170000||num >= 20200199){//学号默认大于0且为大于20170000的8位数字 printf("\n参数不合理,删除失败!(@.@)\n"); return ; } int flag; SLNode *p,*q; q = NumFindNode(SL,num);//q指向目标学生的前一个 //找到就删除 if(q&&q->next){ p = q->next;//p指向目标学生 printf("您要删除的学生的信息为:\n"); printf("\n学号\t\t姓名\t性别 平均成绩\t班级\t专业\n"); Output(p); printf("\n请问您是否确认删除该学生信息?是(1)/否(0):"); scanf("%d",&flag); //用户不确认,删除失败,直接返回 if(!flag){ printf("\n删除失败!(@.@)\n"); return ; } q->next = p->next; free(p);//销毁目标学生节点 printf("\n删除成功!(^0^)\n当前学生信息为:\n"); OutputAll(SL);//输出当前学生信息 }else printf("\n删除失败!未找到该学生信息(@.@)\n");//找不到返回失败 } //插入新的学生结点 void InsertNode(SLinkList &SL){ if(!SL){ printf("插入失败!参数不合理\n"); return ; } Stu s1; InitStu(s1); printf("\n请您按照如下格式依次输入新的学生的信息:\n"); printf("学号(8位学号) 姓名 性别(M/W) 平均成绩 班级 专业\n"); scanf("%d %s %c %d %d %s",&s1.num,s1.name,&s1.gender,&s1.avscore,&s1.clas,s1.major); //检查输入参数合理性以及信息有无冲突 if(!CheckManage(s1)) printf("\n参数不合理,插入失败!(@.@)\n"); else if(!CheckMaConflict(s1,SL)) printf("\n输入信息有冲突,修改失败!(@.@)\n"); else if(!MakeNode(s1)) printf("\n参数不合理,插入失败!(@.@)\n"); else if(EnterNode(SL,MakeNode(s1))){//调用EnterNode函数将新节点插入 printf("\n插入成功!(^0^)\n当前全部学生信息为:\n"); OutputAll(SL);//输出当前全部学生信息 }else printf("\n插入失败!(@.@)\n"); } //按照学号检索学生信息 void NumSearchNode(SLinkList SL, int num){ //参数不合理,直接返回 if(!SL||num <= 20170000||num >= 20200199){ printf("\n参数不合理,检索失败!(@.@)\n"); return ; } SLNode *p; //找到目标学生节点的前一个 p = NumFindNode(SL,num); if(p&&p->next){ //输出目标学生的信息 printf("\n检索成功!(^0^)\n该学生信息为:\n"); printf("学号\t\t姓名\t性别 平均成绩\t班级\t专业\n"); Output(p->next); }else printf("\n检索失败!(@.@)未找到相关信息\n"); } //模糊检索学生信息 /* 功能介绍: 1、通过学号前4位(也就是年级)模糊检索,输出学号前4位都一样的学生信息 2、通过单个汉字模糊检索,输出姓名中有该字的学生信息 3、通过班别模糊检索,输出班别一样的学生信息 4、通过专业模糊检索,输出专业一样的学生信息 */ void SearchNode(SLinkList SL){ //flag用来标记是否找到相关信息 ;k用来判断是否需要输出学生信息格式,找不到信息就不用输出 int k = 0,choose,i,flag1,flag = 0; char *c,*s; SLNode *p = SL->next; printf("请选择检索的方式:\n学号前4位--2/单个汉字---3/班别----4/专业----5\n"); scanf("%d",&choose); //用switch语句来实现选择 switch(choose){ case 2: //学号前4位检索 printf("\n请输入您要检索的学号前4位:"); scanf("%d",&i); if(i > 2020||i < 2017){//年级范围为2017到2020 printf("\n参数不合理\n"); break; } printf("\n学号\t\t姓名\t性别 平均成绩\t班级\t专业\n"); while(p){ if(p->data.num/10000 == i){ flag = 1; Output(p);//满足条件的就输出; } p = p->next; } break; case 3: //姓名中汉字检索 //因为一个汉字占两个字节,相当于两个字符,故用字符串指针来存入外部输入的汉字 c = (char *)malloc(sizeof(char)); printf("\n请输入您要检索的汉字:"); scanf("%s",c); //判断输入参数是否为汉字(汉字的第一个字节首位为1,对于有符号字符型来说是负数) if(*c > 0){ printf("\n参数不合理\n"); free(c);//输入参数不合理,直接销毁c break; } while(p){ //调用函数比较汉字 if(CompareChinese(c,p)){ k++; if(k == 1) printf("\n学号\t\t姓名\t性别 平均成绩\t班级\t专业\n"); flag = 1; Output(p); } p = p->next; } free(c);//用完c就销毁,释放内存 break; case 4: //班级检索 printf("\n请输入您要检索的班级:"); scanf("%d",&i); if(i <= 0||i > 5){//班级号范围为1到5 printf("\n参数不合理(@.@)\n"); break; } printf("\n学号\t\t姓名\t性别 平均成绩\t班级\t专业\n"); while(p){ if(p->data.clas == i){ flag = 1; Output(p); } p = p->next; } break; case 5: //专业检索 flag1 = 0;//用来判断参数是否合理 s = (char *)malloc(sizeof(char)); printf("\n请输入您要检索的专业:"); scanf("%s",s); //判断输入参数是否都为汉字 for(int j = 0;j < strlen(s);j += 2){ if(*(s+j) > 0){ printf("\n参数不合理\n"); flag1 = 1; free(s);//参数不合理,直接销毁s } } if(flag1) break; while(p){ if(!strcmp(p->data.major,s)){//用strcmp函数比较两个字符串,相同就返回0 k++; if(k == 1) printf("\n学号\t\t姓名\t性别 平均成绩\t班级\t专业\n"); flag = 1; Output(p); } p = p->next; } free(s);//用完s就销毁,释放内存 break; default: printf("\n参数不合理"); break; } //通过flag的值判断是否找到目标信息 if(!flag) printf("\n未找到相关信息,检索失败!(@.@)\n"); else printf("\n检索成功!(^0^)\n"); } //main函数实现 int main(){ int num1,choose,m = 1; SLinkList SL; //N=11,默认录入11个学生信息 Stu stu[MAXSIZE] = {{20200091,"张三",'W',60,3,"软件工程"}, {20190100,"李华",'M',90,4,"计算机科学与技术"}, {20190102,"陈皮",'M',100,3,"软件工程"}, {20180080,"吴屏",'W',81,1,"信息安全"}, {20190111,"麦仁",'M',98,5,"网络工程"}, {20170075,"李柱",'W',76,2,"计算机科学与技术"}, {20180129,"陈刘",'M',76,1,"网络工程"}, {20170156,"李广",'M',59,2,"信息安全"}, {20200043,"刘华",'W',75,3,"软件工程"}, {20190118,"张友",'M',66,5,"计算机科学与技术"}, {20180138,"华山",'M',78,4,"信息安全"} }; //录入学生信息,创建学生链表 CreateList(SL,MAXSIZE,stu); //功能选择 /*功能选择介绍 输出当前全部学生信息,扣1 插入新的学生,扣2 删除某个学生,扣3 修改某个学生信息,扣4 按学号检索某个学生信息,扣5 检索学生信息,扣6 结束进程,扣0*/ printf("\n\t*********************************************************************\n"); printf("\t* * \n"); printf("\t* 欢迎进入学生信息管理系统(^0^) *\n"); printf("\t* *\n"); printf("\t* *\n"); printf("\t*********************************************************************\n"); //用一个for循环实现多次选择操作,最多可选择无穷大次 for(int i = 0;i < INFINITY;i++){ if(i != 0) printf("\n\t\t\t**********学生信息管理系统**********\n"); printf("\n\t\t\t*************************************\n"); printf("\n\t\t\t* 输出当前全部学生信息--1 *\n"); printf("\t\t\t* 插入学生信息----------2 *\n"); printf("\t\t\t* 删除学生信息----------3 *\n"); printf("\t\t\t* 修改学生信息----------4 *\n"); printf("\t\t\t* 按学号检索学生信息----5 *\n"); printf("\t\t\t* 模糊检索学生信息------6 *\n"); printf("\t\t\t* 退出系统--------------0 *\n"); printf("\n\t\t\t*************************************\n"); printf("\n*请选择您想要进行的操作:"); scanf("%d",&choose); switch(choose){ case 1: //输出当前全部学生信息 system("cls"); printf("\n\t*********************************************************************\n"); printf("\t * * \n"); printf("\t * 欢迎进入学生信息管理系统(^0^) *\n"); printf("\t * *\n"); printf("\t * 当前功能为 输出当前全部学生信息 *\n"); printf("\t * *\n"); printf("\t*********************************************************************\n"); printf("\n当前全部学生信息为:\n\n"); OutputAll(SL); break; case 2: //插入 system("cls"); printf("\n\t*********************************************************************\n"); printf("\t * * \n"); printf("\t * 欢迎进入学生信息管理系统(^0^) *\n"); printf("\t * *\n"); printf("\t * 当前功能为 插入学生信息 *\n"); printf("\t * *\n"); printf("\t*********************************************************************\n"); InsertNode(SL);//调用插入函数 break; case 3: //删除 system("cls"); printf("\n\t*********************************************************************\n"); printf("\t * * \n"); printf("\t * 欢迎进入学生信息管理系统(^0^) *\n"); printf("\t * *\n"); printf("\t * 当前功能为 删除学生信息 *\n"); printf("\t * *\n"); printf("\t*********************************************************************\n"); printf("\n当前全部学生信息为:\n\n"); OutputAll(SL); printf("\n请输入您要删除的学生的学号:"); scanf("%d",&num1); DeleteNode(SL,num1); break; case 4: //修改 system("cls"); printf("\n\t*********************************************************************\n"); printf("\t * * \n"); printf("\t * 欢迎进入学生信息管理系统(^0^) *\n"); printf("\t * *\n"); printf("\t * 当前功能为 修改学生信息 *\n"); printf("\t * *\n"); printf("\t*********************************************************************\n"); printf("\n当前全部学生信息为:\n\n"); OutputAll(SL); printf("\n请输入您要修改的学生的学号:"); scanf("%d",&num1); ModifyManage(SL,num1); break; case 5: //按学号检索 system("cls"); printf("\n\t*********************************************************************\n"); printf("\t * * \n"); printf("\t * 欢迎进入学生信息管理系统(^0^) *\n"); printf("\t * *\n"); printf("\t * 当前功能为 按学号检索 *\n"); printf("\t * *\n"); printf("\t*********************************************************************\n"); printf("\n请输入您要检索的学生的学号:"); scanf("%d",&num1); NumSearchNode(SL,num1); break; case 6: //模糊检索 system("cls"); printf("\n\t*********************************************************************\n"); printf("\t * * \n"); printf("\t * 欢迎进入学生信息管理系统(^0^) *\n"); printf("\t * *\n"); printf("\t * 当前功能为 模糊检索 *\n"); printf("\t * *\n"); printf("\t*********************************************************************\n\n"); SearchNode(SL); break; case 0: //退出系统 m = 0; printf("\n您已成功退出系统,感谢您的使用,再见!"); break; default: printf("\n参数不合理,系统已自动关闭(@.@)\n"); m = 0; break; } if(!m) break; system("pause"); system("cls");//清空窗口的内容 } return 0; }
- 运行初始界面:
-
数据结构实现学生信息管理系统功能
2019-01-22 20:25:22学生信息管理系统 1、 学生信息录入:主要是录入学生班级信息和学生基本情况; 2、 学生信息查询:按指定系检索该系的学生信息,其中包括所有的学生信息; 3、 学生信息维护:维护学生、系别、课程、学生选课及...学生信息管理系统
1、 学生信息录入:主要是录入学生班级信息和学生基本情况;
2、 学生信息查询:按指定系检索该系的学生信息,其中包括所有的学生信息;
3、 学生信息维护:维护学生、系别、课程、学生选课及成绩等方面的基本信息,包括增加、删除和修改;
4、 学生选课:为学生提供选课界面,包括所有课程信息。进入该界面前学生要输入正确的学号和姓名。具体代码如下:(vc++6.0刚刚试过可以运行)
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<conio.h> #include <windows.h> struct course //定义储存课程信息的结构体 { int num;//课程号 char subject[10];//课程名 int mark;//学分 int count;//已选人数 }cour[5] = { {1,"数据结构",3,0},{2,"java语言",3,0}, {3,"大学英语",5,0},{4,"软件工程",4,0},{5,"线性代数",3,0} };//课程信息 void Output_course(struct course *p)//调用存储课程信息结构体数组,输出所有课程信息 { system("cls"); printf("课程信息如下: \n"); for (p = cour; p < cour + 5; p++) printf("课程号--%d 科目--%7s 学分--%d 已选人数--%d\n\n", p->num, p->subject, p->mark, p->count); } struct student //定义存储学生信息的结构体 { long num; char name[10]; char order1[10];//所选课程1 char order2[10];//所选课程2 }stu[8] = { {20170401,"小明","NULL","NULL"}, {20170402,"小红","NULL","NULL"}, {20170403,"小张","NULL","NULL"}, {20170404,"小王","NULL","NULL"}, {20170405,"小花","NULL","NULL"}, {20170406,"小丽","NULL","NULL"}, {20170407,"小雨","NULL","NULL"}, {20170408,"小二","NULL","NULL"}, }; void Output_student(struct student *p)调用存储课程信息结构体数组,输出所有学生信息 { system("cls"); printf("学生的选课情况如下:\n"); for(p=stu;p<stu+8;p++) printf("学号--%d 姓名--%3s 课程1--%7s 课程2--%7s\n\n", p->num, p->name, p->order1, p->order2); } void modify(struct student *p, struct course cour[5]) //调用储存course和student的结构体数组,输出任意一个学生信息,并且可以修改 { int s; int g; char b; char k[10]; char h; long n; long m; int i; int j; char name1[20]; system("cls"); printf("请输入学号(20170401-20170408):"); scanf("%d", &n); printf("请输入学号对应的姓名:"); scanf("%d", &h); for (p = stu; p < stu + 8; p++) { if (n == p->num) //找到对应的学生 { system("cls"); printf("\n\n\n 该学生信息如下\n\n\n"); printf("学号--%d 姓名--%s 课程1--%s 课程2--%s\n\n", p->num, p->name, p->order1, p->order2); printf("\nA.修改 退出请按A,a外任意字母键\n"); scanf("%s", &b); { if (b == 'a' || b == 'A') { printf("\n1.修改学号 2.修改姓名 3.修改所选课程\n"); scanf("%d", &s); { if (s == 1) { printf("\n 学号修改为:\n"); //修改学号 scanf("%d", &m); p->num = m; system("cls"); printf("\n\n\n\n\n\n\n修改后如下:\n"); printf("学号--%d 姓名--%s 课程1--%s 课程2--%s\n\n", p->num, p->name, p->order1, p->order2); } if (s == 2) { printf("\n 姓名修改为:\n"); scanf("%20s", name1); strcpy(p->name, name1); system("cls"); printf("\n\n\n\n\n 修改后如下\n\n"); printf("学号--%d 姓名--%s 课程1--%s 课程2--%s\n\n", p->num, p->name, p->order1, p->order2); } if (s == 3) { system("cls"); printf("\n 输入你想修改的课程:区分大小写\n"); scanf("%s", &k); {if (strcmp(p->order1, k) == 0) { system("cls"); printf("\n1.数据结构 2.java语言 3.大学英语 4.软件工程 5.线性代数\n"); printf("\n你想修改为(1-5):\n"); scanf("%d", &g); for (i = 0; i < 5; i++) { if (g == i + 1) { if (cour[g - 1].count >= 3) { system("cls"); printf("\n\n 该课程已被选满\n");//课程选满,返回主菜单 } else { if (strcmp(p->order2, cour[g - 1].subject) == 0) printf("\n\n 你已选过这门课 \n\n");//重选,返回主菜单 else { strcpy(p->order1, cour[g - 1].subject); cour[g - 1].count++; for (j = 0; j < 5; j++) { if (strcmp(cour[j].subject, k) == 0) cour[j].count--; } system("cls"); printf("\n\n学生信息 \n\n"); printf("学号--%d 姓名--%s 课程1--%s 课程2--%s\n\n", p->num, p->name, p->order1, p->order2); } } } } } else if (strcmp(p->order2, k) == 0) { system("cls"); printf("\n1.数据结构 2.java语言 3.大学英语 4.软件工程 5.线性代数\n"); printf("\n你想修改为(1-5):\n"); scanf("%d", &g); for (i = 0; i < 5; i++) { if (g == i + 1) { if (cour[g - 1].count >= 3) { printf("\n\n 该课程已被选满\n");//已选满 } else { if (strcmp(p->order1, cour[g - 1].subject) == 0) printf("\n\n 你已选过这门课 \n\n");//重选 else { strcpy(p->order2, cour[g - 1].subject); cour[g - 1].count++; for (j = 0; j < 5; j++) { if (strcmp(cour[j].subject, k) == 0) cour[j].count--; } system("cls"); printf("\n\n学生信息 \n\n"); printf("学号--%d 姓名--%s 课程1--%s 课程2--%s\n\n", p->num, p->name, p->order1, p->order2); } } } } } else printf("\n\n 您还没选这门课或拼写错误\n\n"); } } } } } } } } void xuanke(struct student *p,struct course cour[5])//为任意学生去选课 { long n;int a;int b;int t = 0;int u = 0;int i; system("cls"); printf("请输入学号(20170401-20170408):"); scanf("%d", &n); for (p = stu;p < stu + 8;p++) { if (n == p->num)//找到相应的学生 { system("cls"); if (strcmp(p->order1,"NULL")!=0) //第一门课不为空 t = 1; else { system("cls"); printf("\n\n\n\n\n\n请选您的第一门课 提示:您最多只能选二门课\n\n"); printf("\n1.数据结构 2.java语言 3.大学英语 4.软件工程 5.线性代数\n\n"); printf("\n请选第一门课:不选请按1-5外任意数字键返回\n\n"); scanf("%d", &a);//输入所选课程编号 for (i = 0; i < 5; i++) { if (a == i + 1) { if (cour[a - 1].count >= 3) { printf("\n\n该课程已被选满\n");//课程选满。返回主菜单 } else { if (strcmp(p->order2,cour[a - 1].subject)==0) printf("\n\n\n 你已选过这门课\n");//重选,返回主菜单 else { strcpy(p->order1, cour[a - 1].subject);//选课成功 cour[a - 1].count++; system("cls"); printf("\n\n\n\n\n\n 学生信息:\n"); printf("学号--%d 姓名--%s 课程1--%s 课程2--%s\n\n", p->num, p->name, p->order1, p->order2); } } } } } if (strcmp(p->order2, "NULL")!=0)//第二门课不为空 u = 1; else { printf("\n\n\n\n\n\n请选您的第二门课 提示:您最多只能选二门课\n\n"); printf("\n1.数据结构 2.java语言 3.大学英语 4.软件工程 5.线性代数\n\n"); printf("\n 请选第二门课:不选请按 1-5 外任意数字键返回\n\n"); scanf("%d", &b); for (i = 0; i < 5; i++) { if (b == i + 1) { if (cour[b - 1].count >= 3) { printf("\n\n 该课程已被选满 \n");//已选满,返回主菜单 } else { if (strcmp(p->order1, cour[b - 1].subject)==0) printf("\n\n\n 你已选过这门课 \n");//重选,返回主菜单 else { strcpy(p->order2, cour[b - 1].subject); cour[b - 1].count++; system("cls"); printf("\n\n\n\n\n\n 学生信息:\n");//成功选课 printf("学号--%d 姓名--%s 课程1--%s 课程2--%s\n\n", p->num, p->name, p->order1, p->order2); } } } } } if (u==1&&t==1) printf("\n 您已选满,若想修改请进入菜单 3\n"); } } } void a() { for (;;){ int n; printf("\t\t************欢迎来到选课系统************\n\n"); printf("\t\t**-------- 1 浏览课程信息 ------------**\n\n"); printf("\t\t**-------- 2 浏览学生选课情况 --------**\n\n"); printf("\t\t**-------- 3 学生信息查询和修改 ------**\n\n"); printf("\t\t**-------- 4 学生选课 ----------------**\n\n"); printf("\t\t**-------- 5 退出 --------------------**\n\n"); printf("请选择(1-5):[ ]\b\b"); scanf("%d", &n); switch (n) { case 1:Output_course(cour); break; case 2:Output_student(stu); break; case 3:modify(stu,cour); break; case 4:xuanke(stu,cour); break; case 5:exit(0); default:printf("请输入正确数字!\n"); } } } #define N 100 typedef struct stulink_node { char sdepartment[10]; char sclass[10]; char scourse[10]; char sno[14]; char sname[10]; char ssex[2]; float psscore; float syscore; float qmscore; float zpscore; struct stulink_node *next; }student; typedef student *linklist; student *head; char sno[N][20]={{'a','b'}}; int count; void display(); //函数声明 int judge(char sno1[]) //判断学号函数 { int i; for(i=0;i<N;i++) { if(!strcmp(sno1,sno[i])) return 1; } return 0; } student *init() //建立一个空的单链表 { return NULL; } float average(student *stu) //求总评成绩函数 { return (float)(0.4*stu->psscore+0.3*stu->syscore+0.3*stu->qmscore); } void luru() //录入学生信息函数 { linklist p,q; static int count=0; char flag='0'; q=(linklist)malloc(sizeof(student)); p=head=NULL; while(flag=='0') { printf("\n"); printf("请输入学生的学号: "); scanf("%s",&q->sno); while(judge(q->sno)) { printf("学号重复,请重新输入:"); scanf("%s",&q->sno); } strcpy(sno[count],q->sno);count++; printf("请输入学生的系别: "); scanf("%s",&q->sdepartment); printf("请输入学生的班级: "); scanf("%s",&q->sclass); printf("请输入学生的课程: "); scanf("%s",&q->scourse); printf("请输入学生的姓名: "); scanf("%s",&q->sname); printf("请输入学生的性别: "); scanf("%s",&q->ssex); printf("请输入学生的平时成绩: "); scanf("%f",&q->psscore); printf("请输入学生的实验成绩: "); scanf("%f",&q->syscore); printf("请输入学生的期末成绩: "); scanf("%f",&q->qmscore); q->zpscore=average(q); setbuf(stdin,NULL); if(head==NULL) { head=q; p=head; } else { p->next=q; p=q; } q=(linklist)malloc(sizeof(student)); printf("按0继续输入,否则退出\n"); flag=getch(); setbuf(stdin,NULL); } free(q); printf("输入完毕!\n "); p->next=NULL; } void charu() //插入 学生信息函数 { int j=0,i; linklist p,q; p=head; printf("请输入要插入的位置: "); scanf("%d",&i); if(i<0) printf("输入位置不规范!\n"); else { while (p&&i!=j) { p=p->next;j++; } if(!p&&i!=0) printf("未找到该结点不能插入!"); else { q=(linklist)malloc(sizeof(student)); printf("请输入学生的学号: "); scanf("%s",&q->sno); while(judge(q->sno)) { printf("学号重复,请重新输入:"); scanf("%s",&q->sno); } strcpy(sno[count],q->sno);count++; printf("请输入学生的系别: "); scanf("%s",&q->sdepartment); printf("请输入学生的班级: "); scanf("%s",&q->sclass); printf("请输入学生的课程: "); scanf("%s",&q->scourse); printf("请输入学生的姓名: "); scanf("%s",&q->sname); printf("请输入学生的性别: "); scanf("%s",&q->ssex); printf("请输入学生的平时成绩: "); scanf("%f",&q->psscore); printf("请输入学生的实验成绩: "); scanf("%f",&q->syscore); printf("请输入学生的期末成绩: "); scanf("%f",&q->qmscore); q->zpscore=average(q); if(i==0) { q->next=head; head=q; } else { q->next=p->next; p->next=q; } } } } void xiugai() //修改学生信息函数 { linklist q; int m=0; char sno[15]; q=head; printf("请输入要修改的学生学号:"); scanf("%s",&sno); if(!q) printf("修改失败,没有学生信息!\n"); else { while(q!=NULL) { if(strcmp(q->sno,sno)==0) { printf("请输入学生的系别: "); scanf("%s",&q->sdepartment); printf("请输入学生的班级: "); scanf("%s",&q->sclass); printf("请输入学生的课程: "); scanf("%s",&q->scourse); printf("请输入学生的学号: "); scanf("%s",&q->sno); printf("请输入学生的姓名: "); scanf("%s",&q->sname); printf("请输入学生的性别: "); scanf("%s",&q->ssex); printf("请输入学生的平时成绩: "); scanf("%f",&q->psscore); printf("请输入学生的实验成绩: "); scanf("%f",&q->syscore); printf("请输入学生的期末成绩: "); scanf("%f",&q->qmscore); q->zpscore=average(q); setbuf(stdin,NULL); m=1; printf("修改成功!\n\n"); break; } else q=q->next; } if(m==0) printf("修改失败,没有该学生信息!\n\n"); } } void shanchu() //删除学生信息函数 { linklist pre,q; char sno[12]; pre=head; q=head; printf("请输入要删除的学生学号:"); scanf("%s",&sno); if(!q) printf("没有学生信息,无法删除!\n\n"); else { while(q) { if(strcmp(q->sno,sno)==0) { if(q==head) { head=q->next; free(q); } else { pre->next=q->next; free(q); } printf("删除成功!\n"); break; } else { pre=q; q=q->next; } } } } void chaxun() //查询学生信息函数 { linklist p; int m=0; char sno[15]; p=head; printf("请输入需查询的学生学号:"); scanf("%s",&sno); if(!p) printf("没有学生信息,无法查询!\n\n"); else { while(p) { if(strcmp(p->sno,sno)==0) { printf("系别:%s\n",p->sdepartment); printf("班级:%s\n",p->sclass); printf("课程:%s\n",p->scourse); printf("学号:%s\n",p->sno); printf("姓名:%s\n",p->sname); printf("性别:%s\n",p->ssex); printf("平时成绩:%-.2f\n",p->psscore); printf("实验成绩:%-.2f\n",p->syscore); printf("期末成绩:%-.2f\n",p->qmscore); printf("总评成绩:%-.2f\n",p->zpscore); m=1; break; } else p=p->next; } if(m==0) printf("查询失败,没有该生信息!\n"); } } void paixu() //对学生总评成绩排序(冒泡法) { linklist p,q,r; student temp; r=head; if(r==NULL) printf("没有学生成绩,请先添加学生成绩!\n"); else { while(r) { p=r; q=r->next; while(q) { if(p->zpscore < q->zpscore) { strcpy(temp.sdepartment,p->sdepartment); strcpy(temp.sclass,p->sclass); strcpy(temp.scourse,p->scourse); strcpy(temp.sno,p->sno); strcpy(temp.sname,p->sname); strcpy(temp.ssex,p->ssex); temp.psscore=p->psscore; temp.syscore=p->syscore; temp.qmscore=p->qmscore; temp.zpscore=p->zpscore; strcpy(p->sdepartment,q->sdepartment); strcpy(p->sclass,q->sclass); strcpy(p->scourse,q->scourse); strcpy(p->sno,q->sno); strcpy(p->sname,q->sname); strcpy(p->ssex,q->ssex); p->psscore=q->psscore; p->syscore=q->syscore; p->qmscore=q->qmscore; p->zpscore=q->zpscore; strcpy(q->sdepartment,temp.sdepartment); strcpy(q->sclass,temp.sclass); strcpy(q->scourse,temp.scourse); strcpy(q->sno,temp.sno); strcpy(q->sname,temp.sname); strcpy(q->ssex,temp.ssex); q->psscore=temp.psscore; q->syscore=temp.syscore; q->qmscore=temp.qmscore; q->zpscore=temp.zpscore; } q=q->next; } r=r->next; } printf("****排序完毕,按由大到小的总评成绩!"); display(); } } void display() //输出学生信息函数 { student *p; p=head; if(!p) printf("暂无学生成绩!\n"); else { printf("各个学生成绩为:\n"); while(p) { /*printf("系别:%s,班级:%s,课程:%s,学号:%s,姓名:%s,性别:%s, 平时成绩:%-.2f,实验成绩:%-.2f,期末成绩:%-.2f,总评成绩:%-.2f\n", p->sdepartment,p->sclass,p->scourse,p->sno,p->sname,p->ssex, p->psscore,p->syscore,p->qmscore,p->zpscore);*/ printf("系别:%s ",p->sdepartment); printf("班级:%s ",p->sclass); printf("课程:%s ",p->scourse); printf("学号:%s ",p->sno); printf("姓名:%s ",p->sname); printf("性别:%s ",p->ssex); printf("平时成绩:%-.2f ",p->psscore); printf("实验成绩:%-.2f ",p->syscore); printf("期末成绩:%-.2f ",p->qmscore); printf("总评成绩:%-.2f\n",p->zpscore); p=p->next; } } } void menu() { int choose; printf("**************学生信息管理系统*****************\n"); printf("* *\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("***********************************************\n"); printf("\n"); printf("请输入你的选择:"); scanf("%d",&choose); switch(choose) { case 1:luru();break; case 2:charu();break; case 3:xiugai();break; case 4:shanchu();break; case 5:chaxun();break; case 6:paixu();break; case 7:display();break; case 8:a();break; case 9:exit(0);break; default:printf("请输入正确数字!\n"); } menu(); } int main() { head=init(); menu(); return 0; }
运行结果很多,我简单的给个主菜单
欢迎您关注我的微信公众号:学习微站(studysth)
最后,这是我的主页链接:https://blog.csdn.net/weixin_43206161
-
数据结构实验报告(一)学生信息管理系统
2020-01-12 10:58:03大二计算机学生报告的汇总 进入计算机专业以来每天的必要工作就是写报告,按照老师的话来说,我们计算机专业的...学生信息管理系统 代码区 代码说明:此代码所运用的软件是ios系统的x-code #include <stdio.h... -
数据结构大作-学生信息管理系统
2020-06-02 12:31:40C语言编写的 辣鸡 学生管理系统 -
数据结构C语言学生信息管理系统
2017-04-16 11:08:42基于C语言,数据结构,学生信息管理系统 -
数据结构—单链表实现学生信息管理系统
2019-06-19 13:50:22printf("链表结构如下:\n"); while (p) { printf("%s %s %d %.2f", p->data.name, p->data.sno, p->data.age, p->data.score); printf("\n"); p = p->next; } } //插入操作 int ListInsert(LinkList &L... -
数据结构-学生成绩管理系统
2021-02-27 19:21:17学生信息的录入、查询、修改、排序、按学生成绩确定名次以及信息的输出。 其中学生信息包含:学号、姓名、专业、四门课、总分以及排名; 信息修改仅对四门成绩进行修改; 信息查询可以按照学号和姓名两种查询方法... -
数据结构课程设计--学生信息管理系统
2017-12-22 07:52:01//(((((((((((((修改信息 (可以单项修改学生信息) ))))))))))))) stu *modify(stu *y) { int choi; char choice; int cp; char num[20],ch[20]; stu *p; if (y== NULL) { printf... -
数据结构课程设计——学生信息管理系统
2016-12-29 13:55:39程序区: stud.h #ifndef _TEST #define _TEST #include #include #include #include #define LEN sizeof(struct Student) ...struct Student //学生信息的结构体声明 { unsigned int num; -
数据结构综合实验报告 学生数据结构成绩管理系统
2010-01-11 00:22:03数据结构综合实验报告 学生数据结构成绩管理系统 -
学生信息管理(顺序表)(数据结构入门)
2019-03-17 16:04:03要求: 自己设计学生基本信息表 具备功能:创建、清空、销毁、插入、删除、按值查找、更新某人信息、指定位置查找、遍历。 详解我是没有了,可以看这里 瞎写的,欢迎纠错 #include <iostream> ... -
数据结构顺序表之学生信息管理系统简单示例
2019-10-17 17:40:52用顺序表写的简单的学生管理系统,自己动手,丰衣足食! #include<stdio.h> #include<stdlib.h> #include<string.h> #define MAXSIZE 50 typedef struct{ char name[21],num[12]; int math,... -
数据结构课程设计—学生信息管理系统
2015-12-25 15:33:18问题描述: /* ...* All rights reserved. * 文件名称:aaaa.cbp * 作 者:张芸嘉 * 完成日期:2015年12月24日 ...* 问题描述: 本项目为学生信息管理系统,设计一个可以管理学生信息的软件系统。 * -
数据结构课程设计:学生成绩管理系统
2022-01-07 00:10:15学生成绩管理系统应能实现对学生信息实现基本的增删改查,以及根据学生相关信息进行排序,并且对学生信息实现文件的读出和写入。 设计思想 程序结构 主题架构:主函数当中先从文件当中读取学生信息,接着进入登录... -
数据结构课程设计之学生宿舍信息管理系统
2020-06-21 10:14:38数据结构课程设计之学生宿舍信息管理系统,宿舍对于大学生在校生活来说相当于家的存在,而宿舍管理又是学校后勤管理的重要环节,如何直观的了解宿舍的入住情况和每位同学的住宿位置是提高工作效率的重要课题,根据... -
数据结构课程设计——学生成绩管理系统
2021-12-12 17:50:05本程序是对学生的成绩管理做一个简单的模拟,用菜单选择方式完成下列功能: 登记学生成绩;查询学生成绩;插入学生成绩;删除学生成绩。把问题看作对线性表的操作来完成。 #include <stdio.h> #include ... -
学生成绩管理系统(数据结构课程设计)
2009-10-13 11:39:46关键词: 学生信息管理,链式存储结构,面向对象程序设计 Student Information Management System LIling (Oriental Institute of Science and Technology College,Class3) Abstract: The experimental design of ... -
数据结构--学生成绩管理系统(顺序表)
2021-11-24 15:30:46编写一个简单的学生信息管理程序,能实现对学生信息的简单管理。建立一个学生的信息登记表,每个学生的信息包括:学号,姓名和课程的成绩。 程序运行时显示一个简单的菜单,例如: (1)添加记录 (2)显示记录 (3... -
学生管理系统的设计与实现(c语言版本数据结构)
2020-07-09 18:54:04文章目录学生管理系统的设计与实现1、需求分析1.1 实验目的:1.2 实验内容:1.3实验要求:1.4概要设计:2、概要设计2.1所用数据结构的定义及其相关说明(相关结构体或类的定义及其含义)2.2、各子程序调用关系2.3、各... -
数据结构(Java版)-学生成绩管理系统
2011-01-04 15:34:24学生成绩管理系统---使用数据结构中的二叉树排序,利用数据库实现学生查询、删除、修改信息、按学号或班级或课程成绩查询学生信息等。主要是字符界面显示 -
C语言学生信息管理系统详细设计
2019-10-06 16:15:48学生信息管理系统 授权协议: 允许对本文提供的任何信息、资料进行使用、学习、修改等,但请注明引用出处。(白tom: qq1005252070) 1. 问题定义 1.1. 概述 不论是在校计算机专业的学生还是刚步入IT行业从事C工作... -
数据结构第一次作业(学生信息管理系统-顺序表&&链表)
2016-09-21 14:17:34实验目的 : 1 、掌握线性表的定义; 2 、掌握线性表的基本操作,如建立、查找、插入和删除等。...定义一个包含学生信息(学号,姓名,成绩)的的 ...(1) 根据指定学生个数,...(4) 根据指定的位置可返回相应的学生信息 -
数据结构课程设计---学生信息管理系统
2011-06-26 19:08:00程序能实现以下功能: 建立链表 显示链表 查找链表中是否存在某个元素,并显示这个元素的所有信息,若没有这个元素则显示“无此记录!”的信息。 删除链表中指定学号的结点。 在链表中指定的位置插入一个新结点... -
C语言版-数据结构-期末课程设计-大作业(学生成绩管理系统)附源码+实验文档
2021-12-22 16:53:044. 数据结构说明和模块算法说明 4.1结构体顺序表的定义 4.2顺序表的构造 4.3顺序表的插入 4.4顺序表的按值查找 4.5顺序表的删除数据 4.6顺序表的按值查找 4.7顺序表的排序算法---冒泡排序 5. 使用说明书 ... -
C语言:学生信息管理系统演示和说明(数据结构版)
2019-05-19 20:05:15文件版的学生管理系统...而数据结构版的学生管理系统重点是维护链表,能够将大家学到的数据结构的知识运用到实际中。 演示程序下载地址:http://pan.baidu.com/s/1dDS5WI... -
数据结构课程设计(学生选课管理系统)链表实现
2020-07-03 22:47:498)修改学生信息 9)删除学生信息 10)删除课程信息 … 2.代码 学生和课程结构体 讲文件里的内容读取到单链表中 将学生信息保存到结构体中 4.代码实现 还有其他的功能我就不一一展示了。 有想要源代码 -
基于C++实现的学生信息管理系统
2021-07-18 22:03:52基于C++实现的学生信息管理系统前言一、系统介绍二、系统设计1.数据结构:2.辅助模块介绍:3.功能模块介绍:资源下载 前言 系统主要任务是实现对学生的基本信息进行管理,如查询、修改、增加、删除、排序等。本... -
数据结构课程设计---学生成绩管理系统
2020-12-10 22:27:542.建立学生信息链表并保存到文件中 3.按照总成绩进行排序 4.打印需要补考的学生的信息 5.合并两个成绩单到一个新的成绩单中 6.查找学生成绩(按照学号) 7.打印学生成绩单 C语言代码 #define _CRT_SECURE_...
收藏数
91,549
精华内容
36,619