lvboluo 2021-11-24 13:33 采纳率: 100%
浏览 111
已结题

c++链表学生信息管理系统

问题遇到的现象和发生背景
问题相关代码,请勿粘贴截图
运行结果及报错内容
我的解答思路和尝试过的方法
我想要达到的结果
//#include <iostream>
//
//int main() {
//    std::cout << "Hello, World!" << std::endl;
//    return 0;
//}
#include<iostream>
#include<string>
#include<string.h>
#include<stdio.h>
#include<stdlib.h>

using namespace std;
int k=1;

typedef struct {
    string name = {};
    string no;//学号
    string xb;
    int age;
    long long birth;//出生年月
    string add;//地址
    long long phone;//电话
    string email;//电子邮箱
} student;

typedef struct lnode {//链表的定义
    student data; //存放学生信息的数据域
    struct lnode *next = 0;// 指向下个学生信息的指针域
} lnode, *linklist;

void initlist(linklist &l) {//初始化链表
    l = new lnode;
    l->next = NULL;
}

void help() {    //帮助
    printf("\n                             0.欢迎使用系统帮助!\n");
    printf("\n                             1.初次进入系统后,请先选择增加学生信息;\n");
    printf("\n                             2.按照菜单提示键入数字代号;\n");
    printf("\n                             3.增加学生信息后,切记保存;\n");
    printf("\n                             4.谢谢您的使用!\n");
    system("pause");
    system("cls");
}


void sort(linklist &l)//对学号排序
{
    lnode *p, *k;
    p = l->next;
    string s1;
    int a;
    long long b;
    while(p){
        k=p;
        while (k->next != NULL) {
            k = k->next;
            if (p->data.no > k->data.no) {
                s1 = p->data.name;
                p->data.name = k->data.name;
                k->data.name = s1;
                s1 = p->data.no;
                p->data.no = k->data.no;
                k->data.no = s1;
                s1 = p->data.xb;
                p->data.xb = k->data.xb;
                k->data.xb = s1;
                a = p->data.age;
                p->data.age = k->data.age;
                k->data.age = a;
                b = p->data.birth;
                p->data.birth = k->data.birth;
                k->data.birth = b;
                b = p->data.phone;
                p->data.phone = k->data.phone;
                k->data.phone = b;
                s1 = p->data.add;
                p->data.add = k->data.add;
                k->data.add = s1;
                s1 = p->data.email;
                p->data.email = k->data.email;
                k->data.email = s1;
            }
        }
        p = p->next;
    }
}

//void creatllist(linklist &l){
//    lnode *p,*r;
//    r=l;
//    p->next=NULL;
//    r->next=p;
//    r=p;
//}

int totallist(linklist &l){//学生总数
    lnode *p;
    p=l->next;
    int i=0;
    while(p){
        i++;
        p=p->next;
    }
    return i;
}

void insertlist(linklist &l){//指定位置插入学生信息
    int length=totallist(l),n;
    lnode *p;
    p=l;
    int j=0;
    while(p&&j<length){
        p=p->next;
        j++;
    }
    if(p){
        cout<<"请输入增加学生个数:"<<endl;
        cin>>n;
        for (int i = 0; i < n; i++) {
            p=p->next;
            cout << "请输入第" << i + 1 << "个学生的学号" << endl;
            cin >> p->data.no;
            cout << "请输入第" << i + 1 << "个学生的姓名" << endl;
            cin >> p->data.name;
            cout << "请输入第" << i + 1 << "个学生的年龄" << endl;
            cin >> p->data.age;
            cout << "请输入第" << i + 1 << "个学生的性别" << endl;
            cin >> p->data.xb;
            cout << "请输入第" << i + 1 << "个学生的出生年月" << endl;
            cin >> p->data.birth;
            cout << "请输入第" << i + 1 << "个学生的地址" << endl;
            cin >> p->data.add;
            cout << "请输入第" << i + 1 << "个学生的电话" << endl;
            cin >> p->data.phone;
            cout << "请输入第" << i + 1 << "个学生的email" << endl;
            cin >> p->data.email;
        }
        p->next=NULL;
    }
    else
        cout<<"插入失败"<<endl;
    sort(l);
}


