数据结构实验报告四林昌雄
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、算法基本思想:
(1) 顺序查找:建立顺序表,从表内第一个数值开始与给定值比较,若相等,则查找成功;否则,用下一个数值继续进行比较,直到数值等于给定值或者线性表已比较完(查找不成功)为止。
(2) 首先提示用户建立有序数组的长度,然后输入有序的数据,接着提示用户输入要查找的元素,通过调用binarySearch()来判断用户要查找的元素是否在此数组中,如果返回值是-1则说明用户查找的数据不在此数组中,否则输出在此数组中。但是,折半查找的先决条件是查找表中的数据元素必须有序。查找过程中采用跃式方查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小于该中点元素,则待查序列缩小为左半部分,否则为右半部分。通过一次比较,将查找区间缩小一半。折半查找是一种高效的查找方法。它可以明显减少比较次数,提高查找效率。
二、结构定义:
线性表的结构定义:有序表的结构定义:
typedef struct typedef struct
{ {
Elemtype *elem; KeyType Key;
int length; }
int listsize; }Elemtype;
}SqList;
三、算法描述:
int Search_Bin2(SqList &L,KeyType key) {//在有序表ST中折半查找其关键字等于//key的数据元素。若找到,则函数值为该元//素在表中的位置,否则为0
int low,high,mid;
low=1;
high=L.length;//置区间初值
while(low<=high){
mid=(low+high)/2;
if(EQ(key,L.elem[mid].key))
//找到待查元素
{printf("待查元素的位置:%d\n",mid+1);
return OK; }
else if(LT(key,L.elem[mid].key)) high=mid-1;//继续在前半区间进行查找
else low=mid+1;//继续在后半区间进行查找
}
printf("待查元素不存在");
return OK;}
Status Search_Bin1(SqList &L,int key){
//在顺序表Sq中顺序查找其关键字等于//key的数据元素。若找到,则函数值为该元//素在表中的位置,否则为0
int i,high;
i=0;
high=L.length;//置区间初值
while (i<=high){
if(EQ(key,L.elem[i].key))
//找到待查元素
{
printf("待查元素的位置:%d\n",i+1);
return OK;
}
else i++;//继续往下一位置进行查找
}
printf("待查元素不存在");
return OK;
}
int main()
{
int key1,choose;
int n,key2;
int i;
SqList L;//置区间初值
printf("1.顺序表查找");
printf("2.有序表查找");
do{
printf("\n请输入选择:");
scanf("%d",&choose);
switch(choose)//对顺序表和有序表进行选择
{//根据选择结果进行顺序表程序运行或者有序表程序运行
case 2:
printf("有序表: ");
InitList_Sq(L);
Create_Sq(L);
printf("输入待查元素: ");
scanf("%d",&key1);
Search_Bin2(L,key1);//调用函数
printf("\n");
break;
case 1:
int i,n;
SqList L1;
InitList_Sq(L1);
printf("顺序表: ");
Create_Sq(L1);
printf("输入待查元素: ");
scanf("%d",&n);
Search_Bin1(L1,n);//调用函数
printf("\n");
break;
default:
printf("输入错误\n");
}
}while(choose);
system("PAUSE");
return EXIT_SUCCESS;
}
、
四、程序清单:
#include
#include
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2
#define INFEASIBLE -1
#define EQ(a,b) ((a)==(b))
#define LT(a,b) ((a)<(b))
#define NQ(a,b) ((a)!=(b))
typedef int KeyType;
typedef int Status;
typedef struct
{
KeyType key;
}Elemtype;
typedef struct
{
Elemtype *elem;
int length;
int listsize;
}SqList;
Status InitList_Sq(SqList &L)
{
L.elem=(Elemtype*)malloc(LIST_INIT_SIZE *sizeof(Elemtype));
if(!L.elem)
exit(OVERFLOW);
L.length=0;
L.listsize=LIST_INIT_SIZE;
return OK;
}
Status Create_Sq(SqList &L){
int i,n;
printf("输入线性表元素个数:");
scanf("%d",&n);
for(i=0;i scanf("%d",&L.elem[i]); L.length=i+1; } return OK; } int Search_Bin2(SqList &L,KeyType key) { int low,high,mid; low=1; high=L.length; while(low<=high) { mid=(low+high)/2; if(EQ(key,L.elem[mid].key)) { printf("待查元素的位置:%d\n",mid+1); return OK; } else if(LT(key,L.elem[mid].key)) high=mid-1; else low=mid+1; } printf("待查元素不存在"); return OK; } Status Search_Bin1(SqList &L,int key){ int i,high; i=0; high=L.length; while (i<=high){ if(EQ(key,L.elem[i].key)) { printf("待查元素的位置:%d\n",i+1); return OK; } else i++; }