&Meku 、 2021-06-07 16:39 采纳率: 100%
浏览 29
已结题

线性表实现学生信息表,运行时出现问题不知道怎么解决

这是题目内容:

用线性数组做一个班级学生档案记录的程序,要求:

    1)用结构体表示学生记录,包括但不限于:学号、姓名、性别、班级、生日、宿舍、籍贯等信息;

    2)学生记录用数组存储,按照学号递增顺序记录;

    3)学生记录插入:插入包括自己在内的10名学生;

    4)学生记录删除:删除指定位置学生;

    5)查找学生:根据姓名查找学生在记录中的位序;


#include<stdio.h>  
#include<malloc.h>  
#include<stdlib.h>  
#include<string.h>  
#define OK 1  
#define ERROR 0  
#define OVERFLOW -2  
#define MAXSIZE 1000 
typedef int Status; // 定义函数返回值类型  
typedef struct
{
    int num;		//学号
    char name[20];	//姓名
    char sex;		//性别
    int age;		//年龄
    char place[10];	//籍贯
    float weight;	//体重
    float height;	//身高
    int birthday;	//生日
    int dormitory;	//宿舍
}student;
typedef student ElemType;
typedef struct
{
    ElemType* elem; // 存储空间的基地址   
    int length; // 当前长度   
}SqList;
Status InitList(SqList* L) // 构造空的顺序表 L   
{
    L->elem = (ElemType*)malloc(sizeof(ElemType) * MAXSIZE);
    if (!L->elem)  exit(OVERFLOW);  		//分配失败退出 
    L->length = 0;  		//长度为0 
    return OK;
}
ElemType GetElem(SqList& L, int i) // 访问顺序表,找到 i位置,返回给 e  
{
    return L.elem[i];
}
int Search(SqList& L, char str[]) // 根据名字查找,返回该同学在顺序表中的编号   
{
    for (int i = 1;i <= L.length;i++)  	//查找成功,返回序号 i+1
    {
        if (strcmp(L.elem[i].name, str) == 0)
            return i;
    }
    return 0;
}
Status ListInsert(SqList& L, int i, ElemType e) // 在 i位置插入某个学生的信息   
{
    if ((i < 1) || (i > L.length + 1)) return ERROR;
    if (L.length == MAXSIZE)   return ERROR;
    for (int j = L.length;j >= i;j--)
    {
        L.elem[j + 1] = L.elem[j];  	//插入位置及之后的元素后移
    }
    L.elem[i] = e;  		//将新元素e放入第i个位置
    ++L.length;
    return OK;
}
Status ListDelete(SqList& L, int i) // 在顺序表中删除 i位置的学生信息   
{
    if ((i < 1) || (i > L.length))   return ERROR;
    for (int j = i;j <= L.length;j++)
    {
        L.elem[j] = L.elem[j + 1];  	//被删除元素之后的元素前移
    }
    --L.length;  	//长度减一 
    return OK;
}
void Input(ElemType* e)  		//输入 
{
    printf(" 学号:");
    scanf_s("%d", &e->num);
    printf(" 姓名:");
    scanf_s("%s", e->name, 4);
    printf(" 性别:");
    scanf_s("%s", &e->sex, 3);
    printf(" 年龄:");
    scanf_s("%d", &e->age);
    printf(" 籍贯:");
    scanf_s("%s", e->place, 20);
    printf(" 体重:");
    scanf_s("%f", &e->weight);
    printf(" 身高:");
    scanf_s("%f", &e->height);
    printf(" 生日:");
    scanf_s("%d", &e->birthday);
    printf(" 宿舍:");
    scanf_s("%d", &e->dormitory);
    printf("输入完成\n\n");
}
void Output(ElemType& e)  		//输出 
{
    printf_s("学号:%d 姓名:%s 性别:%s 年龄:%d 籍贯:%s 体重:%f 身高:%f 生日:%d 宿舍:%d", e.num, &e.name, e.sex, e.age, &e.place, e.weight, e.height, e.birthday, e.dormitory);
}
int main()
{
    SqList L ;
    ElemType a, b, c, d;
    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("0. 退出\n");
    int x = 0, choose;
    while (1)
    {
        printf("请输入你要选择的功能前的序号:");
        scanf_s("%d", &choose);
        if (choose == 0)   break;
        switch (choose)
        {
        case 1:
            if (InitList(&L))
                printf("成功建立顺序表\n");
            else
                printf("顺序表建立失败\n");
            break;
        case 2:
            printf("请输入要录入学生的人数:");
            scanf_s("%d", &x);
            for (int i = 1;i <= x;i++)
            {
                printf("第%d个学生:\n", i);
                Input(&L.elem[i]);
            }
            L.length = x;
            break;
        case 3:
            for (int i = 1;i <= x;i++)
            {
                a = GetElem(L, i);
                Output(a);
            }
            break;
        case 4:
            char s[20];
            printf("请输入要查找的学生姓名:");
            scanf_s("%s", s, 4);
            if (Search(L, s))
                Output(L.elem[Search(L, s)]);
            else
                printf("对不起,查无此人\n");
            printf_s("");
            break;
        case 5:
            printf_s("请输入要查询的位置:");
            int id1;
            scanf_s("%d", &id1);
            b = GetElem(L, id1);
            Output(b);
            break;
        case 6:
            printf("请输入要插入的位置:");
            int id2;
            scanf_s("%d", &id2);
            printf("请输入学生信息:\n");
            Input(&c);
            if (ListInsert(L, id2, c))
            {
                x++;
                printf("插入成功\n");
            }
            else
            {
                printf("插入失败\n");
            }
            break;
        case 7:
            printf("请输入要删除的位置:");
            int id3;
            scanf_s("%d", &id3);
            if (ListDelete(L, id3))
            {
                x--;
                printf("删除成功\n");
            }
            else
            {
                printf("删除失败\n");
            }
            break;
        case 8:
            printf("已录入的学生个数为:%d\n\n", L.length);
            break;
        }
    }
    printf("\n\n请按任意键退出\n\n");
    return 0;
}

可以正常编译,选择1和选择2可以使用,但是其他选择在运行的时候会出问题,不知道怎么修改。

    运行选择三的时候会出现(引发了异常: 读取访问权限冲突),不知道为什么

其他选择还没用,不知道怎么改

  • 写回答

1条回答 默认 最新

  • wlj1234 2021-06-08 10:29
    关注

    字符串输出格式不正确,字符串变量本身就是指针,不应该再取地址,单个字符的输出格式是“%c”

    printf_s("学号:%d 姓名:%s 性别:%c 年龄:%d 籍贯:%s 体重:%f 身高:%f 生日:%d 宿舍:%d", e.num, e.name, e.sex, e.age, e.place, e.weight, e.height, e.birthday, e.dormitory);

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

报告相同问题?

问题事件

  • 系统已结题 10月18日
  • 已采纳回答 10月10日

悬赏问题

  • ¥15 yolov8边框坐标
  • ¥15 matlab中使用gurobi时报错
  • ¥15 WPF 大屏看板表格背景图片设置
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真