数据结构试验

实验四  排序方法实践(2学时)

1、实验目的

通过本实验掌握排序的基本算法和过程以及查找的基本方法和过程。

2、实验内容

设计一个排序和查找系统。能够实现对给定的一组学生的借书证信息(如:卡号、姓名、系别、班号等)进行排序和查找。

1)按照卡号顺序进行排序;

2)能够实现查找某个系的所有的借书卡号并输出。

3、实验要求

(1)建立关于借书证信息结点的结构体;

(2)定义借书证信息的记录并录入基本信息;

(3)写出用某种排序算法(如冒泡排序)按关键字对记录进行排序的算法函数;

(4)对借书证信息的记录按系名建立索引查找结构;

(5)输入某个要查找的系名,用索引查找方法查找并输出该系的所有借书证信息。

源码

#include"stdio.h"

#include"stdlib.h"

#include"string.h"

# define MAXSIZE 100

 struct student

{

       intnumber;//卡号

       charname[8];//名字

       charmajor[20];//专业

       intclassnumber;//班号

};

 

typedef struct studentlist

{

       structstudent  key;

       intlength;

       intr[MAXSIZE];

}table;

void input(table *tab)

{

       chars='Y';

       tab->length=1;

       while((s=='Y'||s=='y')&&tab->length<MAXSIZE)

       {

       printf("请输入卡号:\n");

       scanf("%d",&tab->key.number);

       printf("请输入姓名:\n");

       scanf("%s",tab->key.name);

       printf("请输入专业:\n");

       scanf("%s",tab->key.major);

       printf("请输入班号:\n");

       scanf("%d",&tab->key.classnumber);

       printf("请问是否继续输入Y/N");

       getchar();

       scanf("%c",&s);

       tab->length++;

}

}

void output2(table *tab)

{

       printf("卡号:%d\n",tab->key.number);

       printf("姓名:%s\n",tab->key.name);

       printf("专业:%s\n",tab->key.major);

       printf("班号:%d\n",tab->key.classnumber);

}

void output(table *tab)

{

       printf("卡号:%d\n",tab->key.number);

       printf("姓名:%s\n",tab->key.name);

       printf("专业:%s\n",tab->key.major);

       printf("班号:%d\n",tab->key.classnumber);

      

}

void shellinsertsort(table *tab)

{

       inti,j,d;

       d=tab->length/2;

       while(d>=1)

       {

              for(i=d+1;i<=tab->length;i++)

              {

                     tab->r[0]=tab->r[i];

                     j=i-d;

                     while(j>0&&tab->key.number<tab->key.number)

                     {

                            tab->r[j+d]=tab->r[j];

                            j=j-d;

                     }

                     tab->r[j+d]=tab->r[0];

              }

              d=d/2;

       }

       for(i=0;i<tab->length;i++)

       {

   output(tab);

    }

}

void search(table *tab)

{

       inti=1,j=1;

       charmajor[20];

       printf("请输入你要查找的系名:");

       scanf("%s",major);

       while(i<tab->length)

       {

              if(!strcmp(tab->key.major,major))

              {

              output(tab);

              j=0;

       }

       i++;

       }

 if(j)

 printf("不存在!!!");

}

int main()

{

       intx,select=1;

       tabletabl;

       while(select)

       {

              printf("\t\t\t\t------------------\n");

              printf("\t\t\t\t|1录入信息       |\n");

              printf("\t\t\t\t|2  输出           |\n");

              printf("\t\t\t\t|3  排序输出           |\n");

              printf("\t\t\t\t|4  查找           |\n");

              printf("\t\t\t\t|5  退出           |\n");

              printf("\t\t\t\t------------------\n");

              printf("请输入选择");

              scanf("%d",&x);

              switch(x)

              {

                     case1:input(&tabl);break;

                     case2:output2(&tabl);break;

                     case3:shellinsertsort(&tabl);break;

                     case4:search(&tabl);break;

                     case5:select=0;printf("退出成功");break;

                     default:printf("请重新输入!!!");

               }

       }

       return0;

}

 

 

 

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值