ahduahwu 2023-03-08 09:15 采纳率: 50%
浏览 24
已结题

请帮我看看最后两个函数该怎么打,链表排序实在难写。


#include<stdio.h>
#include<stdlib.h>
#include <windows.h>
#define LEN sizeof(struct stu)
struct stu
{
char name[20];
char number[20];
char clas[10];
char sex[4]; 
int score1;
int score2;
int score3;
int score4;
int score5;
struct stu* next;
};
struct stu* head = NULL;
struct stu* end = NULL;
void Menu(){
    void Menu();
    void Add();
    void Repair(); 
    void Delete();
    void View();
    void ViewAll();
    void View1();
    void ave();
    void sort(); 
    void sta();
    system("cls");//清屏 
     printf("    成绩管理\n");
    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("9.按班级统计学科总分、平均分等\n");
    printf("0.退出\n");
    int choice;
    printf("请选择要使用的功能:\n");
    loop:
    scanf("%d",&choice);
    switch (choice) {
    case 1:
        Add();
        Menu();
    case 2:    
        Repair();
        Menu();
    case 3:
        Delete(); 
        Menu();
    case 4:
        ViewAll();
        Menu();
    case 5:
        ave();
        Menu();
    case 6:
        View(); 
        Menu();
    case 7:
        View1();
        Menu();
    case 8:
        sort();
         Menu();
    case 9:
        sta();
        Menu();
    case 0:
        printf("感谢使用!!!");
        exit(0); 
    default:
            printf("输入有误,请重新选择:");
            goto loop;//迭代循环    
    }
}
    void Add()//添加函数 
    {
    system("cls");
    int count;
    printf("请输入要录入信息的个数:");
    scanf("%d",&count);
    struct stu *s1,*s2,*temp;
    s1=s2=(struct stu*)malloc(LEN);
    if(head==NULL){
        head = s1;
    }else{
        end->next = s1 ;
    }
    int i = 1;    
    while(count>0){
        printf("请输入第%d位学生信息:\n",i++);
        printf("学号:\n");
        scanf("%s",&s1->number);
        printf("班级:\n");
        scanf("%s",&s1->clas); 
        printf("姓名:\n");
        scanf("%s",&s1->name);
        printf("性别:\n");
        scanf("%s",&s1->sex);
        printf("成绩1:\n");
        scanf("%d",&s1->score1);
        printf("成绩2:\n");
        scanf("%d",&s1->score2);
        printf("成绩3:\n");
        scanf("%d",&s1->score3);
        printf("成绩4:\n");
        scanf("%d",&s1->score4);
        printf("成绩5:\n");
        scanf("%d",&s1->score5);
        count--;
        s2->next=s1;
        s2=s1;
        s1=(struct stu*)malloc(LEN);
        printf("添加成功!\n");
        system("pause");
        system("cls");
    }
    s2->next= NULL;
    end = s2;
    printf("全部添加成功!\n");
    system("pause");
 }
 void Repair()//修改函数 
 {
    system("cls");
    struct stu *RS;
    char num[10];
    int flag = 1;
    printf("输入要修改成绩学生的学号:\n");
    scanf("%s",num);
    for(RS=head;RS!=NULL;){
        if(strcmp(RS->number,num)==0){
            printf("成功找到该学生");
            printf("学号:%s\t姓名:%s\t班级:%s\t性别:%s\n",RS->number,RS->name,RS->clas,RS->sex);
            printf("成绩1:%d\t成绩2:%d\t成绩3:%d\t成绩4:%d\t成绩5:%d\n",RS->score1,RS->score2,RS->score3,RS->score4,RS->score5);
            flag = 0;
            printf("学号:\n");
            scanf("%s",&RS->number);
            printf("姓名:\n");
            scanf("%s",&RS->name);
            printf("班级:\n");
            scanf("%s",&RS->clas);
            printf("性别:\n");
            scanf("%s",&RS->sex);
            printf("成绩1:\n");
            scanf("%d",&RS->score1);
            printf("成绩2:\n");
            scanf("%d",&RS->score2);
            printf("成绩3:\n");
            scanf("%d",&RS->score3);
            printf("成绩4:\n");
            scanf("%d",&RS->score4);
            printf("成绩5:\n");
            scanf("%d",&RS->score5);
            printf("修改成功");
            system("pause");
        }
        RS=RS->next;
    }
    if(flag){
        printf("输入信息有误,未查询到");
        system("pause");
    }
}
void Delete()//删除函数 
{
    system("cls");
    int flag =1;
    while(flag){
        printf("请输入要删除的学生学号:");
        char num[10];
        scanf("%s",&num);
        struct stu * DS,*temp;
        for(DS=head;DS!=NULL;){
            if(strcmp(DS->number,num)==0){
                if(DS==head){
                    head = DS->next;
                    flag = 0;
                    printf("删除成功!\n");
                    system("pause");
                }else{
                    flag = 0;
                    printf("删除成功!\n");
                    temp->next= DS->next;
                    free(DS);
                    system("pause");
                }
                
            }
            temp = DS;
            DS=DS->next;
        }
        if(flag){
            printf("未找到该学生学号!\n");
            system("pause");
        }
    }
}
void View()//查询函数 
{
    system("cls");
    struct stu *VS;
    int a;
    printf("输入要查询信息的学生学号或姓名:\n");
    char num[10];
    int flag=1;
    scanf("%s",&num);
    for(VS=head;VS!=NULL;){
        if(strcmp(VS->number,num)==0){
            printf("成功找到!\n");
            printf("学号:%s\t姓名:%s\t班级:%s\t性别:%s\n",VS->number,VS->name,VS->clas,VS->sex);
            printf("成绩1:%d\t成绩2:%d\t成绩3:%d\t成绩4:%d\t成绩5:%d",VS->score1,VS->score2,VS->score3,VS->score4,VS->score5);
            flag=0;
            break;
        }
        else if(strcmp(VS->name,num)==0) {
            printf("成功找到!\n");
            printf("学号:%s\t姓名:%s\t班级:%s\t性别:%s\n",VS->number,VS->name,VS->clas,VS->sex);
            printf("成绩1:%d\t成绩2:%d\t成绩3:%d\t成绩4:%d\t成绩5:%d",VS->score1,VS->score2,VS->score3,VS->score4,VS->score5);
            flag=0;
            break;
            }
        VS=VS->next;
    }
    if(flag){
        printf("不好意思,未找到!\n");
    }
    system("pause");
}
void ViewAll()//总分函数 
{
    system("cls");
    struct stu *VA;
    int sum; 
    if(head!=NULL){
        printf("所有学生成绩如下:\n");
        for(VA=head;VA!=NULL;){
            printf("学号:%s\t姓名:%s\t班级:%s\t性别:%s\n",VA->number,VA->name,VA->clas,VA->sex);
            sum=VA->score1+VA->score2+VA->score3+VA->score4+VA->score5;
            printf("总分:%d\n",sum);
            VA=VA->next; 
        }
    }else{
        printf("该系统中还未录入信息");
    }    
    system("pause");
}
void View1() //班级函数 
{
system("cls");
    struct stu *Vb;
    char x[5];
    printf("请输入班级:\n");
    scanf("%s",&x);
    for(Vb=head;Vb!=NULL;){
        if(strcmp(Vb->clas,x)==0){
            printf("学号:%s\t姓名:%s\t班级:%s\t性别:%s\n",Vb->number,Vb->name,Vb->clas,Vb->sex);
            printf("成绩1:%d\t成绩2:%d\t成绩3:%d\t成绩4:%d\t成绩5:%d\n",Vb->score1,Vb->score2,Vb->score3,Vb->score4,Vb->score5);
         }
         Vb=Vb->next;
    }
    system("pause"); 
}
void ave()//平均函数 
{
    system("cls");
    struct stu *Vp;
   int um; 
    float aver; 
    if(head!=NULL){
        printf("所有学生平均成绩如下:\n");
        for(Vp=head;Vp!=NULL;){
            printf("学号:%s\t姓名:%s\t班级:%s\t性别:%s\n",Vp->number,Vp->name,Vp->clas,Vp->sex);
            um=Vp->score1+Vp->score2+Vp->score3+Vp->score4+Vp->score5;
            aver=um/5.00;
            printf("平均分:%.2f",aver); 
            Vp=Vp->next; 
        }
    }else{
        printf("该系统中还未录入信息");
    }    
    system("pause");
}
void sort()//排序函数 
{
system("cls");
}
void sta();//按班级统计学科总分、平均分
{
    system("cls");
}