/*
void insert(linklist &l) {//输入
    lnode *p;
    r = l;
    int n;
    cout<<"请输入增加学生个数:"<<endl;
    cin>>n;
    for (int i = 0; i < n; i++) {
        p = new lnode;
        cout << "请输入第" << i + 1 << "个学生的学号" << endl;
        cin >> p->data.no;
        cout << "请输入第" << i + 1 << "个学生的姓名" << endl;
        cin >> p->data.name;
        cout << "请输入第" << i + 1 << "个学生的年龄" << endl;
        cin >> p->data.age;
        cout << "请输入第" << i + 1 << "个学生的性别" << endl;
        cin >> p->data.xb;
        cout << "请输入第" << i + 1 << "个学生的出生年月" << endl;
        cin >> p->data.birth;
        cout << "请输入第" << i + 1 << "个学生的地址" << endl;
        cin >> p->data.add;
        cout << "请输入第" << i + 1 << "个学生的电话" << endl;
        cin >> p->data.phone;
        cout << "请输入第" << i + 1 << "个学生的email" << endl;
        cin >> p->data.email;
        p->next = NULL;
        r->next = p;
        r = p;
    }
    sort(l);
}
 */
void refresh() {    //刷新界面
    printf("                             刷新完毕!!!");
    system("pause");
    system("cls");
}


void showlist(linklist &l){//展示所有学生信息
    lnode *p;
    p=l->next;
    int j=1;
    while(p){
        cout<<"第"<<j<<"个学生的姓名为:"<<p->data.name;
        cout<<"\n学号为:"<<p->data.no;
        cout<<"\n性别为:"<<p->data.xb;
        cout<<"\n年龄为:"<<p->data.age;
        cout<<"\n出生年月为:"<<p->data.birth;
        cout<<"\n地址为:"<<p->data.add;
        cout<<"\n电话为:"<<p->data.phone;
        cout<<"\n电子邮箱为:"<<p->data.email;
        j++;
        p=p->next;
    }
}


void findlist_name(linklist &l){//根据学生姓名查找
    lnode *p;
    p=l->next;
    cout<<"请输入你想要查询学生的姓名:"<<endl;
    string name;
    cin>>name;
    while(p&&p->data.name!=name){
        p=p->next;
    }
    if(p){
        cout<<"此学生姓名为:"<<p->data.name;
        cout<<"\n学号为:"<<p->data.no;
        cout<<"\n性别为:"<<p->data.xb;
        cout<<"\n年龄为:"<<p->data.age;
        cout<<"\n出生年月为:"<<p->data.birth;
        cout<<"\n地址为:"<<p->data.add;
        cout<<"\n电话为:"<<p->data.phone;
        cout<<"\n电子邮箱为:"<<p->data.email;
    }
    if(!p)
        cout<<"查无此人"<<endl;
}

void findlist_no(linklist &l){//根据学生学号查找
    lnode *p;
    p=l->next;
    cout<<"请输入你想要查询学生的学号:"<<endl;
    string no;
    cin>>no;
    while(p&&p->data.no!=no){
        p=p->next;
    }
    if(p){
        cout<<"此学生姓名为:"<<p->data.name;
        cout<<"\n学号为:"<<p->data.no;
        cout<<"\n性别为:"<<p->data.xb;
        cout<<"\n年龄为:"<<p->data.age;
        cout<<"\n出生年月为:"<<p->data.birth;
        cout<<"\n地址为:"<<p->data.add;
        cout<<"\n电话为:"<<p->data.phone;
        cout<<"\n电子邮箱为:"<<p->data.email;
    }
    if(!p)
        cout<<"查无此人"<<endl;
}


void sortsex(linklist &l) {//根据学生性别分类排序
    lnode *p;
    p = l->next;
    int j;
    while (p) {
        j = 1;
        if (p->data.xb == "男") {
            cout << "第" << j << "个男性学生的姓名为:" << p->data.name;
            cout << "\n学号为:" << p->data.no;
            cout << "\n性别为:" << p->data.xb;
            cout << "\n年龄为:" << p->data.age;
            cout << "\n出生年月为:" << p->data.birth;
            cout << "\n地址为:" << p->data.add;
            cout << "\n电话为:" << p->data.phone;
            cout << "\n电子邮箱为:" << p->data.email;
            j++;
            p = p->next;
        }
        while (p) {
            j = 1;
            if (p->data.xb == "女") {
                cout << "第" << j << "个女性学生的姓名为:" << p->data.name;
                cout << "\n学号为:" << p->data.no;
                cout << "\n性别为:" << p->data.xb;
                cout << "\n年龄为:" << p->data.age;
                cout << "\n出生年月为:" << p->data.birth;
                cout << "\n地址为:" << p->data.add;
                cout << "\n电话为:" << p->data.phone;
                cout << "\n电子邮箱为:" << p->data.email;
                j++;
                p = p->next;
            }
        }
    }
}


