#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include<stdlib.h>
#define max 20
#define elemtype char
typedef struct studentnode//定义学生结构体
{
int sid;
char name[10];
float score;
}studentnode, * student;
typedef struct stu//定义顺序表
{
studentnode data[max];
int last;
}STU;
//输入学生信息
void Insert(STU* L)
{
int num;
printf("请输入学生个数:");
scanf_s("%d", &num);
L->last = num;
int i;
for (i = 0; i < num; i++)
{
printf("学生的学号为:");
scanf_s("%d", &L->data[i].sid);
printf("\n");
printf("学生的姓名为:");
scanf_s("%s", L->data[i].name, 20);
printf("\n");
printf("学生的成绩为:");
scanf_s("%f", &L->data[i].score);
printf("\n");
}
}
//逐个显示学生表中所有学生的相关信息
void xinxi(STU L)
{
int i;
for (i = (L.last - 1); i >= 0; i--)
{
printf("学生的学号为:%d", L.data[i].sid);
printf("\n");
printf("学生的姓名为:%s", L.data[i].name);
printf("\n");
printf("学生的成绩为:%f", L.data[i].score);
printf("\n");
}
}
//给定一个学生信息,插入到表中指定的位置
void Inslist(STU* L, int i)
{
int k;
if ((i < 0) || (i > (L->last + 1)))
{
printf("插入位置不合理");
}
if (L->last >= max)
{
printf("表已满,无法插入");
}
for (k = (L->last); k >= i; k--)
{
L->data[k + 1] = L->data[k];
printf("新增学生的学号为:");
scanf_s("%d", &L->data[i].sid);
printf("\n");
printf("新增学生的姓名为:");
scanf_s("%s", &L->data[i].name, 20);
printf("\n");
printf("新增学生的成绩为:");
scanf_s("%d", &L->data[i].score);
L->last++;
}
}
//删除指定位置的学生记录
void Delete(STU* L, int i)
{
int k;
if ((i < 1) || (i > (L->last + 1)))
{
printf("删除位置不合理");
}
for (k = i; i <= L->last; k++)
{
L->data[k - 1] = L->data[k];
L->last--;
}
printf("删除成功");
}
//统计表中学生个数
void Num(STU L)
{
int num;
num = L.last;
printf("学生个数为;%d", num);
}
//利用直接插入排序或者折半插入排序按照姓名进行排序
void BinSort(STU* L)
{
int low, high, mid;
int i, j;
for (i = 1; i < L->last; i++)
{
studentnode x;
x = L->data[i];
low = 0;
high = i - 1;
while (low <= high)
{
mid = (low + high) / 2;
if (strcmp(x.name ,L->data[mid].name)<0)
high = mid - 1;
else low = mid + 1;
}
for (j = i; j >= low + 1; j--)
{
L->data[j] = L->data[j - 1];
}
L->data[low] = x;
}
for (i = 0; i < L->last; i++)
{
printf("学生的学号为:%d", L->data[i].sid);
printf("\n");
printf("学生的姓名为:%s", L->data[i].name);
printf("\n");
printf("学生的成绩为:%f", L->data[i].score);
printf("\n");
}
}
//利用快速排序按照学号进行排序
int QuickSort(STU* L, int low, int high)
{
int i = low; //第一位
int j = high; //最后一位
studentnode y = L->data[i];
int key = L->data[i].sid; //将第一个数作为基准值-- 先找到一个基准值
while (i < j)
{
while (i < j && L->data[j].sid >= key)
{
j--;
}
L->data[i] = L->data[j];
while (i < j && L->data[i].sid <= key)
{
i++;
}
L->data[j] = L->data[i];
}
L->data[i] = y;
if (i - 1 > low)
{
QuickSort(&L, low, i - 1);
}
if (i + 1 < high)
{
QuickSort(&L, i + 1, high);
}
return 0;
}
//根据学号进行折半查找,要求使用非递归算法实现,成功返回此学生的姓名和成绩。
studentnode Binsrch(STU L)
{
int low = 1;
int high = L.last;
int k;
printf("请输入要查找的学号:");
scanf_s("%d", &k);
printf("\n");
while (low <= high)
{
int mid = (low + high) / 2;
if (k == L.data[mid].sid)
{
return L.data[mid];
}
else if (k < L.data[mid].sid)
high = mid - 1;
else low = mid + 1;
}
}
//根据姓名进行折半查找,要求使用递归算法实现,成功返回此学生的学号和成绩
studentnode insrch(STU L, studentnode i, int low, int high) {
while (low <= high) {
int z = (low + high) / 2;
if (strcmp(i.name, L.data[z].name) == 0) {
return L.data[z];
}
else if (strcmp(i.name, L.data[z].name) < 0) {
return insrch(L, i, low, z - 1);
}
else
return insrch(L, i, z + 1, high);
}
}
void showMenu()
{
printf("---------学生信息管理系统-----------\n");
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("* 9.按照姓名进行查找 *\n");
printf("* 0. 退出系统 *\n");
printf("------------------------------------\n");
}
int main()
{
STU L;
int command;
showMenu();
printf("请选择:");
scanf_s("%d", &command);
printf("\n");
while (1)//根据command的值执行不同的值
{
switch (command) {
case 1: {
Insert(&L);//输入学生信息
}; break;
case 2: {
xinxi(L);//逐个显示学生表中所有学生的相关信息
}; break;
case 3: {
int i;
printf("插入信息的位置为:");
scanf_s("%d", &i);
Inslist(&L, i);//给定一个学生信息,插入到表中指定的位置
}; break;
case 4:
{
int a;
printf("删除信息的位置为:");
scanf_s("%d", &a);
Delete(&L, a);//删除指定位置的学生记录
}; break;
case 5:
Num(L);//统计表中学生个数
break;
case 6: {
BinSort(&L);//利用折半插入排序按照姓名进行排序
}; break;
case 7: {
QuickSort(&L,0,L.last-1 );
xinxi(L);//快速排序
}; break;
case 8: {
studentnode j = Binsrch(L);//根据学号进行折半查找,要求使用非递归算法实现,成功返回此学生的姓名和成绩。
printf("学生的姓名为:%s学生的成绩:%f", j.name, j.score);
}; break;
case 9: {
studentnode i;
printf("请输入学生姓名:");
scanf(" %s", i.name);
studentnode o = insrch(L, i, 0, L.last);//根据姓名进行折半查找,要求使用递归算法实现,成功返回此学生的学号和成绩
printf("学号:%d 成绩:%f", o.sid, o.score);
}; break;
case 0:exit(0);//退出系统
}
printf("按任意健继续");
_getch();//让程序暂停一下,按任意键继续
system("cls");//清除屏幕
showMenu();
printf("请选择:");
scanf("%d", &command);
}
return 0;
}
代码小白 有错勿喷