#include<stdio.h> #include<string.h> #include<stdlib.h> #define MAXSIZE 100 typedef int Status;// 定义函数返回值类型 typedef int ElemType; // 定义每条数据的结构体类型 typedef struct { char number[20];// 学号 char name[20];// 姓名 int score; // 成绩 } Student; typedef struct { Student *elem;// 存储空间的基地址 int length;// 当前长度 } SqList; SqList L; void build(SqList * L) // 构造空的顺序表 L { L->elem = (Student *) (malloc(sizeof(Student) * MAXSIZE)); //申请空间 L->length = 0;//空表的长度为0 if (!L->elem) printf("建立顺序表失败 "); } Status inputsqlist(SqList * L)//按照顺序输入数据 { system("cls");//清屏 int l, n = 0; printf("请输入学生的数量:"); scanf("%d", &l); /*依次输入l名学生的数据*/ while (n < l) { if (n >= 100) { printf("内存超限 "); return 0; } /*输入第n名学生的数据*/ printf("第%d位学生信息 ", n + 1); printf(" "); printf("学号:"); scanf("%s", L->elem[n].number);//输入学生学号 printf("----------------------------- "); printf("姓名:"); scanf("%s", L->elem[n].name);//输入学生姓名 printf("----------------------------- "); printf("成绩:"); scanf("%d", &L->elem[n].score);//输入学生成绩 printf("----------------------------- "); L->length++;//增加数据长度 n++; } } Status outputsqlist(SqList L)//按照位置显示所有信息 { system("cls");//清屏 int i = 0; printf("所有学生的相关信息为: ");//按位置依次显示学生信息 while (i < L.length) { printf("学号:%s 姓名:%s 成绩:%d ", L.elem[i].number, L.elem[i].name, L.elem[i].score); i++; } } Status searchsqlist(SqList * L, Student e) //按照姓名对数据搜寻 { for (int i = 0; i < L->length + 1; i++) { if (!strcmp(L->elem[i].name, e.name)) //比较需要查找的值与 return i + 1; } } Status locatesqlist(SqList L)//按照姓名查找 { system("cls");//清屏 Student e;//需要查找的数据 int temp;//中间量 printf("请输入你要查找的姓名:"); scanf("%s", e.name);//输入需要查找的数据的姓名 temp = searchsqlist(&L, e); if (temp != 0) /*如果找到数据则输出该条数据的全部内容*/ printf("学号:%s 成绩:%d ", L.elem[temp - 1].number, L.elem[temp - 1].score); else /*如果没有找到与已经存入的数据相同的数据显示失败*/ printf("查找失败! "); } Status insersqlist(SqList * L)//插入学生信息 { system("cls");//清屏 int i, k = 0;//i是要插入的位置 Student e; printf("请输入你要插入的位置:"); scanf("%d", &i); /*↓↓在L中第i个位置之前插入新的数据元素e,L的长度加1↓↓*/ if(i<1 || i > L->length + 1) /*不允许在第0个数据之前或者最后一个后的数据之后插入数据*/ { printf("插入位置有误 "); return 0; } if (L->length >= MAXSIZE) { printf("数据溢出 "); return 0; } printf("请输入插入学生信息: "); /*输入所需要插入的学生的数据*/ printf("学号:"); scanf("%s", e.number); printf("姓名:"); scanf("%s", e.name); printf("成绩:"); scanf("%d", &e.score); if (i == L->length + 1) {/*如果插入的元素在最后一位则只用在最后的位置输入数据无需移动其他数据的位置 */ L->elem[i - 1] = e;//使最后的数据改变为所要插入的数据 L->length++;//长度加1 return 1; } for (k = L->length - 1; k >= i - 1; --k)/*从最后一个元素开始每个元素向后移动位置并且长度改变 */ L->elem[k + 1] = L->elem[k];//第k+1元素后移 L->elem[i - 1] = e;////使第i改变为所要插入的数据 L->length++;//长度加1 return 1; } Status deletesqlist(SqList * L) //删除指定位置学生记录 { system("cls");//清屏 int i, j = 0, k;//i指要删除的数据的位置,j指循环的次数,k指当前循环次数所对应的元素的位置 printf("请输入要删除学生的位置:"); scanf("%d", &i); if (i == 0 || i > L->length) {//如果需要删除数据的位置没有数据则删除失败 printf("删除失败"); return 0; } while (j <= L->length) { if (L->length != j) //定位需要删除的数据 j++; else { for (k = j + 1; k < L->length; k++) L->elem[k - 1] = L->elem[k]; //将后面元素依次前移 L->length--;//长度减1 break; } } } Status sumsqlist(SqList * L) //显示学生总数 { int sum = 0; sum = L->length;//结构体SqList中的length表示数据的条数 printf("总学生个数为:%d ", sum); } int main() { int choice; build(&L);//调用函数建立一个空表 do {/*显示操作界面*/ printf("******************************************************************** "); printf("* 1. 根据指定学生个数,逐个输入学生信息,建立信息表; * "); printf("* 2. 显示学生表中所有学生的相关信息; * "); printf("* 3. 根据姓名进行查找,返回此学生的学号和成绩; * "); printf("* 4. 给定一个学生信息,插入到表中指定的位置; * "); printf("* 5. 删除指定位置的学生记录; * "); printf("* 6. 统计表中学生个数; * "); printf("* 0. 退出。 * "); printf("******************************************************************** "); printf(" "); printf("请选择你要操作的选项:"); scanf("%d", &choice);//输入需要进行的选项 printf(" "); system("cls");//清屏 switch (choice) { case 1:{ inputsqlist(&L);//调用函数依位置输入数据 break; } case 2:{ outputsqlist(L);//调用函数按位置的前后输出数据 break; } case 3:{ locatesqlist(L);//调用函数按照姓名查找学生信息 break; } case 4:{ insersqlist(&L);//调用函数按照位置插入学生信息 break; } case 5:{ deletesqlist(&L);//调用函数按照删除指定位置学生信息 break; } case 6:{ sumsqlist(&L);//调用函数统计学生总数 break; } case 0:{ printf(" 退出系统成功!请按任意键结束! ");//退出程序 exit(0); } break; } } while (choice);//只要选择不为需要进行的功能不为0则该程序可以一直进行下去 }