期末查分系统(c,链表实现)

主要功能:

分为三个身份:

学生:可以通过学号查询个人分数

老师:可以看所有学生成绩,单科排名(正序,倒序),统计绩点,查看绩点排名前百分之n的学生

管理员端:可以创建链表,添加修改删除学生数据,并保存数据

学生,老师,管理员密码都为123456

效果图:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
头插法:36h
登录:91h-
添加学生信息:295h
教师查看学生信息:208h
学生查询成绩:按照要求记录所要的学生信息243h,打印查询到的学生成绩230h
删除学生信息:315h
排序:335h
修改学生信息:527h
绩点:计算绩点,622h:输出需要的前百分之n 的学生绩点,606h

*/
typedef struct student {
    char sno[20];
    char sname[50];
    char sex[50];
    double math;
    double english;
    double cs;
    double score;
    struct student* next;
} Stu;

//头插法
Stu* creatCHead(FILE* fp) {
    Stu* p, * L;
    int w;
    //链表的处理
    L = (Stu*)malloc(sizeof(Stu));
    L->next = NULL;
    fseek(fp, 0, 2);
    w = ftell(fp);
    rewind(fp);
    //不断地读取数据
    while (w != ftell(fp))//读取txt
    {
        p = (Stu*)malloc(sizeof(Stu));
        fread(p, sizeof(Stu), 1, fp);
        p->next = L->next;
        L->next = p;
    }
    return L;
}
typedef struct teacher {
    int sno;
    char sex;
    char name[15];
    char subject;
    struct teacher* next;
} Tea;

//尾插法
Stu* createtail(FILE* fp) {
    Stu* p, * L, * r;
    int w;
    L = (Stu*)malloc(sizeof(Stu));
    r = L;
    r->next = NULL;
    fseek(fp, 0, 2);
    w = ftell(fp);
    rewind(fp);
    while (w != ftell(fp))//读取txt
    {
        p = (Stu*)malloc(sizeof(Stu));
        fread(p, sizeof(Stu), 1, fp);
        p->next = NULL;
        r->next = p;
        r = p;
    }
    r->next = NULL;
    return L;
}

void showinfo(char info[])//成功信息
{
    printf(info);
    printf("\n");
}

void showerror(char errorinfo[])//失败信息
{
    printf(errorinfo);
    printf("\n");
}

int stuLogin() {
    char user[50], password[50];
    printf("请输入学号和学生登录密码:\n");
    printf("学号:");
    scanf("%s", &user);
    printf("密码:");
    scanf("%s", &password);
    if (strcmp(password, "123456") == 0) {
        printf("登陆成功!\n");
        return 1;
    }
    else {
        printf("登录失败!\n");
        return 0;
    }
}

int teaLogin() {
    char user[50], password[50];
    printf("请输入教师登录密码:\n");
    printf("登录密码:");
    scanf("%s", &password);
    if (strcmp(password, "123456") == 0) {
        printf("登陆成功!\n");
        return 1;
    }
    else {
        printf("登录失败!\n");
        return 0;
    }
}

int adminLogin() {
    char user[50], password[50];
    printf("请输入管理员登录密码:");
    scanf("%s", &password);
    if (strcmp(password, "123456") == 0) {
        printf("登陆成功!\n");
        return 1;
    }
    else {
        printf("登录失败!\n");
        return 0;
    }
}

void ShowFirstMenu() {
    printf("*********************欢迎使用期末查分系统********************\n");
    printf("╔═══════════════════════════════════╗\n");
    printf("║        请选择您需要的选项         ║\n");
    printf("╠═══════════════════════════════════╣\n");
    printf("║ 1. 学生端                         ║\n");
    printf("║ 2. 教师端                         ║\n");
    printf("║ 3. 管理员端                       ║\n");
    printf("║ 4. 退出系统                       ║\n");
    printf("╚═══════════════════════════════════╝\n");
}

void showstudentMeun()//学生页面
{
    printf("\n\n\n\n\n");
    printf("\t\t|---------------------STUDENT-------------------|\n");
    printf("\t\t|\t 0. 退出                                |\n");
    printf("\t\t|\t 1. 查询学生成绩                        |\n");
    printf("\t\t|-----------------------------------------------|\n\n");
    printf("\t\t\t选择(0或1):");
}

