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

news2024/12/24 2:12:28

主要功能:

分为三个身份:

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

老师:可以看所有学生成绩,单科排名(正序,倒序),统计绩点,查看绩点排名前百分之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);
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

研发型企业怎样选择安全便捷的数据摆渡解决方案?

研发型企业在市场经济发展中发挥着至关重要的作用&#xff0c;研发型企业是指以科技创新为核心&#xff0c;以研发新产品、新技术、新工艺为主要业务的企业。这类企业注重技术创新和研发&#xff0c;持续不断地进行技术创新和产品升级&#xff0c;为经济发展注入新鲜的活力。 研…

element-plus里el-date-picker日期选择器,默认值不显示的问题

官网文档给出的示例默认值也是没有没显示的。 找了很多方法&#xff0c;最终是给v-model"defaultTime"绑定初始值&#xff0c;如下代码&#xff0c;需要的可以改一下 <el-date-picker class"top_select" v-model"defaultTime" type"da…

C语言督学营(高级阶段)

文章目录 高级阶段19.C语言语法进阶1.条件运算符、逗号运算符(1)条件运算符 / 三目运算符   ? :(2)逗号运算符   , 2.自增自减运算符3.位运算符&#xff1a;按位或、按位异或、按位取反(1)逻辑与、按位与、左移、右移(2)有符号数右移 vs 无符号数右移(3)按位与、按位或、按位…

微信小程序Burp抓包

方法有很多&#xff0c;工具也各有差异&#xff0c;主要是学代理流量的思路 Burp流量代理工具小程序 一、Burp证书导入 1、开启代理 开启浏览器的代理&#xff0c;火狐推荐FoxyProxy&#xff0c;Google推荐SwitchyOmega&#xff0c;设置代理为127.0.0.1:8080。 2、下载证书…

STM32Cubemx PWM驱动SG90舵机

一、SG90相关介绍 名 称&#xff1a;9克舵机 180度 尺 寸&#xff1a;23mmX12.2mmX29mm 重 量&#xff1a;9克 扭 矩&#xff1a;1.5kg/cm 工 作 电 压: 4.2-6V 温 度 范 围:0℃--55℃ 运 行 速 度&#xff1a;0.3秒/60度 死 带 宽:10微秒 二、Cubemx配置 sys配置 RCC配置 LED…

CloudCone | 最便宜国外VPS | 2核1G一年只需17$ | 国外性价比高VPS | CloudCone 怎么样 | CloudCone 使用体验

因工作需要&#xff0c;博主体验过市面上各家国外vps&#xff08;包括你知道的搬瓦工、vultr、hostwinds等等&#xff09;&#xff0c;把最便宜的一家国外vps记录下来&#xff0c;市面上找不到比这更便宜的vps。 它就是CloudCone。这家vps比较小众&#xff0c;ip新&#xff0c…

红队打靶练习:TOMMY BOY: 1

目录 信息收集 1、arp 2、nmap 3、nikto 4、whatweb WEB robots.txt get flag1 get flag2 FTP登录 文件下载 更改代理 ffuf爆破 get flag3 crunch密码生成 wpscan 1、密码爆破 2、登录wordpress ssh登录 get flag4 信息收集 get flag5 信息收集 1、arp …

Golang的API项目快速开始

开启一个简单的API服务。 golang的教程网上一大堆&#xff0c;官网也有非常详细的教程&#xff0c;这里不在赘述这些基础语法教程&#xff0c;我们意在快速进入项目开发阶段。 golang好用语法教程传送门&#xff1a; m.runoob.com/go/ 编写第一个API 前提&#xff1a;按照上一…

2023年全国职业院校技能大赛(高职组)“云计算应用”赛项赛卷⑨

2023年全国职业院校技能大赛&#xff08;高职组&#xff09; “云计算应用”赛项赛卷9 目录 需要竞赛软件包环境以及备赛资源可私信博主&#xff01;&#xff01;&#xff01; 2023年全国职业院校技能大赛&#xff08;高职组&#xff09; “云计算应用”赛项赛卷9 模块一 …

视频壁纸制作Dynamic Wallpaper中文

