實驗五 查找
l 實驗目的
1、 查找的基本概念
- 掌握在數組上進行各種查找的方法和算法。
- 深刻理解各種方法的特點,並能靈活運用。
- 加深對查找的理解,逐步培養解決實際問題的能力。
l 實驗內容
1、查找的基本概念
(一)基礎題
1.編寫各種查找方法的基本操作函數:
(1)search1(int *k,int n,int key)無序線性表的順序查找;
(2)search2(int *k,int n,int key)有序線性表的順序查找;
(3)bin_search(int *k,int n,int key)二分法查找。
2.調用上述函數實現下列操作:
(1)對於給定的數組E[N]={213,111,222,77,400,300,987,1024,632,555}調用無序線性表的順序查找函數進行查找;
(2)調用有序線性表的順序查找函數進行查找;
(3)調用二分法查找函數進行查找。
(二)提高題
【問題描述】采用隨機函數產生職工的工號和他所完成產品個數的數據信息,對同一職工多次完成的產品個數進行累計,最后按“職工完成產品數量的名次,該名次每位職工完成的產品數量,同一名次的職工人數和他們的職工號”的格式輸出。
【實現要求】輸出統計結果,如下所示:
ORDER QUANTITY COUNT NUMBER
1 375 3 10 20 21
4 250 2 3 5
6 200 1 9
7 150 2 11 14
l 實驗結果
1、查找的基本概念
(一)基礎題
(1)畫出數據結構基本運算的流程圖
(2)程序運行主要結果截圖
(3)程序源代碼
#include<stdio.h> #include<conio.h> #define N 10 int E[N]={213,111,222,77,400,300,987,1024,632,555}; void s_sort(int e[],int n)/*e:存儲線性表的數組;n:線性表的結點個數*/ { int i,j,k,t; for(i=0;i<n-1;i++) { for(k=i,j=i+1;j<n;j++) if(e[k]>e[j]) k=j; if(k!=i) { t=e[i]; e[i]=e[k]; e[k]=t; } } } int search1(int *k,int n,int key) /*無序線性表的順序查找*/ { int i; for(i=0;i<n;i++) if(key==k[i]) return i; return -1; } int search2(int *k,int n,int key)/*有序線性表的順序查找*/ { int i; for(i=0;i<n&&key>k[i];i++) if(i<n&&k[i]==key) return i; return -1; } int bin_search(int *k,int n,int key)/*二分法查找*/ { int low=0,high=n-1,mid; while(low<=high) { mid=(low+high)/2; if(key==k[mid]) return mid; if(key>k[mid]) low=mid+1; else high=mid-1; } return -1; } int main() { int i,j,p; printf("初始化數據序列為:\n"); for(i=0;i<N;i++) printf("%d ",E[i]); printf("\n1.無序表查找\n"); printf("\n輸入要查找的關鍵碼: "); scanf("%d",&i); if((j=search1(E,N,i))>=0) printf("找到關鍵字,位置:%d\n",j+1); else printf("找不到!\n"); getch(); printf("\n順序排序后的數據序列為:\n"); s_sort(E,N); for(i=0;i<N;i++) printf("%d ",E[i]); printf("\n2.有序表查找\n"); printf("\n\n輸入要查找的關鍵字:"); scanf("%d",&i); if((j=search2(E,N,i))>=0) printf("找到關鍵字,位置為:%d\n",j+1); else printf("找不到!\n"); getch(); printf("\n3.二分法查找\n"); printf("\n輸入要查找的關鍵字:"); scanf("%d",&i); if((j=bin_search(E,N,i))>=0) printf("找到關鍵字,位置為:%d\n",j+1); else printf("找不到\n"); getch(); }
(二)提高題
(1)畫出數據結構基本運算的流程圖
(2)程序運行主要結果截圖
(3)程序源代碼
#include<stdio.h> #include<stdlib.h> #define MAXQ 5 typedef struct workload { int no; int q; struct workload *next; }WL; void Getdata(int maxno,int *no,int *q) { *no=rand()%maxno; *q=rand()%MAXQ+1; } WL *creat_wl(int maxno,int maxrc) { int no,q,i; WL *u,*v,*p,*head; head=NULL; for(i=0;i<maxrc;i++) { Getdata(maxno,&no,&q); printf("[%4d]%4d",no,q); for(v=head;v!=NULL&&v->no!=no;v=v->next) u=v; if(v!=NULL) { if(v==head) head=v->next; else u->next=v->next; v->q+=q; } else { if((v=(WL*)malloc(sizeof(WL)))==NULL) { printf("申請空間失敗!"); exit(-1); } v->no=no; v->q=q; } p=head; while(p!=NULL&&(p->q<v->q||p->q==v->q&&p->no>no)) { u=p; p=p->next; } if(p==head) head=v; else u->next=v; v->next=p; } return head; } void print_wl(WL *head) { int count,order; WL *u,*v; printf("order quantity count number\n"); u=head; order=1; while(u!=NULL) { for(count=1,v=u->next;v!=NULL&&v->q==u->q;v=v->next) count++; printf("%4d%9d%6d",order,u->q,count); order+=count; for( ;count--!=0;u=u->next) printf("%4d",u->no); printf("\n"); } } int main() { WL *wl,*tmp; int i,j; while(1) { printf("輸入人工數(<1000,>0),工作量記錄數(<10000,>0),<=0退出\n"); fflush(stdin); scanf("%d %d",&i,&j); if(i<=0||j<=0) return 0; if(i>=1000||j>=10000) continue; wl=creat_wl(i,j); print_wl(wl); while(wl!=NULL){ tmp=wl->next; free(wl); wl=tmp; } } }