您的位置:首页 > 其它

线性表的链式实现应用----学生信息管理系统

2017-10-11 16:57 148 查看
记录一下,数据结构的作业。

系统的功能菜单



如果有Bug,欢迎指出!

#include<bits/stdc++.h>
using namespace std;
#define OK 1
#define ERROR 0
typedef int status;

typedef struct LNode{
char num[25];   //  学生的学号
char name[25]; // 学生的姓名
double score; // 学生的成绩
//  这里可以添加多个信息,看自己了,我写的简略
LNode *next;
}LNode,*LinkList;

typedef struct {
LinkList L;
status init(){
L=new LNode;
L->next=NULL;
return OK;
}
status CreatList(int n){  //  创建链表,输入初始的
L=new LNode;
L->next=NULL;
LNode *p;
for(int i=1;i<=n;i++){
p=new LNode;
printf("请输入第%d个学生的信息          ",i);
scanf("%s  %s  %lf",p->num,p->name,&p->score);
p->next=L->next;L->next=p;
}
L->score=n;
return OK;
}
status GetLength(){  // 得到链表中学生的个数
return (int)L->score;  //// 头结点中的score成员,我是用来存学生个数的。
}
status TraverseList(){  // 遍历链表中所有的学生,并显示情况。
if(L->next==NULL) return ERROR;
LNode *p;int cnt=1;
printf("序号      学 号       姓名    成绩\n") ;
for(p=L->next;p;p=p->next)
printf("%d     %s  %s  %.3lf\n",cnt++,p->num,p->name,p->score);
return OK;
}
status ListInsert(int pos,LNode *temp){  // 插入 一个学生信息
int cnt=0;
LNode *p,*q;
for(p=L;p;p=p->next){
if(cnt==pos-1) break;
cnt++;
}
if(!p) return ERROR;
temp->next=p->next;
p->next=temp;
L->score+=1;
return OK;
}
// 下面两个删除函数 是用了函数重载,函数名相同,传进来的参数不同,会走不同的函数。
status ListDelete(int pos){  //按照序号删除学生
int cnt=0;
LNode *p,*q;
for(p=L;p;p=p->next){
if(cnt==pos-1) break;
cnt++;
}
if(!p) return ERROR;
q=p->next;
p->next=q->next;
L->score-=1;
return OK;
}
status ListDelete(char *str,int kind){  // kind =1 按照姓名来删除,kind=2按照学号来删除
LNode *p,*q;
for(p=L;p;q=p,p=p->next){
if(strcmp(p->name,str)==0&&kind==1) break;
if(strcmp(p->num,str)==0&&kind==2) break;
}
if(!p) return ERROR;
q->next=p->next;
L->score-=1;
return OK;
}
LNode *ListSearch(int pos){//  按照序号查找学生
LNode *p;int cnt=0;
for(p=L->next;p;p=p->next){
cnt++;
if(cnt==pos) break;
}
return p;
}
LNode *ListSearch(char *str,int &pos,int kind){ // kind =1 按照姓名来查找,kind=2按照学号来查找
LNode *p; pos=0;
for(p=L->next;p;p=p->next){
pos++;
if(strcmp(p->name,str)==0&&kind==1) break;
if(strcmp(p->num,str)==0&&kind==2)  break;
}
return p;
}
}List;