Dynamic Wallpaper是一款专门为macOS用户设计的动态壁纸软件。它可以将视频、图片、音乐等多种元素融合在一起&#xff0c;为用户的桌面带来生动、个性化的视觉效果。Dynamic Wallpaper内置了大量动态壁纸&#xff0c;包括自然风景、城市风貌、抽象艺术等多种主题。用户可以根据…

docker-compose一键搭建zookeeper集群

1、setup.sh setup.sh脚本用来创建本地文件夹&#xff0c;这些文件夹会被挂载到docker容器。 #!/bin/bashmkdir -p "$PWD\zoo1\data" mkdir -p "$PWD\zoo1\datalog"mkdir -p "$PWD\zoo2\data" mkdir -p "$PWD\zoo2\datalog"mkdir -p…

如何设置电脑桌面提醒,电脑笔记软件哪个好?

对于大多数上班族来说&#xff0c;每天要完成的待办事项实在太多了&#xff0c;如果不能及时去处理&#xff0c;很容易因为各种因素导致忘记&#xff0c;从而给自己带来不少麻烦。所以&#xff0c;我们往往会借助一些提醒类的软件将各项任务逐一记录下来&#xff0c;然后设置上…

机器学习周刊03:如何学习深度学习?2024 年学习生成式 AI 路线图、如何构建高效的RAG系统、苹果 腾讯最新论文、阿里DreaMoving

腾讯推出的 AppAgent&#xff0c;是一个多模态智能体&#xff0c;通过识别当前手机的界面和用户指令直接操作手机界面&#xff0c;能像真实用户一样操作手机&#xff01; 机器学习周刊&#xff1a;关注Python、机器学习、深度学习、大模型等硬核技术 1、如何学习深度学习&…

信道编码理论【信息论安全】

目录 一. 信道编码模型 二. 信道编码速率与错误译码率 2.1 信道编码速率 2.2 平均错误率 三. 信道容量 四. 小结 一. 信道编码模型 &#xff08;1&#xff09;消息 假定消息集合为M&#xff0c;如下&#xff1a; &#xff08;2&#xff09;编码 将消息m映射成码字&…

spring cloud之集成sentinel

写在前面 源码 。 本文一起看下spring cloud的sentinel组件的使用。 1&#xff1a;准备 1.1&#xff1a;理论 对于一个系统来说&#xff0c;最重要的就是高可用&#xff0c;那么如何实现高可用呢&#xff1f;你可能会说&#xff0c;集群部署不就可以了&#xff0c;但事实并…

1.10 Unity中的数据存储 JSON

一、介绍 Json是最常用也是目前用的比较多的一种&#xff0c;超轻量级&#xff0c;可便捷性使用&#xff0c;平时用到比较多的都是解析Json和往Json中添加数据、修改数据等等JSON(JavaScript Object Notation,JS对象标记)是一种轻量级的数据交换格式&#xff0c;它基于ECMAScr…

Aloha 机械臂的学习记录3——AWE:Pycharm运行代码记录

之前的博客创作了三偏关于Aloha_AWE的liunx终端指令运行代码的示例: Aloha 机械臂的学习记录——AWE&#xff1a;Bimanual Simulation Suite: https://blog.csdn.net/qq_54900679/article/details/134889183?spm1001.2014.3001.5502 Aloha 机械臂的学习记录1——AWE&#x…

浅谈WPF之Popup弹出层

在日常开发中&#xff0c;当点击某控件时&#xff0c;经常看到一些弹出框&#xff0c;停靠在某些页面元素的附近&#xff0c;但这些又不是真正的窗口&#xff0c;而是页面的一部分&#xff0c;那这种功能是如何实现的呢&#xff1f;今天就以一个简单的小例子&#xff0c;简述如…

SpringIOC之support模块DelegatingMessageSource

博主介绍:✌全网粉丝5W+,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验✌ 博主作品:《Java项目案例》主要基于SpringBoot+MyBatis/MyBatis-plus+…

如何将后端带过来的字符串通过‘,’号作为判断依据,分割字符串然后生成数组

在实际开发工程中我们会遇到我们调用后端接口获取图片、文件、视频甚至选择的对象时&#xff0c;如果是这样的&#xff1a; 这种数据类型如果想渲染在html中的话就会很麻烦&#xff0c;我们可以通过","号为切割点将它放入数组中&#xff0c;通过列表进行渲染 由于实…