void sortage(linklist &l){//根据学生年龄分类统计
    int ag[100]={0};
    lnode *p;
    p=l->next;
    while(p){
        ag[p->data.age]++;
        p=p->next;
    }
    for(int age=1; age<100; age++){
        p=l->next;
        int j=1;
        while(p){
            if(ag[age]!=0){
                p=p->next;
                cout << "第" << j << "个年龄为ag[age]的学生的姓名为:" << p->data.name;
                cout << "\n学号为:" << p->data.no;
                cout << "\n性别为:" << p->data.xb;
                cout << "\n年龄为:" << p->data.age;
                cout << "\n出生年月为:" << p->data.birth;
                cout << "\n地址为:" << p->data.add;
                cout << "\n电话为:" << p->data.phone;
                cout << "\n电子邮箱为:" << p->data.email;
                j++;
            }
        }
    }
}

void modify(linklist &l) {    //修改信息
    lnode *p;
    p=l->next;
    int item,num=0;
    string name = {};
    string no{};//学号
    string xb;
    int age;
    long long birth;//出生年月
    string add;//地址
    long long phone;//电话
    string email;//电子邮箱
    printf("请输入要修改的学生的学号:\n");
    cin>>no;
    while(p) {
        if(p->data.no==no) {     //比较字符串是否相等
            num=1;
            break;
        }
        p=p->next;
    }
    if(num) {
        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("                             ----------------------------\n");
        while(1) {
            printf("                             请选择子菜单编号:");
            scanf("%d",&item);
            switch(item) {
                case 1:
                    printf("                             请输入新的姓名:\n");
                    cin>>name;
                    p->data.name=name;
                    break;
                case 2:
                    printf("                             请输入新的年龄:\n");
                    cin>>age;
                    p->data.age=age;
                    break;
                case 3:
                    printf("                             请输入新的性别:\n");
                    cin>>xb;
                    p->data.xb=xb;
                case 4:
                    printf("                             请输入新的生日:\n");
                    cin>>birth;
                    p->data.birth=birth;
                    break;
                case 5:
                    printf("                             请输入新的地址:\n");
                    cin>>add;
                    p->data.add=add;
                    break;
                case 6:
                    printf("                             请输入新的电话:\n");
                    cin>>phone;
                    p->data.phone=phone;
                    break;
                case 7:
                    printf("                             请输入新的邮箱:\n");
                    cin>>email;
                    p->data.email=email;
                    break;
                case 8:
                    system("cls");
                    return;
                default:
                    printf("                             请在1-8之间选择\n");
            }
        }
    } else {
        printf("                             该学生不存在,请重新输入:\n");
    }
}



void deletelist(linklist &l){//删除某学生信息
    string s1;
    cout<<"请输入你想删除学生的姓名:"<<endl;
    cin>>s1;
    lnode *p,*q;
    p=l;
    while(p->next!=NULL){
        q=p->next;
        if(q->data.no==s1){
            if(q->next!=NULL){
                p->next = q->next;
                delete q;
            }
            else{
                delete q;
                p->next = NULL;
            }
        }
    }
    sort(l);
    cout<<"查无此人"<<endl;
}