void showteacherMeun()//教师页面
{
    printf("\n\n\n\n\n");
    printf("\t\t|---------------------TEACHER-------------------|\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|-----------------------------------------------|\n\n");
    printf("\t\t\t选择(0-3):");
}

void showadminMeun()//管理员页面
{
    printf("\n\n\n\n\n");
    printf("\t\t|---------------------ADMIN---------------------|\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|-----------------------------------------------|\n\n");
    printf("\t\t\t选择(0-5):");
    printf("输入你想要的操作的序号:\n");
}


Stu* InputStudent(FILE* fp)//录入学生信息
{
    int num, i;
    Stu* L = NULL;
    Stu* p = NULL;
    printf("请输入需要录入的学生人数:");
    scanf("%d", &num);
    printf("请输入学生信息:\n");
    printf("学号  姓名  性别  英语 数学 专业课\n");
    for (i = 0; i < num; i++) {
        printf("请输入第%d个数据\n", i + 1);
        p = (Stu*)malloc(sizeof(Stu));
        scanf("%s %s %s %lf %lf %lf", p->sno, p->sname, p->sex, &p->math, &p->english, &p->cs);
        fwrite(p, sizeof(Stu), 1, fp);
        p->next = L;
        L = p;
    }
    printf("学生数据录入成功!\n");
    return L;
}

void Showstudent(Stu* L)//展示学生数据
{
    printf("学号   姓名     性别    数学成绩     英语成绩     专业课成绩    \n");
    Stu* p = L->next;
    while (p)//直到下一个数据为空值,否则一直打印
    {
        printf("%s   %s    %s    %.2lf     %.2lf     %.2lf\n", p->sno, p->sname, p->sex, p->math, p->english, p->cs);
        p = p->next;
    }
}

void Showteacher(Tea* L)//展示教师数据
{
    printf("工号    姓名     性别    教授科目\n");
    Tea* p = L->next;
    while (p)//直到下一个数据为空值,否则一直打印
    {
        printf("%d    %s     %s    %s\n", p->sno, p->name, p->sex, p->subject);
        p = p->next;
    }
}

void SearchstudentList(Stu* L, int* cnt)//查询学生信息结果
{
    printf("学号   姓名     性别    数学成绩     英语成绩     专业课成绩    \n");
    Stu* p = L;
    while (p && *cnt)//直到下一个数据为空值,否则一直查找
    {
        printf("%s   %s   %s    %.2lf     %.2lf     %.2lf\n", p->sno, p->sname, p->sex, p->math, p->english, p->cs);
        --* cnt;
        p = p->next;
    }
}

//查询学生数据
Stu* Searchstudent(Stu* L, int type, char keyval[], char keystr[], int* cnt) {
    Stu* p = L->next;
    Stu* ptr = (Stu*)malloc(sizeof(Stu)); // 创建新节点保存查询结果
    Stu* newstudent = ptr;
    int flag = 0;
    while (p != NULL) {
        if ((type == 1) && (strcmp(p->sno, keyval) == 0)) {
            newstudent->next = (Stu*)malloc(sizeof(Stu));
            newstudent = newstudent->next;
            strcpy(newstudent->sno, p->sno);
            strcpy(newstudent->sname, p->sname);
            strcpy(newstudent->sex, p->sex);
            newstudent->math = p->math;
            newstudent->english = p->english;
            newstudent->cs = p->cs;
            ++* cnt;
            flag = 1;
        }
        else if ((type == 2) && (strcmp(p->sname, keystr) == 0)) {
            newstudent->next = (Stu*)malloc(sizeof(Stu));
            newstudent = newstudent->next;
            strcpy(newstudent->sno, p->sno);
            strcpy(newstudent->sname, p->sname);
            strcpy(newstudent->sex, p->sex);
            newstudent->math = p->math;
            newstudent->english = p->english;
            newstudent->cs = p->cs;
            ++* cnt;
            flag = 1;
        }
        else if ((type == 3) && (strcmp(p->sex, keystr) == 0)) {
            newstudent->next = (Stu*)malloc(sizeof(Stu));
            newstudent = newstudent->next;
            strcpy(newstudent->sno, p->sno);
            strcpy(newstudent->sname, p->sname);
            strcpy(newstudent->sex, p->sex);
            newstudent->math = p->math;
            newstudent->english = p->english;
            newstudent->cs = p->cs;
            ++* cnt;
            flag = 1;
        }
        p = p->next;
    }
    if (flag == 0) {
        return NULL;
    }
    return ptr->next;
}

