m0_63999697 2022-03-03 23:11 采纳率: 93.5%
浏览 176
已结题

单链表的情况下怎么让学号从小到大排序

问题描述
请设计一个简单的学生成绩管理系统,要求系统实现以下功能:
学生信息包括学号、姓名、性别、语文、数学、英语。
插入学生信息:
Insert id name sex x y z 其中的参数分别为学号、姓名、性别、三门课的成绩,成绩为浮点数。如果链表中已经存在相同学号的学生信息,插入失败。
输出所有学生信息:
List
按照学号从小到大的顺序输出所有学生的信息,每行一位学生的信息。每行的格式如下:
id name sex x y z
数据之间用一个空格分隔,成绩保留1位小数。
查找学生信息:
Find id
查找学号为id的学生信息。
修改学生信息:
Change id newname,newx,newy,newz
把学号为id的学生信息修改为newname,newx,newy,newz(学号保持不变)
删除学生信息:
Delete id
删除学号为id的学生信息
退出程序:
Quit或者Exit
输入
输入有多行,每行一条指令,指令格式如下:
Insert id name sex x y z
插入学生信息,分别为学号、姓名、性别和三门课的成绩。
List
按照学号从小到大的输出所有学生信息。
Find id
查找学号为id的学生信息。
Change id newname,newx,newy,newz
把学号为id的学生信息修改为newname,newx,newy,newz(学号保持不变)
Delete id
删除学号为id的学生信息
Quit或者Exit
输出"Good bye!"后结束程序。
输出
输出有多行,对应命令的输出如下:
Insert id name sex x y z
插入后先在单独的一行输出"Insert:"。
第二行中显示信息如下:如果链表中已经存在相同学号的学生信息,插入失败,显示"Failed"。否则插入并显示学生信息,数据之间用一个空格分开,成绩保留1位小数。
List
第一行输出"List:",接下来按照学号从小到大的顺序输出所有学生的信息,每行一位学生的信息。每行的格式如下:
id name sex x y z
数据之间一个空格,成绩保留1位小数。
Find id
第一行显示”Find:",第二行显示格式如下:
如果找到学号为id的学生,则在单独一行中显示学生信息,格式如List。否则在单独一行显示"Failed"。
Change id newname,newx,newy,newz
第一行显示"Change:"。如果链表中不存在学号为id的学生,显示"Failed"。否则修改该学生信息并在单独一行中显示该生信息,显示格式如List命令。
Delete id
第一行显示"Delete:"。如果链表中不存在学号为id的学生,显示"Failed"。否则修改该学生信息并在单独一行中显示"Deleted"
Quit或者Exit
在单独一行中输出"Good bye!"后结束程序。
输入样列
Insert 0911002 zhaoliu F 97 90 55
Insert 0911001 zhangsan F 87 78 65
Insert 0911001 zhangsan F 87 78 65
Insert 0911003 Lisi F 77 72 55
Change 0911001 Zhangsan M 77 78 65
Change 0911004 Wangwu M 77 78 65
Insert 0911004 Wangwu F 68 56 95
Find 0911004
List
Delete 0911004
Delete 0911004
List
Quit
输出样例
Insert:
0911002 zhaoliu F 97.0 90.0 55.0
Insert:
0911001 zhangsan F 87.0 78.0 65.0
Insert:
Failed
Insert:
0911003 Lisi F 77.0 72.0 55.0
Change:
0911001 Zhangsan M 77.0 78.0 65.0
Change:
Failed
Insert:
0911004 Wangwu F 68.0 56.0 95.0
Find:
0911004 Wangwu F 68.0 56.0 95.0
List:
0911001 Zhangsan M 77.0 78.0 65.0
0911002 zhaoliu F 97.0 90.0 55.0
0911003 Lisi F 77.0 72.0 55.0
0911004 Wangwu F 68.0 56.0 95.0
Delete:
Deleted
Delete:
Failed
List:
0911001 Zhangsan M 77.0 78.0 65.0
0911002 zhaoliu F 97.0 90.0 55.0
0911003 Lisi F 77.0 72.0 55.0
Good bye!

