这是题目内容:
用线性数组做一个班级学生档案记录的程序,要求:
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可以使用,但是其他选择在运行的时候会出问题,不知道怎么修改。
运行选择三的时候会出现(引发了异常: 读取访问权限冲突),不知道为什么
其他选择还没用,不知道怎么改