回复 楼主 zggdsgs
#include <stdio.h>
#include <malloc.h>
#include <string.h>
typedef struct
{
int cla;
int num;
char name[20];
char sex;
long phonenum;
}student;
typedef struct {
student *elem;
int length;
int sum;
}ST;
ST *initlist() {
ST *l;
l=(ST*)malloc(sizeof(ST));
if(!l)printf("没有创建ST!\n");
l->length=0;l->sum=3;
l->elem=(student*)malloc(3*sizeof(student));
if(!l->elem)
printf("没有创建elem!\n");
return(l);
}
int place(ST*l,int c,int num){
int low,high,mid,j=-1,i;
low=0;high=l->length-1;
while(low<=high){
mid=(low+high)/2;
if(l->elem[mid].num>num)high=mid-1;
else{j=mid;low=mid+1;
}
}i=j;
for(j=mid;j>=i;j--){
if(j==-1||num>l->elem[j].num)
break;
else if(num==l->elem[j].num&&c>l->elem[j].cla)
break;
}
return(++j);
}
void move(ST *l,int j){
int i;
for(i=l->length-1;i>=j;i--){
l->elem[i+1].cla=l->elem[i].cla;
strcpy(l->elem[i+1].name,l->elem[i].name);
l->elem[i+1].num=l->elem[i].num;
l->elem[i+1].sex=l->elem[i].sex;
l->elem[i+1].phonenum=l->elem[i].phonenum;
}
}
void createlist(ST*l){
int i,j,c,num;
char nam[20],s;
long p;
printf("输入学生信息(class/name/num/sex/phonenum):\n");
for(i=0;i<l->sum;i++){
scanf("%d%s%d%c%ld",&c,&nam,&num,&s,&p);
j=!(l->length)?0:place(l,c,num);
move(l,j);
l->elem[j].cla=c;
strcpy(l->elem[j].name,nam);
l->elem[j].num=num;
l->elem[j].sex=s;
l->elem[j].phonenum=p;l->length++;
}
}
void searchbin(ST*l) {
int low,high,mid,num,c;
printf("输入查找人的学号和班级号:");
scanf("%d %d",&num,&c);
if(num!=-1||c!=-1){
low=0;high=l->length-1;
while(low<=high){
mid=(low+high)/2;
if(l->elem[mid].num<num)low=mid+1;
else if(l->elem[mid].num>num)high=mid-1;
else{
if(l->elem[mid].cla<c)mid++;
else if(l->elem[mid].cla>c)mid--;
break;
}
}
printf("class:%d,name:%s,num:%d,sex:%c,phonenum:%ld\n",l->elem[mid].cla,l->elem[mid].name,l->elem[mid].num,l->elem[mid].sex,l->elem[mid].phonenum);
}
void searchseq(ST *l){
int num,c,i;
printf("输入查找人的学号和班级号:");
scanf("%d %d",&num,&c);
for(i=0;i<=l->length;i++)
if(l->elem[i].num==num)
break;
if(i!=l->length)
printf("class:%d,name:%s,num:%d,sex:%c,phonenum:%ld\n",l->elem[i].cla,l->elem[i].name,l->elem[i].num,l->elem[i].sex,l->elem[i].phonenum);
else
printf("查无此人!");
}
void printlist(ST*l){
int i,j=0;
printf("当前表中信息如下:class/name/num/sex/phonenum\n");
for(i=0;i<l->sum;i++){
printf("class:%d,name:%s,num:%d,sex:%c,phonenum:%ld\n",l->elem[i].cla,l->elem[i].name,l->elem[i].num,l->elem[i].sex,l->elem[i].phonenum);
if(++j==3){
j=0;
printf("\n");
}
}
printf("\n");
}
void main(){
ST *l;
ST *l2;
printf("class1\n");
l=initlist();
createlist(l);
printlist(l);
printf("用折半查找实现class1\n");
searchbin(l);
printf("class2\n");
l2=initlist();
createlist(l2);
printlist(l2);
printf("用顺序查找实现class2\n");
searchseq(l2);
}
[
本帖最后由 zggdsgs 于 2015-6-10 22:54 编辑 ]