void Addstudent(Stu* L)//增添学生信息
{
    Stu* p, * r, * s = L;
    int num, i;
    while (s->next)
        s = s->next;
    r = s;
    printf("请输入要添加的学生的人数:");
    scanf("%d", &num);
    printf("学号  姓名  性别  英语 数学 专业课\n");
    for (i = 0; i < num; i++) {
        printf("请输入录入的第 %d 数据:\n", i + 1);
        p = (Stu*)malloc(sizeof(Stu));
        scanf("%s %s %s %lf %lf %lf", p->sno, p->sname, p->sex, &p->math, &p->english, &p->cs);
        r->next = p;
        r = p;
    }
    r->next = NULL;
}

int Deletestudent(Stu* L, char str[]) {
    Stu* p, * r;
    int flag = 0;
    p = L;
    while (p->next) {
        if (strcmp(p->next->sno, str) == 0) {
            flag = 1;
            break;
        }
        p = p->next;
    }
    if (flag) {
        r = p->next;
        p->next = r->next;
        free(r);
    }
    return flag;
}

//5.数学成绩排序
Stu* showMathorder(Stu* L, int n) {//数学成绩排序
    Stu* p = L->next, * p1;
    char sno[50];
    char sname[50];
    char sex[50];
    double math, english, cs;
    if (n == 1)
    {
        while (p)
        {
            p1 = p;
            while (p1->next)
            {
                if (p1->math > p1->next->math)
                {
                    math = p1->next->math;
                    cs = p1->next->cs;
                    strcpy(sname, p1->next->sname);
                    english = p1->next->english;
                    strcpy(sno, p1->next->sno);
                    strcpy(sex, p1->next->sex);

                    p1->next->math = p1->math;
                    p1->next->cs = p1->cs;
                    p1->next->english = p1->english;
                    strcpy(p1->next->sname, p1->sname);
                    strcpy(p1->next->sno, p1->sno);
                    strcpy(p1->next->sex, p1->sex);

                    p1->math = math;
                    p1->cs = cs;
                    p1->english = english;
                    strcpy(p1->sname, sname);
                    strcpy(p1->sno, sno);
                    strcpy(p1->sex, sex);
                }
                p1 = p1->next;
            }
            p = p->next;
        }
        return L;
    }
    else if (n == 2)
    {
        while (p)
        {
            p1 = p;
            while (p1->next)
            {
                if (p1->math < p1->next->math)
                {
                    math = p1->next->math;
                    cs = p1->next->cs;
                    strcpy(sname, p1->next->sname);
                    english = p1->next->english;
                    strcpy(sno, p1->next->sno);
                    strcpy(sex, p1->next->sex);

                    p1->next->math = p1->math;
                    p1->next->cs = p1->cs;
                    p1->next->english = p1->english;
                    strcpy(p1->next->sname, p1->sname);
                    strcpy(p1->next->sno, p1->sno);
                    strcpy(p1->next->sex, p1->sex);

                    p1->math = math;
                    p1->cs = cs;
                    p1->english = english;
                    strcpy(p1->sname, sname);
                    strcpy(p1->sno, sno);
                    strcpy(p1->sex, sex);
                }
                p1 = p1->next;
            }
            p = p->next;
        }
        return L;
    }
}
void showmathorder(Stu* L, int n) {
    int swapped;
    Stu* ptr1; 
    Stu* ptr2 = NULL; 
    Stu* prev = NULL; 

    // 检查链表是否为空或只有一个节点
    if (L == NULL || L->next == NULL)
        return;

    do {
        swapped = 0;
        ptr1 = L->next;

       
        while (ptr1->next != ptr2) {
            // 比较
            if ((n == 1 && ptr1->math > ptr1->next->math) || (n == 2 && ptr1->math < ptr1->next->math)) {
                // 交换节点数据
                Stu* temp = ptr1->next;
                ptr1->next = temp->next;
                temp->next = ptr1;

               
                if (ptr1 == L->next)
                    L->next = temp;
                else {
                    prev->next = temp;
                }
                ptr1 = temp;
                swapped = 1;
            }
            prev = ptr1; 
            ptr1 = ptr1->next;
        }
        ptr2 = ptr1; 
    } while (swapped);
}

