当前位置:   article > 正文

数据结构:实验七:数据查找_(1)编写程序,利用顺序查找,从控制台给定的十个数据中查找一个数据是否存在。

(1)编写程序,利用顺序查找,从控制台给定的十个数据中查找一个数据是否存在。

一、    实验目的

(1)领会各种查找算法的过程和算法设计。

(2)掌握查找算法解决实际问题。

二、  实验要求

(1)编写一个程序exp8-1.cpp, 按提示输入10个任意的整形数据(无序),再输入一个待查找的数据,采用顺序查找方法,如果查找成功,返回该数据所在的位置(逻辑序号)。 如果查找不成功,给出一定的提示。

(2)编写一个程序exp8-2.cpp,输出在顺序表(1,2,3,4,5,6,7,8,9,10)中采用折半查找方法查找关键字9的过程。

三、实验环境

Windows+DEV C++( 或者其他编译工具)

四、实验步骤及结果 

1.类型声明

(1)

顺序查找(无序):

  1. typedef int KeyType;//定义关键字类型为int
  2. typedef char InfoType[10];
  3. typedef struct {
  4.    KeyType Key;//关键字项
  5.    InfoType data;//其他数据项,类型为InfoType
  6. } NodeType; //查找元素类型
  7. typedef NodeType SeqList[MAXSIZE];

(2)

折半查找(递归):

  1. typedef int KeyType;//定义关键字类型为int
  2. typedef char InfoType[10];
  3. typedef struct {
  4.    KeyType key;//关键字项
  5.    InfoType data;//其他数据项,类型为InfoType
  6. } NodeType; //查找元素类型
  7. typedef NodeType SeqList[MAXL];//顺序表类型

2.各类查找算法的实现

(1)

顺序查找(无序):

  1. int Search(SeqList R,int n,KeyType k) {
  2.    int i=0;
  3.    while(i<n&&R[i].Key!=k) {
  4.        i++;
  5.    }
  6.    if(i>=n)
  7.        return -1;
  8.    else
  9.       
  10.    return i;
  11. }

(2)

折半查找(递归):

  1. int  BinSearch(SeqList R,KeyType k,int low,int high,int count)//折半查找算法(递归)
  2. {
  3.    int mid;
  4.    if(low<=high)
  5.    {
  6.        mid=(low+high)/2;
  7.        printf("第%d次查找:在[%d,%d]中查找到元素R[%d]:%d\n",++count,low,high,mid,R[mid].key);
  8.        if(R[mid].key==k)//查找成功返回
  9.        return mid;
  10.        else if(R[mid].key>k) //继续在R[low...mid-1]中查找
  11.        BinSearch(R,k,low,mid-1,count);
  12.        else
  13.        BinSearch(R,k,mid+1,high,count);//继续在R[mid+1...high]中查找
  14.    }
  15.    else return -1;
  16. }

3.主程序设计及完成实验要求中的功能

(1)

顺序查找(无序):

  1. int main() {
  2.    SeqList R;
  3.    int n=10;
  4.    KeyType k = 9;
  5.    printf("输入序列内容(十个不同整型数字):");
  6.    int i;
  7.    for(i=0;i<10;i++)
  8.    {
  9.        scanf("%d",&R[i].Key);
  10.    }
  11.     printf("序列为:");
  12.     for(i=0;i<n;i++)
  13.     {
  14.         printf("%d,",R[i].Key);
  15.     }
  16.     printf("\n请输入需要查找的数字为:");
  17.     scanf("%d",&k);
  18.    printf("需要搜索的数字为%d",k);
  19.    if((i =Search(R,n,k))!=-1)
  20.        printf("\n%d在序列的第%d位置",k,i);
  21.    else
  22.        printf("\n元素%d不在序列中\n",k);
  23.    printf("\n");
  24. }

(2)

