数据结构实验报告四林昌雄

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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++;

}

相关文档
最新文档