void showenglishorder(Stu* L, int n) {
    int swapped;
    Stu* ptr1; 
    Stu* ptr2 = NULL;
    Stu* prev = NULL; 

    
    if (L == NULL || L->next == NULL)
        return;

    do {
        swapped = 0;
        ptr1 = L->next;

        
        while (ptr1->next != ptr2) {
            // 比较
            if ((n == 1 && ptr1->english > ptr1->next->english) || (n == 2 && ptr1->english < ptr1->next->english)) {
                // 交换节点数据
                Stu* temp = ptr1->next;
                ptr1->next = temp->next;
                temp->next = ptr1;

                // 更新头节点的位置
                if (ptr1 == L->next)
                    L->next = temp;
                else {
                    prev->next = temp;
                }
                ptr1 = temp;
                swapped = 1;
            }
            prev = ptr1; 
            ptr1 = ptr1->next;
        }
        ptr2 = ptr1; 
    } while (swapped);
}

void showcsorder(Stu* L, int n) {
    int swapped; 
    Stu* ptr1; 
    Stu* ptr2 = NULL; 
    Stu* prev = NULL; 

    // 检查链表是否为空或只有一个节点
    if (L == NULL || L->next == NULL)
        return;
    do {
        swapped = 0;
        ptr1 = L->next;       
        while (ptr1->next != ptr2) {
            // 比较
            if ((n == 1 && ptr1->cs > ptr1->next->cs) || (n == 2 && ptr1->cs < ptr1->next->cs)) {
                // 交换节点数据
                Stu* temp = ptr1->next;
                ptr1->next = temp->next;
                temp->next = ptr1;             
                if (ptr1 == L->next)
                    L->next = temp;
                else {
                    prev->next = temp;
                }
                ptr1 = temp;
                swapped = 1;
            }
            prev = ptr1;
            ptr1 = ptr1->next;
        }
        ptr2 = ptr1; 
    } while (swapped);
}

int Revisestudent(Stu* L, char no[]) {
    Stu* p = L;
    char sname[50];
    char sex[50];
    double english, math, cs;
    int flag = 0;
    while (p) {
        if (strcmp(p->sno, no) == 0) {
            printf("请输入修改后的姓名:");
            scanf("%s", sname);
            printf("请输入修改后的性别:");
            scanf("%s", sex);
            printf("请输入修改后的数学成绩:");
            scanf("%lf", &math);
            printf("请输入修改后的英语成绩:");
            scanf("%lf", &english);
            printf("请输入修改后的专业课成绩:");
            scanf("%lf", &cs);
            // 修改相关数据
            strcpy(p->sname, sname);
            strcpy(p->sex, sex);
            p->math = math;
            p->english = english;
            p->cs = cs;
            flag = 1;
            break;
        }
        p = p->next;
    }
    return flag;
}

void SavestudentData(FILE* fp, Stu* L) {
    Stu* p = L->next;
    rewind(fp);
    while (p) {
        fwrite(p, sizeof(Stu), 1, fp);
        p = p->next;
    }
    fclose(fp);
}

void sortByScore(Stu* L) {
    int swapped; //用于判断每次循环是否进行了排序,如果没有,就说明那个已经有序,提前结束
    Stu* ptr1; // 指向当前比较的节点,用于比较当前节点和下一个节点的值,并进行节点交换
    Stu* ptr2 = NULL; // 标记节点,确定已经排序好的节点的位置
    Stu* prev = NULL; // 指向 ptr1 的前一个节点
    if (L == NULL || L->next == NULL)
        return;
    do {
        swapped = 0;
        ptr1 = L->next;   
        while (ptr1->next != ptr2) {
            // 比较
            if (ptr1->score < ptr1->next->score) {
                // 交换节点数据
                Stu* temp = ptr1->next;
                ptr1->next = temp->next;
                temp->next = ptr1;               
                if (ptr1 == L->next)
                    L->next = temp;
                else {
                    prev->next = temp;
                }
                ptr1 = temp;
                swapped = 1;
            }
            prev = ptr1; 
            ptr1 = ptr1->next;
        }
        ptr2 = ptr1; 
    } while (swapped);
}

void printTopNPercent(Stu* L, int n) {
    int count = 0;
    Stu* current = L->next;
    while (current != NULL) {
        count++;
        current = current->next;
    }
    int numStudents = count * n / 100; // 计算需要输出的学生数量
    printf("Top %d%% 学生:\n", n);
    current = L->next;
    for (int i = 0; i < numStudents && current != NULL; i++) {
        printf("%s\t%s\t%s\t%.2f\n", current->sno, current->sname, current->sex, current->score);
        current = current->next;
    }
}