折半查找(递归):

  1. int main()
  2. {
  3.    SeqList R;
  4.    int i;
  5.    int n=10;
  6.    KeyType k = 9;
  7.    int a[]={1,2,3,4,5,6,7,8,9,10};
  8.    for(i=0;i<n;i++)//建立顺序表
  9.    R[i].key=a[i];
  10.    printf("用递归方法:\n");
  11.    if((i =BinSearch(R,k,0,9,0))!=-1)
  12.        printf("元素%d的位置是%d\n",k,i);
  13.    else
  14.        printf("元素%d不在表中\n",k);
  15. }

exp8-1:

  1. #include <stdio.h>
  2. #define MAXSIZE 100
  3. typedef int KeyType;//定义关键字类型为int
  4. typedef char InfoType[10];
  5. typedef struct {
  6. KeyType Key;//关键字项
  7. InfoType data;//其他数据项,类型为InfoType
  8. } NodeType; //查找元素类型
  9. typedef NodeType SeqList[MAXSIZE];
  10. int Search(SeqList R,int n,KeyType k) {
  11. int i=0;
  12. while(i<n&&R[i].Key!=k) {
  13. i++;
  14. }
  15. if(i>=n)
  16. return -1;
  17. else
  18. return i;
  19. }
  20. int main() {
  21. SeqList R;
  22. int n=10;
  23. KeyType k = 9;
  24. printf("输入序列内容(十个不同整型数字):");
  25. int i;
  26. for(i=0;i<10;i++)
  27. {
  28. scanf("%d",&R[i].Key);
  29. }
  30. printf("序列为:");
  31. for(i=0;i<n;i++)
  32. {
  33. printf("%d,",R[i].Key);
  34. }
  35. printf("\n请输入需要查找的数字为:");
  36. scanf("%d",&k);
  37. printf("需要搜索的数字为%d",k);
  38. if((i =Search(R,n,k))!=-1)
  39. printf("\n%d在序列的第%d位置",k,i);
  40. else
  41. printf("\n元素%d不在序列中\n",k);
  42. printf("\n");
  43. }

exp8-2:

  1. #include <stdio.h>
  2. #define MAXL 100
  3. typedef int KeyType;//定义关键字类型为int
  4. typedef char InfoType[10];
  5. typedef struct {
  6. KeyType key;//关键字项
  7. InfoType data;//其他数据项,类型为InfoType
  8. } NodeType; //查找元素类型
  9. typedef NodeType SeqList[MAXL];//顺序表类型
  10. int BinSearch(SeqList R,KeyType k,int low,int high,int count)//折半查找算法(递归)
  11. {
  12. int mid;
  13. if(low<=high)
  14. {
  15. mid=(low+high)/2;
  16. printf("第%d次查找:在[%d,%d]中查找到元素R[%d]:%d\n",++count,low,high,mid,R[mid].key);
  17. if(R[mid].key==k)//查找成功返回
  18. return mid;
  19. else if(R[mid].key>k) //继续在R[low...mid-1]中查找
  20. BinSearch(R,k,low,mid-1,count);
  21. else
  22. BinSearch(R,k,mid+1,high,count);//继续在R[mid+1...high]中查找
  23. }
  24. else return -1;
  25. }
  26. int main()
  27. {
  28. SeqList R;
  29. int i;
  30. int n=10;
  31. KeyType k = 9;
  32. int a[]={1,2,3,4,5,6,7,8,9,10};
  33. for(i=0;i<n;i++)//建立顺序表
  34. R[i].key=a[i];
  35. printf("用递归方法:\n");
  36. if((i =BinSearch(R,k,0,9,0))!=-1)
  37. printf("元素%d的位置是%d\n",k,i);
  38. else
  39. printf("元素%d不在表中\n",k);
  40. }

4.实验结果截图

(1)

顺序查找(无序):

(2)

折半查找(递归):

如需源文件,请私信作者,无偿

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/喵喵爱编程/article/detail/737595
推荐阅读
相关标签
  

闽ICP备14008679号