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

记录一下,数据结构的作业。
系统的功能菜单
这里写图片描述
如果有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("%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;
}
  • 7
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值