实验五 查找
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;
}
}
}