数据结构C语言实现二分查找
- 格式:doc
- 大小:46.50 KB
- 文档页数:7
实验课题:【用C描述课本的同学】有以下结构体构成的数组:struct StudentInfo{ char ID[10];char * name;float score;}StuInfo[12]={{"0800301105", "JACK", 95},{"0800201505", "LUN", 85},{"0400820115", "MARY", 75.5},{"0400850122", "KATE", 78.9},{"0500201011", "LILI", 88},{"0800401105", "JACK", 96},{"0600830105", "JAN", 98.4},{"0952520012", "SAM", 75},{"9721000045", "OSCAR", 64},{"0700301105", "JACK", 97},{"0458003312", "ZOE", 68.9},{"0400830211", "BOBI", 87.6}};对数组StuInfo按照学号(ID)递增排序,然后用二分查找的方法进行学号查找,若找到则输出该学生的全部信息,若找不到相应记录也给出提示;接下来,对该数组按照学分绩(score)递减排序后,使用二分查找法以学分绩作关键字进行查找。
用C++版教科书的同学:对MyBirds分别以name和ID为关键字排序,然后进行二分查找。
实验程序1:#include<stdio.h>#include<string.h>#include<malloc.h>#define cutoff (3)struct StudentInf0{ char ID[11];char * name;float score;}StuInfo[12]={{"0800301105", "JACK", 95},{"0800201505", "LUN", 85},{"0400820115", "MARY", 75.5},{"0400850122", "KATE", 78.9},{"0500201011", "LILI", 88},{"0800401105", "JACK", 96},{"0600830105", "JAN", 98.4},{"0952520012", "SAM", 75},{"9721000045", "OSCAR", 64},{"0700301105", "JACK", 97},{"0458003312", "ZOE", 68.9},{"0400830211", "BOBI", 87.6}};void dizenginsertionsort(struct StudentInf0 *m,int n){ int j,p;struct StudentInf0 tmp;for(p=1;p<n;p++){ tmp=StuInfo[p];for(j=p;j>0&&strcmp((m+j-1)->ID,tmp.ID)>0;j--)StuInfo[j]=StuInfo[j-1];StuInfo[j]=tmp;}}void dijianinsertionsort(struct StudentInf0 *m,int n){ int j,p;struct StudentInf0 tmp;for(p=1;p<n;p++){ tmp=StuInfo[p];for(j=p;j>0&&(m+j-1)->score<tmp.score;j--)StuInfo[j]=StuInfo[j-1];StuInfo[j]=tmp;}}int search(char s[],struct StudentInf0 *m){ int center,left=0,right=11;center=(left+right)/2;while(strcmp(s,(m+center)->ID)){if(left==center){ if(!strcmp(s,(m+right)->ID)){ center=right;break;}else { center=-1;printf("不存在此学号");break;}}if(strcmp(s,(m+center)->ID)>0)left=center;elseright=center;center=(left+right)/2;}return center+1;}int xuefensearch(float a,struct StudentInf0 *m){ int center,left=0,right=11;center=(left+right)/2;while(a!=(m+center)->score){if(left==center){ if(a==(m+right)->score){ center=right;break;}else { center=-1;printf("不存在此学分绩");break;}}if(a>(m+center)->score)right=center;elseleft=center;center=(left+right)/2;}return center+1;}main(){ float a;int center,l=0;char c[100];dizenginsertionsort(StuInfo,12);printf("ID升序排列所得结果:\n");while(l<12){ printf("%s %7s %3.1f",StuInfo[l].ID,StuInfo[l].name,StuInfo[l].score);printf("\n");l++;}printf("请输入需要查找的学号ID:");gets(c);center=search(c,StuInfo);if(center){ printf("存在此学号");printf("该学生的全部信息是:%s %7s %3.1f\n",StuInfo[center-1].ID,StuInfo[center-1].name,StuInfo[center-1].score);}dijianinsertionsort(StuInfo,12);printf("学分绩降序排列所得结果:\n");l=0;while(l<12){ printf("%s %7s %3.1f",StuInfo[l].ID,StuInfo[l].name,StuInfo[l].score);printf("\n");l++;}printf("请输入需要查找的学分绩:");scanf("%f",&a);center=xuefensearch(a,StuInfo);if(center){ printf("存在此学分绩");printf("该学生的全部信息是:%s %7s %3.1f",StuInfo[center-1].ID,StuInfo[center-1].name,StuInfo[center-1].score);}}实验程序2:#include<stdio.h>#include<string.h>#include<malloc.h>typedef struct StudentInfo ElementType;struct StudentInfo{ char ID[11];char * name;double score;}StuInfo[12]={{"0800301105", "JACK", 95},{"0800201505", "LUN", 85},{"0400820115", "MARY", 75.5},{"0400850122", "KATE", 78.9},{"0500201011", "LILI", 88},{"0800401105", "JACK", 96},{"0600830105", "JAN", 98.4},{"0952520012", "SAM", 75},{"9721000045", "OSCAR", 64},{"0700301105", "JACK", 97},{"0458003312", "ZOE", 68.9},{"0400830211", "BOBI", 87.6}};void InsertionSort(ElementType A[],int N){int p,j;ElementType Tmp;for(p=1;p<N;p++){Tmp=A[p];for(j=p;j>0&&strcmp(A[j-1].ID,Tmp.ID)>0;j--)A[j]=A[j-1];A[j]=Tmp;}}void BubbleSort(ElementType B[],int m) {ElementType tmp;int i,k;for(i=0;i<m;i++)for(k=0;k<m-i;k++)if(B[k].score<B[k+1].score){tmp=B[k];B[k]=B[k+1];B[k+1]=tmp;}}int Binsch(ElementType C[],int low,int high,char t[]){if(low<high){int mid=(low+high)/2;if(strcmp(t,C[mid].ID)==0) return mid;else if(strcmp(t,C[mid].ID)<0) return Binsch(C,low,mid-1,t);else return Binsch(C,mid+1,high,t);}else return -1;}int chazhao(ElementType D[],int low,int high,double h){if(low<high){int mid=(low+high)/2;if(h==D[mid].score) return mid;else if(h>D[mid].score) return chazhao(D,low,mid-1,h);else return chazhao(D,mid+1,high,h);}else return -1;}void print(){int q;printf(" 学号ID 姓名分数\n"); for(q=0;q<12;q++){printf("%-15s",StuInfo[q].ID);printf("%-10s",StuInfo[q].name);printf("%-15f",StuInfo[q].score);printf("\n");}}void main(){char array[11];int y,r;double x;printf("请输入学生的学号、姓名、分数:\n"); print();printf("\n");printf("按学号排序后的顺序:\n"); InsertionSort(StuInfo,12);print();printf("\n");printf("请输入要查找的学号:");scanf("%s",array);y=Binsch(StuInfo,0,11,array);if(y!=-1){printf("%s ",StuInfo[y].ID);printf("%s ",StuInfo[y].name);printf("%f ",StuInfo[y].score);}else printf("查找失败!");printf("\n");printf("按学分绩排序后的顺序:\n"); BubbleSort(StuInfo,12);print();printf("\n");printf("请输入要查找的学分绩:");scanf("%f",&x);r=chazhao(StuInfo,0,11,x);if(r!=-1){printf("%s ",StuInfo[r].ID);printf("%s ",StuInfo[r].name);printf("%f ",StuInfo[r].score); }else printf("查找失败!");}。