void  preserve(linklist &l) {    //将学生信息保存到文件中
    FILE * fpreserve;
    char ch='\n';
    lnode *p;
    p=l->next;
}
/*
   void writeFile(LinkList head) {
       FILE *outf;
       pNode p = head->next;
       if((outf = fopen("data.txt","wt")) == NULL) {
           printf("不能打开数据文件。\n");
           exit(1);
       }
       while(p) {
           fwrite(p,sizeof(Node),1,outf);
           p = p->next;
       }
       fclose(outf);
   }
   
   int i;
   fpreserve=fopen("StudentInformation.txt","wt+");
   fprintf(fpreserve,"学生学号         学生姓名 年龄  性别  出生年月    地址             手机号码    email %c",ch);
   for(i=0; i<n; i++) {
       fprintf(fpreserve,"%6s %7s %6d %6s %6s %6s %6s %6s %c",stu[i].code,stu[i].name,stu[i].age,stu[i].sex,stu[i].chushen,stu[i].dizhi,stu[i].phone,stu[i].email,ch);
   }
   system("cls");
   printf("      \n\n\n\n\n\n\n\n\n\n\n                                                     保存完毕!!!\n");
       system("pause");
       system("cls");
   fclose(fpreserve);
}
*/

void menu(linklist &l) {    //学生信息管理系统界面
    int num;
    printf(" \n\n                    \n\n");
    system("cls");
    printf("                               ******************************************************\n\n");
    printf("                               *                学生信息管理系统                    *\n \n");
    printf("                               ******************************************************\n\n");
    printf("                             *********************系统功能菜单*************************       \n");
    printf("                                  ----------------------   ----------------------   \n");
    printf("                                  *********************************************     \n");
    printf("                                  * 0.系统帮助及说明  * *  1.刷新学生信息   *     \n");
    printf("                                  *********************************************     \n");
    printf("                                  * 2.查询学生信息    * *  3.修改学生信息   *     \n");
    printf("                                  *********************************************     \n");
    printf("                                  * 4.增加学生信息    * *  5.按学号删除信息 *     \n");
    printf("                                  *********************************************     \n");
    printf("                                  * 6.显示当前信息    * *  7.保存当前学生信息*     \n");
    printf("                                  ********************** **********************     \n");
    printf("                                  * 8.排序分类信息    * *  9.退出系统        *                   \n");
    printf("                                  ********************** **********************             \n");
    printf("                                  ----------------------   ----------------------                           \n");
    printf("                             请选择菜单编号:");
    scanf("%d",&num);
    switch(num) {
        case 0:
            system("cls");
            help();
            break;
        case 1:
            system("cls");
            refresh();
            break;
        case 2:
            int i;
            system("cls");
            printf("\n\n\n\n\n\n\n\n\n\n");
            printf("                                   ----------------------\n");
            printf("                                   -----1.按学号查询-----\n");
            printf("                                   -----2.按姓名查询-----\n");
            printf("                                   -----3.退出本菜单-----\n");
            printf("                                   ----------------------\n");
            cin>>i;
            switch (i) {
                case 1:
                    findlist_no(l);break;
                    break;
                case 2:
                    findlist_name(l);break;
                case 3:
                    system("cls");
                    return;
            }
            break;
        case 3:
            system("cls");
            modify(l);
            break;
        case 4:
            system("cls");
            insertlist(l);
            break;
        case 5:
            system("cls");
            deletelist(l);
            break;
        case 6:
            system("cls");
            showlist(l);
            break;
//        case 7:
//            system("cls");
//            preserve();
//            break;
        case 8:
            system("cls");
            printf("                      -------------------------------------------------------------------------------------\n");
            printf("                             ------------------------1.按性别分类排序-----------------------\n");
            printf("                             ------------------------2.按年龄分类统计-----------------------\n");
            printf("                             ------------------------3.退出本菜单    -----------------------\n");
            printf("                      -------------------------------------------------------------------------------------\n");
            cin>>i;
            switch (i) {
                case 1:
                    sortsex(l);break;
                    break;
                case 2:
                    sortage(l);break;
                case 3:
                    system("cls");
                    return;
            }
            break;
        case 9:
            system("cls");
            k=0;
            break;
        default:
            printf("                             请在0-9之间选择\n");
    }
}


int main(){
    linklist l;
    initlist(l);
    //creatllist(l);
    while(k){
        menu(l);
    }
    system("pause");
    return 0;
}


img

这个程序总报错 不知道什么问题555 明天就要答辩了 哥快帮我看眼 随便指点一下也行 我是真看不出来哪里有问题orz orz orz orz

  • 写回答

1条回答 默认 最新

  • orange4reg 2021-11-24 14:47
    关注

    插入都不新建节点,没得救了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 12月2日
  • 已采纳回答 11月24日
  • 创建了问题 11月24日

悬赏问题

  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误