先对数据进行快速排序,再用二分法排序!!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define num 4
struct data
{
char name[20];
char city[20];
char sex[10];
char age[10];
char job[10];
};
struct data datas[num]=
{
 "sun","Weifang","Male","24","student",
 "tom","Beijing","Male","31","doctor",
 "marry","Shanghai","Female","19","techer",
 "Willing","Tianjing","Female","21","worker",
};
void qs_struct(struct data *items,int left,int right);
void quick_struct(struct data *items,int count);
int binaryseach(struct data *items,char name[],int n);
void print_data(struct data *point);
int main()
{
char name[30];
int i;
printf("sort the original data!!\n");
quick_struct(datas,num);
printf("input the name you want to find!!\n");
scanf("%s",name);
i=binaryseach(datas,name,num);
if(i==-1)
{
printf("can not find anyone!!\n");
return 0;
}
printf("result:\n");
print_data(&datas[i]);
return 1;
}

void quick_struct(struct data items[],int count)
{
qs_struct(items,0,count-1);
}
void qs_struct(struct data items[],int left,int right)
{
register int i,j;
char *x;
struct data temp;
i=left;
j=right;
x=items[(left+right)/2].name;
do
{
while((strcmp(items[i].name,x)<0)&&(i<right))
i++;
while((strcmp(items[j].name,x)>0&&(i>left)))
j--;
if(i<=j)
{
temp=items[i];
items[i]=items[j];
items[j]=temp;
i++;
j--;
}
}while(i<=j);
if(left<j)
  qs_struct(items,left,j);
if(i<right)
  qs_struct(items,i,right);
}
int binaryseach(struct data items[],char name[],int n)
{
int low,high,mid;
low=0;
high=n-1;
while(low<=high)
{
mid=(low+high)/2;
if((strcmp(items[mid].name,name)==0))
return mid;
else if((strcmp(items[mid].name,name)<0))
low=mid+1;
else
high=mid-1;
}
return -1;
}
void print_data(struct data *point)
{
if(point==NULL)
 return;
printf("%s\n",point->name);
printf("%s\n",point->city);
printf("%s\n",point->sex);
printf("%s\n",point->age);
printf("%s\n",point->job);
}