#include<bits/stdc++.h>
using namespace std;
typedef struct Student{
    char id[20];
    char name[20];
    char sex[2];
    double x,y,z;
    struct Student *next;
}Student;
void inputSingle(Student *s)
{
    int j;
    scanf("%s %s %s",s->id,s->name,s->sex);
    scanf("%lf %lf %lf",&s->x,&s->y,&s->z);
}
void outputSingle(Student *s)
{
    int j;
    printf("%s %s %s ",s->id,s->name,s->sex);
    printf("%.1f %.1f %.1f\n",s->x,s->y,s->z);
}
Student* createList()
{
    Student *L;
    L=(Student *)malloc(sizeof(Student));
    L->next=NULL;
    return L;
}
void insert(Student *L,Student *S,char id[])
{
    Student *pre,*p,*s;
    pre=L;
    p=L->next;
    while(p!=NULL&&p->id<id){
        pre=p;
        p=p->next;
    }
    s->next=pre->next;
    pre->next=s;
}
void outputList(Student *L)
{
    Student *p;
    p=L->next;
    while(p!=NULL){
        outputSingle(p);
        p=p->next;
    }
}
int Find(Student *L,char id[])
{
    Student *pre,*p;
    pre=L;
    p=L->next;
    while(p!=NULL&&strcmp(p->id,id)!=0){
        pre=p;
        p=p->next;
    }
    if(p==NULL){
        puts("Failed");
        return 0;
    }
    else{
        outputSingle(p);
        return 1;
    }
}
int Change(Student *L,char id[],char name[],char sex[],double x,double y,double z)
{
    Student *pre,*p;
    pre=L;
    p=L->next;
    while(p!=NULL&&strcmp(p->id,id)!=0){
        pre=p;
        p=p->next;
    }
    if(p==NULL){
        puts("Failed");
        return 0;
    }
    else if(strcmp(p->name,name)!=0||strcmp(p->sex,sex)!=0||p->x!=x||p->y!=y||p->z!=z){
        strcpy(p->name,name);
        strcpy(p->sex,sex);
        p->x=x,p->y=y,p->z=z;
        outputSingle(p);
        return 1;
    }
}
int Delete(Student *L,char id[])
{
    Student *pre,*p;
    pre=L;
    p=L->next;
    while(p!=NULL&&strcmp(p->id,id)!=0){
        pre=p;
        p=p->next;
    }
    if(p==NULL){
        puts("Failed");
        return 0;
    }
    else{
        pre->next=p->next;
        free(p);
        puts("Deleted");
        return 1;
    }
}
int main()
{
    string order;
    Student *L,*s;
    L=createList();
    char id[20];
    char name[20];
    char sex[2];
    double x,y,z;
    while(1){
        cin>>order;
        if(order=="Insert"){
            puts("Insert:");
            cin>>id;
            s=(Student *)malloc(sizeof(Student));
            inputSingle(s);
            outputSingle(s);
            insert(L,s,id);
        }
        else if(order=="List"){
            puts("List:");
            outputList(L);
        }
        else if(order=="Find"){
            puts("Find:");
            cin>>id;
            Find(L,id);
        }
        else if(order=="Change"){
            puts("Change:");
            cin>>id>>name>>sex>>x>>y>>z;
            Change(L,id,name,sex,x,y,z);
        }
        else if(order=="Delete"){
            puts("Delete:");
            cin>>id;
            Delete(L,id);
        }
        else{
            printf("Good bye!\n");
            break;
        }
    }
    return 0;
}
 

最开始用的是尾插法,那时没出什么问题,但是要求学号排序后我插入改用了按指定位置插入节点的法子,但是出错了T T

  • 写回答

1条回答 默认 最新

  • 赵4老师 2022-03-04 10:29
    关注

    数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633

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

报告相同问题?

问题事件

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

悬赏问题

  • ¥200 如何使用postGis实现最短领规划?
  • ¥15 pyinstaller打包错误
  • ¥20 cesm的气溶胶排放文件
  • ¥15 逐月累计,月份不连续,补齐月份
  • ¥15 应用简单的Python代码完成一个学生成绩管理系统
  • ¥15 用matlab求微分方程初值问题
  • ¥15 vscode下编写第三方库opencv与pcl代码时没有代码提示
  • ¥15 能够跑通不报错,如何解决?(标签-matlab)
  • ¥15 MOS在RDS较大,频率高时开关波形异常
  • ¥15 SCENIC分析报错求解答