urbbrgrougai
德布罗意的波
采纳率100%
2019-06-04 13:01

C语言链表实现学生信息统计(只写了三个功能 输入 删除 输出)

5
已采纳

第一个问题 输出的第一组数据的第一个学期不输出

//#include
#include<string.h>
#include<stdlib.h>
//#include
using namespace std;
#define MAX 200 //宏定义,修改数值可以改变程序所包含的最大文件个数
#define LEN sizeof(struct student)
int n;
int count=0;
struct student
{
    char xueqi[20]; //学期
    int no; //学号
    int clas; //班级
    char name[50]; //姓名
    int chi; //语文成绩
    int math; //数学成绩
    int eng; //英语成绩
    int com; //计算机成绩
    int PE; //体育成绩
    int sum;
    int aver;
    struct student *next;
};
struct student *head=NULL;
void menu();
void menu2();
struct student * Insert (struct student *st);
void add();
void to_menu();
void to_menu2();
struct student * Delete(int no);
//void save_data();
//void read_data();
void view_data();
void delete_data();
//void edit_data();
//void query_data_no();
//void tongji1();
//void tongji2();
//void tongji3();
//void tongji4();
//void query_data_tongji();
int main() //主函数
{
    int fun;
    // read_data();
    menu();
    while(1)
    {
        system("color fc"); //编辑菜单及字体颜色
        printf("请输入功能号[0-6]:",&fun);
        scanf("%d",&fun);
        switch(fun)
        {
            case 0: // 退 出
                break;
            case 1: //按班级输出学生成绩
                view_data();
                break;
            case 2: //输入学生记录
                add();
                break;
            case 3: //删除学生记录
                delete_data();
                // break;
                // case 4: //编辑学生记录
                // edit_data();
                // break;
                // case 5: //查询学生记录
                // query_data_no();
                // break;
                // case 6: //统计系统
                // query_data_tongji();
                // break;
        }
        if(fun==0) break;
        to_menu();
    }
}