void CountGrade(Stu* L, int n) {
    Stu* current = L->next;
    while (current != NULL) {
        double math = current->math / 10.0;
        double english = current->english / 10.0;
        double cs = current->cs / 10.0;
        double gpa = (math + english + cs - 15.0) / 3.0;
        current->score = gpa;
        current = current->next;
    }
    sortByScore(L);
    printTopNPercent(L, n);
}

int main() {
    FILE* cfp = NULL, * efp = NULL, * sfp = NULL;
    int flag1 = 0;
    int flag2 = 0;
    int flag3 = 0;
    int result = 0, sel1 = 0, sel2 = 0, cmenuflag = 1, emenuflag = 1, cdeleteflag = 0, edeleteflag = 0, etype = 0, ctype = 0, sorttype = 0, sort = 0, cflag = 0;
    Stu* CCHead = NULL;
    int s, j, k, n = 0;
    int sorttype1 = 0;
    int sorttype2 = 0;
    Stu* CHead = NULL;
    int choice = 0;
    int choicetype = 0;
    int b = 0;
    int frontn = 0;
    char cname = 0;
    char del[50], ssex[50], ssname[50], snum[50];
    do {
        ShowFirstMenu();
        scanf("%d", &choice);
        switch (choice) {
        case 1:
            flag1 = stuLogin();
            if (flag1 == 0) continue;
            cmenuflag = 1;
            while (cmenuflag) {
                showstudentMeun();//学生页面;
                scanf("%d", &s);
                switch (s) {
                case 1://学生端多种方式查询
                    if (CHead == NULL) {
                        showerror("请先创建链表");
                    }
                    else {
                        printf("请输入您想查询的方式\n1.按照学生学号查询\n2.按照学生姓名查询\n3.按照性别查询\n");
                        printf("您的选择是:");
                        scanf("%d", &choicetype);
                        if (choicetype == 1) {
                            int* cnt = malloc(sizeof(int));
                            *cnt = 0;
                            printf("请输入您想查询的学生学号:");
                            scanf("%s", snum);
                            CCHead = Searchstudent(CHead, choicetype, snum, NULL, cnt);
                            if (CCHead != NULL) {
                                showinfo("查询成功");
                                SearchstudentList(CCHead, cnt);
                            }
                            else
                                showerror("查询失败");
                            free(cnt);
                        }
                        else if (choicetype == 2) {
                            int* cnt = malloc(sizeof(int));
                            *cnt = 0;
                            printf("请输入您想查询的学生姓名:");
                            scanf("%s", ssname);
                            CCHead = Searchstudent(CHead, choicetype, NULL, ssname, cnt);
                            if (CCHead != NULL) {
                                showinfo("查询成功");
                                SearchstudentList(CCHead, cnt);
                            }
                            else
                                showerror("查询失败");
                            free(cnt);
                        }
                        else if (choicetype == 3) {
                            int* cnt = malloc(sizeof(int));
                            *cnt = 0;
                            printf("请输入您想查询的学生性别:");
                            scanf("%s", ssex);
                            CCHead = Searchstudent(CHead, choicetype, NULL, ssex, cnt);
                            if (CCHead != NULL) {
                                showinfo("查询成功");
                                SearchstudentList(CCHead, cnt);
                            }
                            else
                                showerror("查询失败");
                            free(cnt);
                        }
                        else
                            showerror("无效的查询方式");
                    }
                    break;
                case 0://退出系统
                    cmenuflag = 0;
                    break;
                default:
                    cmenuflag = 0;
                    printf("无效的选项!\n");
                    break;
                }
            }
            break;
        case 2://教师页面
            flag2 = teaLogin();
            if (flag2 == 0) continue;
            cmenuflag = 1;
            while (cmenuflag) {
                showteacherMeun();
                scanf("%d", &j);
                switch (j) {
                case 1:
                    if (CHead == NULL)
                        showerror("请先创建链表");
                    else
                        Showstudent(CHead);
                    break;
                case 2:
                    printf("1,数学成绩排名\n2,英语成绩排名\n3,专业课成绩排名\n");
                    printf("请输入你要查询的科目编号:");
                    scanf("%d", &k);
                    switch (k) {
                    case 1:
                        if (CHead == NULL)
                            showerror("请先创建链表");
                        else {
                            printf("请输入排序方式:1.升序 2.降序\n");
                            printf("您的选择是:");
                            scanf("%d", &sorttype);
                            if (sorttype == 1) {
                                showmathorder(CHead, sorttype);
                                if (CHead) {
                                    showinfo("排序成功");
                                    Showstudent(CHead);
                                }
                                else
                                    showerror("排序失败");
                            }
                            else if (sorttype == 2) {
                                showmathorder(CHead, sorttype);
                                if (CHead) {
                                    showinfo("排序成功");
                                    Showstudent(CHead);
                                }
                                else
                                    showerror("排序失败");
                            }
                            else
                                printf("无效的排序方式");
                        }
                        break;
                    case 2:
                        if (CHead == NULL)
                            showerror("请先创建链表");
                        else {
                            printf("请输入排序方式:1.升序 2.降序\n");
                            printf("您的选择是:");
                            scanf("%d", &sorttype2);
                            if (sorttype2 == 1) {
                                showenglishorder(CHead, sorttype2);
                                if (CHead) {
                                    showinfo("排序成功");
                                    Showstudent(CHead);
                                }
                                else
                                    showerror("排序失败");
                            }
                            else if (sorttype2 == 2) {
                                showenglishorder(CHead, sorttype2);
                                if (CHead) {
                                    showinfo("排序成功");
                                    Showstudent(CHead);
                                }
                                else
                                    showerror("排序失败");
                            }
                            else
                                printf("无效的排序方式");
                        }
                        break;
                    case 3:
                        if (CHead == NULL)
                            showerror("请先创建链表");
                        else {
                            printf("请输入排序方式:1.升序 2.降序\n");
                            printf("您的选择是:");
                            scanf("%d", &sorttype1);
                            if (sorttype1 == 1) {
                                showcsorder(CHead, sorttype1);
                                if (CHead) {
                                    showinfo("排序成功");
                                    Showstudent(CHead);
                                }
                                else
                                    showerror("排序失败");
                            }
                            else if (sorttype1 == 2) {
                                showcsorder(CHead, sorttype1);
                                if (CHead) {
                                    Showstudent(CHead);
                                    showinfo("排序成功");
                                }
                                else
                                    showerror("排序失败");
                            }
                            else
                                printf("无效的排序方式");
                        }
                        break;
                    }
                    break;
                case 3:
                    // 统计学生绩点
                    if (CHead == NULL)
                        showerror("请先创建链表");
                    else {
                        printf("请输入要查看的前n%\n");
                        scanf("%d", &n);
                        CountGrade(CHead, n);
                    }

                    break;
                case 0://退出系统
                    cmenuflag = 0;
                    break;
                default:
                    cmenuflag = 0;
                    printf("无效的选项!\n");
                    break;
                }
            }
            break;
        case 3:
            flag3 = adminLogin();
            if (flag3 == 0) continue;
            if ((cfp = fopen("student.txt", "r")) == NULL) {
                printf("未找到文件\n");
                if ((cfp = fopen("student.txt", "w+")) != NULL)
                    CHead = InputStudent(cfp);
            }
            cmenuflag = 1;
            while (cmenuflag) {
                showadminMeun();
                scanf("%d", &n);
                switch (n) {
                case 1://创建链表
                    printf("请输入您想创建的方式\n1.表示头插法\n2.表示尾插法\n");
                    printf("您的选择是:");
                    scanf("%d", &b);
                    if (b == 1)
                        CHead = creatCHead(cfp);//头结点创建链表
                    else
                        CHead = createtail(cfp);//尾结点创建链表
                    if (CHead)
                        showinfo("创建成功");
                    else
                        showerror("创建失败");
                    break;
                case 2:
                    if (CHead == NULL)
                        showerror("请先创建链表");
                    else
                        Addstudent(CHead);
                    if (CHead)
                        showinfo("添加成功");
                    else
                        showerror("添加失败");
                    break;
                case 3://删除学生数据
                    if (CHead == NULL)
                        showerror("请先创建链表");
                    else {
                        printf("请输入您想删除的学生信息的学号:");
                        scanf("%s", del);
                        cdeleteflag = Deletestudent(CHead, del);
                        if (cdeleteflag == 1)
                            showinfo("删除成功");
                        else
                            showerror("删除失败");
                    }
                    break;
                case 4:
                    if (CHead == NULL)
                        showerror("请先创建链表");
                    else {
                        printf("请输入您要修改的学生的学号:");
                        scanf("%s", snum);
                        cflag = Revisestudent(CHead, snum);
                        if (cflag == 1)
                            showinfo("修改成功");
                        else
                            showerror("修改失败");
                    }
                    break;
                case 5:
                    if (CHead == NULL)
                        showerror("请先创建链表");
                    else {
                        cfp = fopen("student.txt", "wb");
                        SavestudentData(cfp, CHead);
                    }
                    if (CHead)
                        showinfo("保存成功");
                    else
                        showerror("保存失败");
                    break;
                case 0:
                    cmenuflag = 0;
                    break;
                default:
                    cmenuflag = 0;
                    printf("无效的选项!\n");
                    break;
                }
            }
            break;
        case 4:
            return 0;
        }
    } while (1);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/308095.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

揭秘区块链的奥秘:链上智能如何诊断加密生态系统的健康状况

作者&#xff1a;shellyfootprint.network 数据源&#xff1a;Wallet Profile 在加密市场中&#xff0c;波动是家常便饭。就拿 2022 年来说&#xff0c;像 Terra、Celsius 和 FTX 这样的主要项目相继崩盘&#xff0c;搞得市场一片狼藉。这些情况往往让人措手不及&#xff0c;直…

openGauss学习笔记-192 openGauss 数据库运维-常见故障定位案例-XFS文件系统问题

文章目录 openGauss学习笔记-192 openGauss 数据库运维-常见故障定位案例-XFS文件系统问题192.1 在XFS文件系统中&#xff0c;使用du命令查询数据文件大小大于文件实际大小192.1.1 问题现象192.1.2 原因分析192.1.3 处理办法 192.2 在XFS文件系统中&#xff0c;出现文件损坏192…

工业智能网关如何保障数据通信安全

工业智能网关是组成工业物联网的重要设备&#xff0c;不仅可以起到数据交换、通信、边缘计算的功能&#xff0c;还可以发挥数据安全保障功能&#xff0c;保障工业物联网稳定、可持续。本篇就为大家简单介绍一下工业智能网关增强和确保数据通信安全的几种措施&#xff1a; 1、软…

nuxt pm2配置及使用

pm2简介 pm2是一个进程管理工具,可以用它来管理node进程&#xff0c;并查看node进程的状态&#xff0c;当然也支持性能监控&#xff0c;进程守护&#xff0c;负载均衡等功能&#xff0c;在前端和nodejs的世界中用的很多 pm2安装 安装pm2: $ npm install -g pm2查看pm2的安装…

232转Profinet实现协议互转的配置步骤

通常说的RS232是一种串口通信&#xff0c;通过发送和接收的电压变化来传递信息&#xff0c;是点对点通信&#xff0c;通信双方直接连接&#xff0c;通信速率较低。Profinet是一种以太网协议通信&#xff0c;具有传输速度快&#xff0c;支持多个设备实时应用&#xff0c;而且有更…

链表--141.环形链表/easy C级理解

141.环形链表 1、题目2、题目分析3、解题步骤4、复杂度最优解代码示例5、抽象与扩展 1、题目 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链…

如何保护linux服务器远程使用的安全

服务器安全是一个非常敏感的问题&#xff0c;因服务器远程入侵导致数据丢失的安全问题频频出现&#xff0c;一旦服务器入侵就会对个人和企业造成巨大的损失。因此&#xff0c;在日常使用服务器的时候&#xff0c;我们需要采取一些安全措施来保障服务器的安全性。 目前服务器系…

基于6个IGBT的全桥电路simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 三相逆变器全桥电路原理 4.2 全桥电路应用领域 5.完整工程文件 1.课题概述 基于6个IGBT的全桥电路simulink建模与仿真. 2.系统仿真结果 3.核心程序与模型 版本&#xff1a;MATLAB2022a 02_018m …

MySQL 从零开始:04 增删改查

文章目录 1、准备工作2、insert 增加数据2.1 添加所有列的数据2.2 添加部分列2.3 一次插入多条数据 3、delete 删除记录4、update 更新记录5、select 查询记录5.1 查询所有行所有列5.2 查询指定行的所有列5.3 查询所有行的指定列5.4 查询指定行的指定列 在上一小节中介绍了 MyS…

STM32-05-STM32_SYSTEM文件夹

文章目录 STM32 SYSTEM文件夹介绍1. delay文件夹2. sys文件夹 STM32 SYSTEM文件夹介绍 1. delay文件夹 delay文件夹中的文件delay.c和delay.h用来实现系统的延时功能&#xff0c;其包括7个函数&#xff1a; //仅在操作系统的支持下使用 void delay_osschedlock(void); void d…

2024年Google Ads新手指南——广告运作与类型、工具

谷歌广告投放是出海企业的必备运营动作&#xff0c;但你需要先了解他的运作逻辑、广告类型、投放必备的工具类型&#xff0c;之后可以为你的投放的高速转化做好万全准备&#xff0c;毕竟每一分钱都要花在刀刃上&#xff01;废话不多说&#xff0c;下面开始为新手准备了基础指南…

【数据库】MySQL锁

一、锁的基本概念 1、锁的定义 锁是协调多个进程或线程并发访问数据库资源的一种机制。 MySQL中的锁是在服务器层或者存储引擎层实现的&#xff0c;保证了数据访问的一致性与有效性。但加锁是消耗资源的&#xff0c;锁的各种操作&#xff0c;包括获得锁、检测锁是否已解除、…

dubbo的springboot集成

1.什么是dubbo&#xff1f; Apache Dubbo 是一款 RPC 服务开发框架&#xff0c;用于解决微服务架构下的服务治理与通信问题&#xff0c;官方提供了 Java、Golang 等多语言 SDK 实现。使用 Dubbo 开发的微服务原生具备相互之间的远程地址发现与通信能力&#xff0c; 利用 Dubbo …

开始卷TED:第1篇 —— 《Embrace the near win》—— part: 3

She first hit a seven, I remember, and then a nine, and then two tens, and then the next arrow didn’t even hit the target. 她第一次射中了7环&#xff0c; 我记得接下来是个9环&#xff0c;然后是2个十环&#xff0c;接下来的那支箭甚至没有射到靶上。 And I saw tha…

Container ansible disguises local ansible 【容器 ansible 伪装本地 ansible】

预备条件&#xff1a; ctr & crictl $ nerdctl & containerd install了解 kubespray 是什么 kubespray 包含 ansible、ansible-playbook命令以及通过kubespray项目安装kubernetes集群的介质。 nerdctl pull quay.io/kubespray/kubespray:v2.23.1 nerdctl save -o qu…

科学和统计分析软件GraphPad Prism mac介绍说明

GraphPad Prism for Mac是一款科学和统计分析软件&#xff0c;旨在帮助研究者、科学家和学生更轻松地处理和可视化数据。 GraphPad Prism for Mac是一款功能强大、易于使用的科学和统计分析软件&#xff0c;适用于各种类型的数据处理和可视化需求。无论您是进行基础研究、临床试…

知识图谱gds使用记录

安装 从下载站下载对应的包到plugin目录下&#xff0c;修改配置文件/etc/neo4j/neo4j.conf&#xff0c;末尾加入gds.*&#xff0c;重新启动 在浏览器输入CALL gds.list()命令进行测试 建立图映射 为了使用图算法&#xff0c;需要先将图数据库的内容映射为一个新图 如果是全…

不定期更新免费签|在线安装全能签轻松签万能签GBOX魔力签喵喵签|赶快白嫖

使用Safari浏览器打开 1.打开平台ios.hccld.com点击应用后的“获取”获取设备UDID&#xff0c;获取后在我的里上就会显示设备UDID信息。 2.点我的-购买证书&#xff0c;选择需要购买的证书进行购买。 3.点击“兑换证书”&#xff0c;输入购买的兑换码。 4.选择你要安装的签名安…

特征工程(二)

特征工程&#xff08;二&#xff09; 特征理解 理解手上的数据&#xff0c;就可以更好的明确下一步的方向。从繁杂的切入点中&#xff0c;主要着眼于一下几个方面&#xff1a; 结构化数据与非结构化数据&#xff1b;数据的4个等级&#xff1b;识别数据中存在的缺失值&#xf…

freesurfer-reconall后批量提取TIV(颅内总体积)

#提取TIV #singleline=$(grep Estimated Total Intracranial Volume /usr/local/freesurfer/subjects/bect-3d+bold-wangjingchen-4.9y-2/stats/aseg.sta