int main()
    {
    Menu();
    system("pause");
    return 0;
}
  • 写回答

1条回答 默认 最新

  • 「已注销」 2023-03-08 09:36
    关注

    “Devil组”引证GPT后的撰写:

    • 针对链表排序的函数可以使用冒泡排序(Bubble Sort)或选择排序(Selection Sort)来实现。
    • 冒泡排序通过重复遍历未排序的元素来工作,每次将相邻的元素比较,如果顺序不对就交换它们的位置,这样,每遍历一次后,最大(或最小)的元素就会移动到最后(或第一位),这个过程会一直进行到所有的元素都排好序。冒泡排序的时间复杂度为O(n^2)。
    • 选择排序从未排序的元素中找到最小(或最大)的元素并将其放在序列的起始位置,然后从剩余的未排序元素中找到最小(或最大)的元素,将其放在已排序序列的末尾。选择排序的时间复杂度为O(n^2)。

    这里提供一个用选择排序来对链表进行排序的示例代码:

    void sort() {
        struct stu *p1, *p2, *min;
        struct stu temp;
        p1 = head;
        while (p1 != NULL) {
            min = p1;
            p2 = p1->next;
            while (p2 != NULL) {
                if (strcmp(p2->name, min->name) < 0) {
                    min = p2;
                }
                p2 = p2->next;
            }
            if (min != p1) {
                temp = *p1;
                *p1 = *min;
                *min = temp;
            }
            p1 = p1->next;
        }
        printf("排序完成!\n");
        system("pause");
    }
    
    
    

    该函数的基本思路是先遍历整个链表,每次找到链表中剩余未排序部分的最小值,将其与当前位置的值进行交换,如此循环直到整个链表都排序完成。这里的比较操作是按照学生姓名进行的,可以根据实际需求修改排序规则。

    另外,需要注意的是,在交换节点值的时候,要使用一个临时变量temp来存储某个节点的值,否则会出现错误。

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

报告相同问题?

问题事件

  • 系统已结题 3月16日
  • 已采纳回答 3月8日
  • 创建了问题 3月8日

悬赏问题

  • ¥15 全部备份安卓app数据包括密码,可以复制到另一手机上运行
  • ¥15 Python3.5 相关代码写作
  • ¥20 测距传感器数据手册i2c
  • ¥15 RPA正常跑,cmd输入cookies跑不出来
  • ¥15 求帮我调试一下freefem代码
  • ¥15 matlab代码解决,怎么运行
  • ¥15 R语言Rstudio突然无法启动
  • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像
  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