(查找排序)为宿舍管理人员编写一个宿舍管理查询软件, 程序采用交互工作方式(两种)
实验目的
掌握运用数据结构两种基本运算查找和排序,并能通过其能解决应用问题。
实验内容(实验步骤、测试数据等)
为宿舍管理人员编写一个宿舍管理查询软件, 程序采用交互工作方式,其流程如下:
开 始
建立数据文件
数据文件按关键字(姓名、学号、房号)进行排序(冒泡、选择、快速等任选一种)
查询菜单: (用二分查找实现以下操作)
1.按姓名查询
2.按学号查询
3.按房号查询
打印任一查询结果(可以连续操作)
代码实现
/*为宿舍管理人员编写一个宿舍管理查询软件, 程序采用交互工作方式,其流程如下:
开 始
建立数据文件
数据文件按关键字(姓名、学号、房号)进行排序(冒泡、选择、快速等任选一种)
查询菜单: (用二分查找实现以下操作)
1.按姓名查询
2.按学号查询
3.按房号查询
打印任一查询结果(可以连续操作)
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 100
typedef int KeyType;
typedef char InfoType[32];
typedef struct
{
//KeyType key;//关键字
int number;//学号
InfoType name;//名字
int house_number;//房号
}NodeType;
typedef struct
{
NodeType data[MAX];//数据内容
int length;//长度
}SqList;
//打印小条数据
int pr(SqList R,int mid)
{
putchar('\n');
printf("学号 \t 姓名 \t 房号 \t \n");
printf("%d \t %s \t %d \t",R.data[mid].number,R.data[mid].name,R.data[mid].house_number);
putchar('\n');
return 0;
}
//先进行多种排序
//按照姓名排序由小到大排序,冒泡排序
void Sort_name(SqList &R)
{
int i,j;
NodeType temp;
for(i=0;i<R.length-1;i++)
for(j=i+1;j<R.length;j++)
if(strcmp(R.data[i].name,R.data[j].name)>0)
{
temp=R.data[i];
R.data[i]=R.data[j];
R.data[j]=temp;
}
}
//按照学号排序由小到大排序,冒泡排序
void Sort_number(SqList &R)
{
int i,j;
NodeType temp;
for(i=0;i<R.length-1;i++)
for(j=i+1;j<R.length;j++)
if(R.data[i].number>R.data[j].number)
{
temp=R.data[i];
R.data[i]=R.data[j];
R.data[j]=temp;
}
}
//按照房号排序由小到大排序,冒泡排序
void Sort_house_number(SqList &R)
{
int i,j;
NodeType temp;
for(i=0;i<R.length-1;i++)
for(j=i+1;j<R.length;j++)
if(R.data[i].house_number>R.data[j].house_number)
{
temp=R.data[i];
R.data[i]=R.data[j];
R.data[j]=temp;
}
}
//学号与姓名具有唯一性,但房号确不具有
int BinSearch(SqList &R)
{
int low,high,mid,t,flag;
char name_search[32];
int number_search,house_number_search;;
do{
printf("\n查询菜单: \n");
printf("1.按姓名查询 \n");
printf("2.按学号查询 \n");
printf("3.按房号查询 \n");
printf("0.退出查询 \n");
scanf("%d",&t);
flag=0;
low=0,high=R.length-1;
switch(t)
{
case 1:
printf("请输入要查询的姓名:");
scanf("%s",name_search);
Sort_name(R);
while(low<=high)
{
mid=(low+high)/2;
if(strcmp(R.data[mid].name,name_search)==0)
{
pr(R,mid);
flag=1;
break;
}
if(strcmp(R.data[mid].name,name_search)>0)
high=mid-1;
else low=mid+1;
}
if(flag==0)
printf("\n未找到该信息!\n");break;
case 2:
printf("请输入要查询的学号:");
scanf("%d",&number_search);
Sort_number(R);
while(low<=high)
{
mid=(low+high)/2;
if(R.data[mid].number==number_search)
{
pr(R,mid);
flag=1;
break;
}
if(R.data[mid].number>number_search)
high=mid-1;
else low=mid+1;
}
if(flag==0)
printf("\n未找到该信息!\n");break;
case 3:
printf("请输入要查询的房号:");
scanf("%d",&house_number_search);
Sort_house_number(R);
while(low<=high)
{
mid=low+(low+high)/2;
if(R.data[mid].house_number==house_number_search)
{
flag=1;
while(mid>=0)
{
if(R.data[mid].house_number!=house_number_search)
break;
mid--;
}
mid++;
while(R.data[mid].house_number==house_number_search)
{
pr(R,mid);
mid++;
}
break;
}
if(R.data[mid].house_number>house_number_search)
high=mid-1;
else low=mid+1;
}
if(flag==0)
printf("\n未找到该信息!\n");break;
case 0:
printf("\n退出查询\n");break;
default :
printf("\n ERROR \n");break;
}
}while(t!=0);
return 0;
}
int search(SqList R,int key,int col)
{
int *p=&R.data[0].number;
for(int i=0;i<R.length;i++)
{
//int *q 默认地址是int类型 +4
int *q=(p+i*2)+col;
if(*q==key)
{
return *q;
}
}
int *p=(int *)0x1000;
printf("%p\n",p+1);
}
void create(SqList &R)
{
int number,house_number;
char name[32];
printf("\n添加数据\n");
printf("学号 \t,姓名 \t,房号 \t \n");
scanf("%d %s %d",&number,&name,&house_number);
R.data[R.length].number=number;
strcpy(R.data[R.length].name,name);
R.data[R.length].house_number=house_number;
R.length++;
}
void show(SqList &R)
{
int i;
printf("学号 \t姓名 \t房号 \t");
for(i=0;i<R.length;i++)
{
putchar('\n');
printf("%d \t %s \t %d \t",R.data[i].number,R.data[i].name,R.data[i].house_number);
}
}
void choose()
{
printf("\n1.添加数据\n");
printf("2.展示数据\n");
printf("3.查找数据\n");
printf("0.退出\n");
}
void order(SqList &R)
{
int n;
choose();
printf("请问你想选择的功能\n");
scanf("%d",&n);
switch(n)
{
case 1: create(R);order(R);break;
case 2: show(R);order(R);break;
case 3: BinSearch(R);order(R);break;
case 0: exit(0);break;
default:order(R);
}
}
int main()
{
SqList R={{20172064,"吴琦凡",211,20172060,"肖福鑫",211,20172061,"谢东锟",211,20172057,"江琛",207,20172066,"郑锦宏",212},5};
order(R);
return 0;
}
运行结果
代码思路
把多个类似重复的查找代码合并成一个,利用地址进行查找。
第二种
/*为宿舍管理人员编写一个宿舍管理查询软件, 程序采用交互工作方式,其流程如下:
开 始
建立数据文件
数据文件按关键字(姓名、学号、房号)进行排序(冒泡、选择、快速等任选一种)
查询菜单: (用二分查找实现以下操作)
1.按姓名查询
2.按学号查询
3.按房号查询
打印任一查询结果(可以连续操作)
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 100
typedef int KeyType;
typedef char InfoType[32];
typedef struct
{
KeyType key;//关键字
InfoType name;//名字
int number;//学号
int house_number;//房号
}NodeType;
typedef struct
{
NodeType data[MAX];//数据内容
int length;//长度
}SqList;
//打印小条数据
int pr(SqList R,int mid)
{
putchar('\n');
printf("学号 \t 姓名 \t 房号 \t \n");
printf("%d \t %s \t %d \t",R.data[mid].number,R.data[mid].name,R.data[mid].house_number);
putchar('\n');
return 0;
}
//先进行多种排序
//按照姓名排序由小到大排序,冒泡排序
void Sort_name(SqList &R)
{
int i,j;
NodeType temp;
for(i=0;i<R.length-1;i++)
for(j=i+1;j<R.length;j++)
if(strcmp(R.data[i].name,R.data[j].name)>0)
{
temp=R.data[i];
R.data[i]=R.data[j];
R.data[j]=temp;
}
}
//按照学号排序由小到大排序,冒泡排序
void Sort_number(SqList &R)
{
int i,j;
NodeType temp;
for(i=0;i<R.length-1;i++)
for(j=i+1;j<R.length;j++)
if(R.data[i].number>R.data[j].number)
{
temp=R.data[i];
R.data[i]=R.data[j];
R.data[j]=temp;
}
}
//按照房号排序由小到大排序,冒泡排序
void Sort_house_number(SqList &R)
{
int i,j;
NodeType temp;
for(i=0;i<R.length-1;i++)
for(j=i+1;j<R.length;j++)
if(R.data[i].house_number>R.data[j].house_number)
{
temp=R.data[i];
R.data[i]=R.data[j];
R.data[j]=temp;
}
}
//学号与姓名具有唯一性,但房号确不具有
int BinSearch(SqList &R)
{
int low,high,mid,t,flag;
char name_search[32];
int number_search,house_number_search;;
do{
printf("\n查询菜单: \n");
printf("1.按姓名查询 \n");
printf("2.按学号查询 \n");
printf("3.按房号查询 \n");
printf("0.退出查询 \n");
scanf("%d",&t);
flag=0;
low=0,high=R.length-1;
switch(t)
{
case 1:
printf("请输入要查询的姓名:");
scanf("%s",name_search);
Sort_name(R);
while(low<=high)
{
mid=(low+high)/2;
if(strcmp(R.data[mid].name,name_search)==0)
{
pr(R,mid);
flag=1;
break;
}
if(strcmp(R.data[mid].name,name_search)>0)
high=mid-1;
else low=mid+1;
}
if(flag==0)
printf("\n未找到该信息!\n");break;
case 2:
printf("请输入要查询的学号:");
scanf("%d",&number_search);
Sort_number(R);
while(low<=high)
{
mid=(low+high)/2;
if(R.data[mid].number==number_search)
{
pr(R,mid);
flag=1;
break;
}
if(R.data[mid].number>number_search)
high=mid-1;
else low=mid+1;
}
if(flag==0)
printf("\n未找到该信息!\n");break;
case 3:
printf("请输入要查询的房号:");
scanf("%d",&house_number_search);
Sort_house_number(R);
while(low<=high)
{
mid=(low+high)/2;
if(R.data[mid].house_number==house_number_search)
{
pr(R,mid);
flag=1;
low=mid+1;
}
if(R.data[mid].house_number>house_number_search)
high=mid-1;
else low=mid+1;
}
if(flag==0)
printf("\n未找到该信息!\n");break;
case 0:
printf("\n退出查询\n");break;
default :
printf("\n ERROR \n");break;
}
}while(t!=0);
return 0;
}
void create(SqList &R)
{
int number,house_number;
char name[32];
printf("\n添加数据\n");
printf("学号 \t,姓名 \t,房号 \t \n");
scanf("%d %s %d",&number,&name,&house_number);
R.data[R.length].number=number;
strcpy(R.data[R.length].name,name);
R.data[R.length].house_number=house_number;
R.length++;
}
void show(SqList &R)
{
int i;
printf("学号 \t姓名 \t房号 \t");
for(i=0;i<R.length;i++)
{
putchar('\n');
printf("%d \t %s \t %d \t",R.data[i].number,R.data[i].name,R.data[i].house_number);
}
}
void choose()
{
printf("\n1.添加数据\n");
printf("2.展示数据\n");
printf("3.查找数据\n");
printf("0.退出\n");
}
void order(SqList &R)
{
int n;
choose();
printf("请问你想选择的功能\n");
scanf("%d",&n);
switch(n)
{
case 1: create(R);order(R);break;
case 2: show(R);order(R);break;
case 3: BinSearch(R);order(R);break;
case 0: exit(0);break;
default:order(R);
}
}
int main()
{
SqList R;
R.length=0;
order(R);
return 0;
}
代码思路
输出与前面一致,查找的代码重复率比较高,没有进行合并。