void add() //添加学生信息
{
    int b,k;
    while(1)
    {
        struct student *st;
        st= (struct student *)malloc(sizeof(struct student));
        k=count;
        printf("\n请输入学生信息:");
        printf("\n学期");
        printf("\n-------------------------------------------------------------\n");
        getchar();
        gets(st->xueqi);
        printf("\n学号");
        printf("\n-------------------------------------------------------------\n");
        scanf("%d",&st->no);
        printf("\n班级");
        printf("\n-------------------------------------------------------------\n");
        scanf("%d",&st->clas);
        printf("\n姓名");
        printf("\n-------------------------------------------------------------\n");
        getchar();
        gets(st->name);
        printf("\n语文");
        printf("\n-------------------------------------------------------------\n");
        scanf("%d",&st->chi);
        printf("\n数学");
        printf("\n-------------------------------------------------------------\n");
        scanf("%d",&st->math);
        printf("\n英语");
        printf("\n-------------------------------------------------------------\n");
        scanf("%d",&st->eng);
        printf("\n计算机");
        printf("\n-------------------------------------------------------------\n");
        scanf("%d",&st->com);
        printf("\n体育");
        printf("\n-------------------------------------------------------------\n");
        scanf("%d",&st->PE);
        st->sum=st->chi+st->math+st->eng+st->com+st->PE;
        st->aver=st->sum/5;
        count++;
        head=Insert(st);
        free(st);
        printf("\n\n继续添加学生信息[1-yes 0-no]:");
        scanf("%d",&b);
        if(b==0)
            break;
    }
    // save_data();
}
struct student * Insert (struct student *stud) {
    //原链表按num从小到大排列,参数stud是要插入结点
    struct student *p0; // 待插入结点
    struct student *p1; // p0插入p1之前、p2之后
    struct student *p2;
    p1 = head;
    p0 = stud;
    if ( head == NULL ){//第一种情况,链表为空
        head = p0;//p0成为链表中第一结点
        p0->next = NULL;
    }else {
        while ((p0->no > p1->no) && (p1->next != NULL)) {//查找待插入位置
            p2 = p1;
            p1 = p1->next;
        }
        if(p0->no <= p1->no) {//表示是从(p0->num > p1->num) 条件跳出循环

            if (p1 == head) { //如果p1是表头结点,向第一结点之前插入
                head = p0;
                p0->next = p1;
            } else{//向p1之前、p2之后插入
                p2->next = p0;
                p0->next = p1;
            }
        } else { //表示从 (p1->next != NULL)条件跳出循环,p0插入表尾结点之后
            p1->next = p0;
            p0->next = NULL;
        }
    }
    return (head);
}
void menu() //输出主菜单函数
{
    system("cls"); //清空屏幕函数
    printf("\n");
    printf("\t\t\t*******************************\n");
    printf("\t\t\t* \n");
    printf("\t\t\t 学生成绩管理系统 \n");
    printf("\t\t\t \n");
    printf("\t\t\t [0] 退出 \n");
    printf("\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 \n");
    printf("\t\t\t*******************************\n");
}
void menu2() //输出统计系统菜单
{
    system("cls"); //清空屏幕函数
    printf("\n");
    printf("\t\t\t********************************\n");
    printf("\t\t\t* \n");
    printf("\t\t\t 统计系统 \n");
    printf("\t\t\t \n");
    printf("\t\t\t [0] 退出 \n");
    printf("\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 \n");
    printf("\t\t\t*******************************\n");
}
void to_menu() //to_menu函数
{
    char c1,c2;
    printf("\n\n\n按回车键返回主菜单...");
    scanf("%c%c",&c1,&c2);
    menu(); //调用menu函数
}
void to_menu2() //to_menu函数
{
    char c1,c2;
    printf("\n\n\n按回车键返回上一菜单...");
    scanf("%c%c",&c1,&c2);
    menu2(); //调用menu函数
}
void view_data()
{
    if(head==NULL)
        return;
    struct student *p=head;
    printf("学期\t学号\t\t班级\t\t姓名\t\t语文\t数学\t英语\t计算机\t体育\t总分\t平均分");
    printf("\n-----------------------------------------------------------------------------------------------------------------\n");
    do{printf("%s\t\t%d\t%-15d%s\t\t%-8d%-8d%-8d%-8d%-8d%-8d%-8d\n",p->xueqi,p->no,p->clas,p->name,p->chi,p->math,p->eng,p->com,p->PE,p->sum,p->aver);
        p=p -> next;
    }while(p!=NULL);
}
struct student * Delete(int no)
{//删除值为num的结点
    int sb=0;
    struct student *p1; // 指向要删除的结点
    struct student *p2; //指向p1的前一个结点
    if (head == NULL) { //空表
        return (head);
    }
    p1 = head;
    while(no!= p1->no && p1->next != NULL)
    { //查找要删除的结点
        p2 = p1;
        p1 = p1->next;
    }
    if (no == p1->no)
    {
        printf("\n\n删除(学号-%d)成功!",no);
        sb=1;// 找到了
        if (p1 == head) //要删除的是头结点
            head = p1->next;
        else// 要删除的不是头结点
            p2->next = p1->next;
        // free(p1); //释放被删除结点所占的内存空间
    }
    if(sb==0)
        printf("\n\n删除(学号-%d)成功!",no);
    return (head); //返回新的表头
}
void delete_data() //删除学生记录
{
    int j;
    int no;
    j=count;
    view_data();
    printf("\n请输入要删除学生的学号:");
    scanf("%d",&no);
    head=Delete(no);
    // save_data();
}


图片说明

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

4条回答

  • urbbrgrougai 德布罗意的波 2年前

    问题没有解决 自己重写了一份 自问自答

    点赞 评论 复制链接分享
  • qtchen_1988 qtchen_1988 2年前

    图片说明

    把 getchar(); 改成 fflush(stdin);

    点赞 评论 复制链接分享
  • liujianchen_linux Next66 2年前

    图片说明

    点赞 评论 复制链接分享
  • caozhy 回答这么多问题就耍赖把我的积分一笔勾销了 2年前

    什么叫乱七八糟,是中文乱码,还是包含一些特殊字符,包含特殊字符往往是字符串数组长度不足越界、缺少\0结束符导致。哪里不对,你的输入是什么,先给出来

    点赞 1 评论 复制链接分享