数据结构完善代码求助

XK_LZ 2023-05-17 21:33:13

以下例代码为主,完善代码中学号不能重复,成绩输入范围在0到100,插入函数中不能插入相同信息的内容等问题,感谢!!!!!

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#define MAXSIZE 100//定义数组的最大长度为100 
int renshu;//人数 
int error=0;
 
 
typedef struct Student{ //存放学生信息的表
    char name[20];      //姓名
    int num;            //学号
    int suanfa;         //算法 
    int DS;             //数据结构 
    int sum;            //总成绩
}Student;
 
typedef struct{
    Student stu[MAXSIZE];         //线性表占用的数组空间
    int last;                    //最后一个元素的下标
}SeqList;//SeqList顺序表 

bool is_same(SeqList *L);//判断学号是否重复的函数的声明

    //顺序表的输入    
void InList(SeqList *L,int i){       //逐个输入学生信息
    int x;
    printf("请输入学生数量:");
    scanf("%d",&x);
    renshu=x;
    for(i=1;i<=x;i++){
        printf("第%d位学生信息\n",i);
        printf("———————————————\n");
        printf("姓名:");
        scanf("%s",&L->stu[i].name);
        printf("———————————————\n");
        printf("学号:");
        scanf("%d",&L->stu[i].num);
        printf("———————————————\n");
        printf("算法成绩:");
        scanf("%d",&L->stu[i].suanfa);
        printf("数据结构成绩:");
        scanf("%d",&L->stu[i].DS);
        printf("———————————————\n");
        L->stu[i].sum=L->stu[i].DS+L->stu[i].suanfa;     //计算总成绩
    }
    L->last=x;
    printf("\n");

 
    //输出顺序表 
void OutList(SeqList *L,int i){  //输出总成绩
    for(i=1;i<=L->last;i++){
        printf("姓名:%s 学号:%d 数据结构:%d 算法:%d 总分:%d\n",L->stu[i].name,L->stu[i].num,L->stu[i].DS,L->stu[i].suanfa,L->stu[i].sum);
    }
    printf("\n");
}
 
     //顺序表的查询 
void Find(SeqList *L){   //顺序表的查询,按照学号查询该学生成绩
    int i=1;
    int n;
    if(L->last<1){      //判断是否为空表 
        printf("没有成绩表\n");
        return;
    }
    printf("输入要查找学生的学号\n");
    scanf("%d",&n);
    while(i<=L->last && L->stu[i].num!=n){  //循环查找对应学号的下标 
        i++;
    }
    if(i<=L->last){
        printf("该学生姓名为:%s 学号为:%d 数据结构成绩为:%d 算法成绩为:%d 总分为:%d\n",L->stu[i].name,L->stu[i].num,L->stu[i].DS,L->stu[i].suanfa,L->stu[i].sum);
        return;
    }
    if(i>L->last){
        printf("学号错误,未查询到该学生\n");
        return;
        }
}
 
    //顺序表的删除
int Delete(SeqList *L, int i){   //从L中删除指定位序i的元素,该元素数组下标为i
    int j;
    int k;
    printf("请输入要删除的学生学号:");
    scanf("%d",&i);
    if(L->last<1){                 //检查是否为空表
        printf("空表!");
        return error;
    }
    for(k=1;k<=L->last;k++){
        if(L->stu[k].num==i)
        break;
    }
    if(k>L->last){
        printf("未找到该学生!\n");
        return error;
    } else{
        for(j=k;j<=L->last;j++)
            L->stu[j]=L->stu[j+1];   //将位序j+1及以后的元素前移
        L->last--;                   //last仍指向最后元素
        return true;
    }
}
 
    //顺序表的插入
int Insert(SeqList *L,int i,Student e){      
//在L的指定位序i中插入一个新元素e;位序i元素的数组位置下表是i
    int j;
    if(L->last==MAXSIZE){  //表空间已满,不能插入
        printf("表满\n");
        return 0;
    }
    if(i<1 || i>L->last+2){   //检查插入位序的合法性:是否在1~n。n为当前元素个数,即last
        printf("位序不合法\n");
        return 0;
    }
    for(j=L->last;j>=i-1;j--)    //last指向序列最后元素
        L->stu[j+1]=L->stu[j];
    L->stu[i]=e;
    L->last++;
    return 1;
}
 
 //主函数 
int main(){
    int N=1,i,j;
    SeqList L;
    Student e,g;
    int renshu,a;
    printf("**********************\n");
    printf("*------选择操作------*\n");
    printf("*------1 登记--------*\n");
    printf("*------2 输出--------*\n");
    printf("*------3 查询--------*\n");
    printf("*------4 删除--------*\n");
    printf("*------5 插入--------*\n");
    printf("*------0 退出--------*\n");
    printf("**********************\n");
    while(N){
        printf("请选择操作\n");
        scanf("%d",&N);
        if(N==1){            //登记成绩
            InList(&L,i);
        }
        else if(N==2){                 //输出成绩
            OutList(&L,i);
        }
        else if(N==3){                 //查询
            Find(&L);
        }
        else if(N==4){                   //删除
            if(Delete(&L,j)){
                renshu--;
                printf("删除成功\n");
            }else {
                printf("删除失败\n");
            }
        }
        else if(N==5){   //插入
            printf("请输入要插入的位置:");
            scanf("%d",&a);
            printf("请输入学生姓名:");
            scanf("%s",&g.name);
            printf("请输入学生学号:");
            scanf("%d",&g.num);
            printf("请输入学生算法成绩:");
            scanf("%d",&g.suanfa);
            printf("请输入学生数据结构成绩:");
            scanf("%d",&g.DS);
            g.sum=g.suanfa+g.DS;
            if(Insert(&L,a,g)){
                renshu++;
                printf("插入成功\n");
            }else {
                printf("插入失败\n");
            }
        }else if(N==0){
            printf("退出成功,按任意键结束\n");
            exit(0);
        }
    }
    return 0;
}

...全文
62 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
coolcalf 2023-05-18
  • 打赏
  • 举报
回复 1

要解决学号不能重复、成绩输入范围在0到100、插入函数中不能插入相同信息的问题,可以进行以下修改:

添加一个辅助函数is_same来检查学号是否重复:
c
Copy code
bool is_same(SeqList *L, int num) {
for (int i = 1; i <= L->last; i++) {
if (L->stu[i].num == num) {
return true;
}
}
return false;
}
在输入成绩时,添加条件判断来限制成绩范围在0到100之间:
c
Copy code
// 输入算法成绩
do {
printf("算法成绩:");
scanf("%d", &L->stu[i].suanfa);
} while (L->stu[i].suanfa < 0 || L->stu[i].suanfa > 100);

// 输入数据结构成绩
do {
printf("数据结构成绩:");
scanf("%d", &L->stu[i].DS);
} while (L->stu[i].DS < 0 || L->stu[i].DS > 100);
在插入函数中,添加条件判断来避免插入相同的学生信息:
c
Copy code
if (is_same(L, g.num)) {
printf("学号重复,插入失败\n");
return 0;
}
完整修改后的代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>

#define MAXSIZE 100

typedef struct {
    char name[20]; //姓名
    int num;       //学号
    int suanfa;    //算法
    int DS;        //数据结构
    int sum;       //总成绩
} Student;

typedef struct {
    Student stu[MAXSIZE]; //线性表占用的数组空间
    int last;             //最后一个元素的下标
} SeqList;                //SeqList顺序表

bool is_same(SeqList *L, int num);

//顺序表的输入
void InList(SeqList *L, int i) {
    int x;
    printf("请输入学生数量:");
    scanf("%d", &x);
    L->last = 0;
    for (i = 1; i <= x; i++) {
        printf("第%d位学生信息\n", i);
        printf("———————————————\n");
        printf("姓名:");
        scanf("%s", &L->stu[i].name);
        printf("———————————————\n");
        do {
            printf("学号:");
            scanf("%d", &L->stu[i].num);
            if (is_same(L, L->stu[i].num)) {
                printf("学号重复,请重新输入\n");
            }
        } while (is_same(L, L->stu[i].num));
        printf("———————————————\n");
        do {
            printf("算法成绩:");
            scanf("%d", &L->stu[i].suanfa);
        } while (L->stu[i].suanfa < 0 || L->stu[i].suanfa > 100);
        printf("数据结构成绩:");
        do {
            scanf("%d", &L->

```c++


```

XK_LZ 2023-05-18
  • 举报
回复 1
@coolcalf 感谢大佬的帮助! 但是大佬,我把这段代码放入整体代码中 L-&gt;stu[i].sum=L-&gt;stu[i].DS+L-&gt;stu[i].suanfa; //计算总成绩 } L-&gt;last=x; printf("\n"); } L-&gt;last=x; printf("\n");这里还是会出现错误,这应该怎么解决?

3,253

社区成员

发帖
与我相关
我的任务
社区描述
CSDN问答频道公告内容发布
社区管理员
  • 社会瑞弟呀
  • ToTensor
  • CSDN问答
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