数据结构与算法实验10-查找和排序

、实验目的

掌握运用数据结构两种基本运算查找和排序,并能通过其能解决应用问题。

二、实验软硬件要求

1、VC++ 6.0

三、实验预习

查找排序相关算法

四、实验内容(实验步骤、测试数据等)

为宿舍管理人员编写一个宿舍管理查询软件, 程序采用交互工作方式,其流程如下:
开 始
建立数据文件
数据文件按关键字(姓名、学号、房号)进行排序(冒泡、选择、快速等任选一种)
查询菜单: (用二分查找实现以下操作)
1.按姓名查询
2.按学号查询
3.按房号查询
打印任一查询结果(可以连续操作)

运行结果:

    实验体会

  (可以记录C语言中薄弱的部分,便于课后复习巩固,每次实验体会需要写两行。)

该章节上课掌握不够牢固,学习和理解的冒泡排序法的基本思想和运用,对其的熟练程度还不高,需要进一步的强化。

 六、源代码或重要代码

#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");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);

 }

  order(R);

}

int main()

{

 SqList R;

 R.length=0;

 order(R);

 return 0;

}

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值