实验要求
n个学生的学生基本信息表,每条信息由姓名和年龄、年级和专业组成,试设计一个算法:
- 输出学生基本信息表;
- 键盘输入一个学生姓名,利用顺序查找和折半查找实现关键字的查找算法从学生基本信息表中进行查找,打印出查找结果,如果找到输出学生全部信息,否则输出不存在此学生;
设计要求:
首先设计一个含有多个菜单项的主控菜单程序,显示一个标题“学生信息查找”,标题下方给出6个菜单项的内容和输入提示:
- 输入学生数
- 输入学生姓名基本信息
- 输出学生基本信息表
- 用顺序查找算法的实现查找
- 用折半查找算法的实现查找
- 退出
请选择菜单1--6:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NULLKEY 0
typedef char KeyType;
//学生信息结构定义
typedef struct{
KeyType key[20]; //姓名(关键字域)
int age; //年龄
int grade; //年级
char major[50]; //专业
}Student,HashTable[200];
//定义顺序表
typedef struct{
Student *R;
int length;
}SqList;
//设置监视哨的顺序查找
int Search_Seq(SqList ST,KeyType key[])
{
int i;
strcpy(ST.R[0].key,key);
for(i=ST.length;strcmp(ST.R[i].key,key)!=0;--i);
return i;
}
//折半查找
int Search_Bin(SqList ST,KeyType key[])
{
//利用直接插入排序实现对顺序表的排序
int i, j;
for(i=2;i<=ST.length;++i){
if(strcmp(ST.R[i].key,ST.R[j].key)>0){
ST.R[0] = ST.R[i];
for(j=i-1;strcmp(ST.R[i].key,ST.R[j].key)<0;--j)
ST.R[j+1]=ST.R[j];
ST.R[j+1]=ST.R[0];
}
}
int low=1,high=ST.length,mid;
while(low<=high)
{
mid=(low+high)/2;
if(strcmp(key,ST.R[mid].key)==0)
return mid;
else if(strcmp(key,ST.R[mid].key)<0)
high=mid-1;
else
low=mid+1;
}
return 0;
}
//主函数
int main()
{
SqList ST;
KeyType key[20];
int choice,i,x;
printf("**********学生信息查找**********\n");
printf("1.输入学生数:\n");
printf("2.输入学生姓名基本信息:\n");
printf("3.输出学生基本信息表:\n");
printf("4.用顺序查找算法的实现查找:\n");
printf("5.用折半查找算法的实现查找:\n");
printf("6.退出\n");
printf("********************************\n");
while(choice)
{
printf("请选择菜单1--6:\n");
scanf("%d",&choice);
if(choice>6||choice<=0)
{
printf("您输入的数据有误!\n");
return 0;
}
while(choice<=6)
{
if(choice==1)
{
printf("请输入学生数:\n");
scanf("%d",&ST.length);
break;
}
if(choice==2)
{
printf("请输入学生的基本信息:\n");
printf("请输入每位学生的姓名、年龄、年级和专业:\n");
ST.R=(Student *)malloc(sizeof(Student)*(ST.length+1));
for(i=1;i<=ST.length;i++)
{
getchar();
scanf("%s %d %d %s",ST.R[i].key,&ST.R[i].age,&ST.R[i].grade,&ST.R[i].major);
}
getchar();
break;
}
if(choice==3)
{
printf("输出学生的基本信息表:\n");
for(i=1;i<=ST.length;i++)
printf("姓名:%s\t年龄:%d\t年级%d\t专业:%s\n",ST.R[i].key,ST.R[i].age,ST.R[i].grade,ST.R[i].major);
break;
}
if(choice==4)
{
printf("用顺序查找算法的实现查找:\n");
printf("请输入您要查找的学生的姓名:\n");
getchar();
scanf("%s",key);
x=Search_Seq(ST,key);
if(x==0)
printf("您查找的同学不在本表的记录中喔!\n");
else
{
printf("该同学在学生信息表中的位置为:%d,具体信息为:\n",x);
printf("%s\t%d\t%d\t%s\n",ST.R[x].key,ST.R[x].age,ST.R[x].grade,ST.R[x].major);
}
break;
}
if(choice==5)
{
printf("用折半查找算法的实现查找:\n");
printf("请输入想要查找的学生的姓名:\n");
getchar();
scanf("%s",key);
x=Search_Bin(ST,key);
if(x==0)
printf("您查找的同学不在本表的记录中喔!\n");
else
{
printf("该同学在学生信息表中的位置为:%d,具体信息为:\n",x);
printf("%s\t%d\t%d\t%s\n",ST.R[x].key,ST.R[x].age,ST.R[x].grade,ST.R[x].major);
}
break;
}
if(choice==6)
{
printf("退出\n");
return 0;
}
}
}
}
实验结果:
程序不够完美,发布仅为存档,为大家提供思路即可😬仅供参考!!!