数据结构C语言版之查找(折半选择快速等)
//查找: #include<stdio.h> #include<time.h> #include<stdlib.h> typedef struct{ int *elem; int length; }SStable; typedef struct SYlist{ int num; int *Key; int *start; }SYlist; void CreatSearchlist(SStable &S) { int i; printf("请输入表长:\n"); scanf("%d",&S.length); S.elem=(int*)malloc((S.length)*sizeof(int)); for(i=1;i<S.length;i++) S.elem[i]=rand()%89+10; } int Search(SStable S,int key) { S.elem[0]=key; while(S.elem[S.length]!=key) S.length--; return S.length; } void ShowSStable(SStable S) { int i; for(i=1;i<S.length;i++) printf("%5d",S.elem[i]); printf("\n"); } void Sort(SStable &S) { int i,j,temp; for(i=1;i<S.length-1;i++) { for(j=1;j<S.length-i-1;j++) { if(S.elem[j]>S.elem[j+1]) { temp=S.elem[j]; S.elem[j]=S.elem[j+1]; S.elem[j+1]=temp; } } } ShowSStable(S); } int Zbsearch(SStable S,int e) { int mid,high=S.length-1,low=1; while(low<=high) { mid=(low+high)/2; if(S.elem[mid]==e) return mid; else if(S.elem[mid]<e) low=mid+1; else high=mid-1; } return 0; } void CreatSylist(SYlist &sy,SStable &S) { int i,n; printf("\n\n\n建立索引表:\n"); printf("请输入数据个数:\n"); scanf("%d",&n); S.length=n+1; S.elem=(int*)malloc((S.length)*sizeof(int)); printf("请输入一组数(局部有序):\n"); for(i=1;i<S.length;i++) scanf("%d",&S.elem[i]); printf("请输入关键字个数:\n"); scanf("%d",&sy.num); sy.Key=(int*)malloc(sy.num*sizeof(int)); sy.start=(int*)malloc(sy.num*sizeof(int)); for(i=0;i<sy.num;i++) { printf("请输入第%d个关键字:\n",i+1); scanf("%d",&sy.Key[i]); printf("请输入该关键字的位置:\n"); scanf("%d",&sy.start[i]); } } int Sysearch(SYlist sy,SStable S,int m) { int i=0,j; while(m>sy.Key[i]) i++; if(i>0 && i<sy.num-1) { for(j=sy.start[i];j<sy.start[i+1];j++) { if(S.elem[j]==m) return j; } } if(i==0) { for(j=1;j<sy.start[1];j++) { if(S.elem[j]==m) return j; } } if(i>=sy.num-1) { for(j=sy.start[sy.num];j<S.length;j++) { if(S.elem[j]==m) return j; } } } int main() { SStable S; SYlist sy; int key,e,m; srand(time(0)); CreatSearchlist(S); printf("随机产生的%d个两位数构造的查找表为:\n",S.length-1); ShowSStable(S); printf("\n请输入要查找的数:"); scanf("%d",&key); if(Search(S,key)) printf("查找成功!该数在表中的位置为:%d\n",Search(S,key)); else printf("查找失败!\n"); printf("对表中数据按递增进行排序后的序列为:\n"); Sort(S); printf("\n请输入要查找的数:"); scanf("%d",&e); if(Zbsearch(S,e)) printf("折半查找成功!该数在表中的位置为:%d\n",Zbsearch(S,e)); else printf("查找失败!\n"); CreatSylist(sy,S); printf("\n请输入要查找的数:"); scanf("%d",&m); Sysearch(sy,S,m); if(Sysearch(sy,S,m)) printf("查找成功!该数在表中的位置为:%d\n",Sysearch(sy,S,m)); else printf("查找失败!\n"); return 0; }
不为失败找原因,要为成功找方法!