int main(){
List stu;
puts("       欢迎使用本管理系统!");
printf("请输入学生人数:");
int n;scanf
12f05
("%d",&n);
puts("请按照格式依次输入学生的信息(    学 号       姓名    成绩):");
stu.CreatList(n);
puts("*****学生信息录入成功*****");
int NoEnd=1;
while(NoEnd){
puts("\n        *********管理菜单***********    "  );
puts("A:当前管理的学生人数。       B:显示当前管理的所有学生的信息。");
puts("C:插入某学生信息。           D:删除某学生信息。");
puts("E:查找某位学生的信息。       Q:退出。") ;
char op[5]; scanf("%s",op);
switch(op[0]){
case 'A':{
printf("当前管理的学生人数为 %d。\n",stu.GetLength());
break;
}
case 'B':{
status t=stu.TraverseList();
if(t==ERROR) puts("*****当前没有存储学生信息*****");
break;
}
case 'C':{
int pos; LNode *t=new LNode;
printf("请输入将要插入的位置序号:");scanf("%d",&pos);
if(stu.GetLength()!=0&&pos>stu.GetLength())  puts("*****您输入的序号有误*****");
else {
puts("请输入插入学生的信息:") ;
printf("学号:");scanf("%s",t->num);
printf("姓名:");scanf("%s",t->name);
printf("成绩:");scanf("%lf",&t->score);
status tt=stu.ListInsert(pos,t);
puts("****插入成功****") ;
}
break;
}
case 'D':{
if(stu.GetLength()==0) {
puts("*****当前没有存储学生信息,无法删除*****");
break;
}
int NotEnd=1;
while(NotEnd){
NotEnd=0; char pp[5];
puts("请选择删除的方式:") ;
printf("A :按照学生序号进行删除   B:按照学生姓名进行删除\n");
printf("C :按照学生学号进行删除   D:返回主菜单\n");scanf("%s",pp);
if(pp[0]=='A') {
int pos;
printf("请输入将要删除的学生的序号:"); scanf("%d",&pos);
if(pos<1||pos>stu.GetLength())  puts("*****您输入的序号有误*****");
else {
stu.ListDelete(pos);
puts("****删除成功****");
}
}else if(pp[0]=='B'){
char name[25];
printf("请输入将要删除的学生的姓名:"); scanf("%s",name);
status t=stu.ListDelete(name,1);
if(!t) puts("*****您输入的姓名有误,无法删除*****");
else  puts("****删除成功****");
}else if(pp[0]=='C'){
char num[25];
printf("请输入将要删除的学生的学号:"); scanf("%s",num);
status t=stu.ListDelete(num,2);
if(!t) puts("*****您输入的学号有误,无法删除*****");
else  puts("****删除成功****");
}else if(pp[0]=='D')  continue;
else {
NotEnd=1;
puts("****请输入正确的操作命令****");
}
}
break;
}
case 'E':{
if(stu.GetLength()==0) {
puts("*****当前没有存储学生信息,无法查询*****");
break;
}
int NotEnd=1;
while(NotEnd){
NotEnd=0;
char pp[5];
puts("请选择查找的方式:") ;
printf("A:按照学生序号进行查找   B:按照学生姓名进行查找\n");
printf("C:按照学生学号进行查找   D:返回主菜单\n");
scanf("%s",pp);
if(pp[0]=='A') {
int pos;
printf("请输入将要查找的学生的序号:"); scanf("%d",&pos);
if(pos<1||pos>stu.GetLength())  puts("*****您输入的序号有误*****");
else {
LNode *t=stu.ListSearch(pos);
puts("查到的信息为:") ;
printf("序号      学 号       姓名    成绩\n") ;
printf("%d     %s  %s  %.3lf\n",pos,t->num,t->name,t->score);
}
}else if(pp[0]=='B'){
char name[25];  int pos;
printf("请输入将要查找的学生的姓名:"); scanf("%s",name);
LNode *t=stu.ListSearch(name,pos,1);
if(!t) puts("*****您输入的姓名有误,无法查到*****");
else {
puts("查到的信息为:") ;
printf("序号      学 号       姓名    成绩\n") ;
printf("%d     %s  %s  %.3lf\n",pos,t->num,t->name,t->score);
}
}else if(pp[0]=='C'){
char num[25]; int pos;
printf("请输入将要查找的学生的学号:"); scanf("%s",num);
LNode *t=stu.ListSearch(num,pos,2);
if(!t) puts("*****您输入的学号有误,无法查到*****");
else {
puts("查到的信息为:") ;
printf("序号      学 号       姓名    成绩\n") ;
printf("%d     %s  %s  %.3lf\n",pos,t->num,t->name,t->score);
}
}else if(pp[0]=='D') continue;
else {
NotEnd=1;
puts("****请输入正确的操作命令****");
}
}
break;
}
case 'Q':{
NoEnd=0;
break;
}
default :{
puts("*****您输入的信操作有误,请输入A-E或Q字符来确定您的操作*****");
break;
}
}
}
puts("Bye Bye~ 欢迎下次使用!");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: