数据结构 查找 静态查找表算法 折半查找 二叉排序树查找算法 实验报告

简介: 数据结构 查找 静态查找表算法 折半查找 二叉排序树查找算法 实验报告

实验内容:

基本内容:

算法1:采用顺序存储结构创建静态查找表,对查找表进行顺序查找和改进的顺序查找,并对其查找效率进行比较;

算法2:采用顺序存储结构创建静态查找表——有序表,对有序表进行二分查找;

选作内容:

编程实现按二叉排序树算法进行查找。


静态查找表算法(未改进):

代码:


/

#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef int keytype;
typedef struct
{  keytype key;
   int info;
}ElemType;
typedef  struct 
{  ElemType  elem[MAXSIZE];
   int  length;
}Sstable;
int Search_Seq(Sstable ST,keytype key)
{
  int i=1;
  while(i<=ST.length)
  {
    if(key==ST.elem[i].key)
    {
      return i;
    }
    i++;
  }
}
void Create(Sstable &ST,int n)
{
  int i;
  printf("输入元素:"); 
  for(i=1;i<=n;i++)
  scanf("%d",&ST.elem[i].key);
} 
int main()
{
  Sstable ST;
  keytype key;
  int i;
  printf("输入长度:");
  scanf("%d",&ST.length);
  Create(ST,ST.length);
  while(1)
  {
  printf("输入要查找的元素:");
  scanf("%d",&key);
  i=Search_Seq(ST,key);
  if(i) 
  printf("元素位置在:%d\n",i);
  else  
  printf("元素不存在\n");    
  }
} 

运行结果:

image.png

静态查找表算法(改进):

代码:

#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef int keytype;
typedef struct
{  keytype key;
   int info;
}ElemType;
typedef  struct 
{  ElemType  elem[MAXSIZE];
   int  length;
}Sstable;
int Search_Seq(Sstable ST,keytype key)
{
  int i=ST.length;
  ST.elem[0].key=key;
  while(i>=0)
  {
    if(key==ST.elem[i].key)
    {
      return i;
    }
    i--;
  }
}
void Create(Sstable &ST,int n)
{
  int i;
  printf("输入元素:"); 
  for(i=1;i<=n;i++)
  scanf("%d",&ST.elem[i].key);
} 
int main()
{
  Sstable ST;
  keytype key;
  int i;
  printf("输入长度:");
  scanf("%d",&ST.length);
  Create(ST,ST.length);
  while(1)
  {
  printf("输入要查找的元素:");
  scanf("%d",&key);
  i=Search_Seq(ST,key);
  if(i) 
  printf("元素位置在%d\n",i);
  else  
  printf("元素不存在\n");    
  }
} 

运行结果:

image.png

折半查找

代码:

#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef int keytype;
typedef struct
{  keytype key;
   int info;
}ElemType;
typedef  struct 
{  ElemType  elem[MAXSIZE];
   int  length;
}Sstable;
int Search_Bin(Sstable ST,keytype key)
{
  int low,high,mid;
  low=1;high=ST.length;
  while(low<=high)
  {
    mid=(low+high)/2;
    if(key==ST.elem[mid].key) return mid;
    else if(key<ST.elem[mid].key) high=mid-1;
    else low=mid+1;
  }
  return 0;
}
void Create(Sstable &ST,int n)
{
  int i;
  printf("输入元素:"); 
  for(i=1;i<=n;i++)
  scanf("%d",&ST.elem[i].key);
} 
int main()
{
  Sstable ST;
  keytype key;
  int i;
  printf("输入长度:");
  scanf("%d",&ST.length);
  Create(ST,ST.length);
  while(1)
  {
  printf("输入要查找的元素:");
  scanf("%d",&key);
  i=Search_Bin(ST,key);
  if(i) 
  printf("元素位置在:%d\n",i);
  else  
  printf("元素不存在\n");    
  }
} 

运行结果:

image.png

选做(二叉排序树查找):

#include<stdio.h> 
#include<stdlib.h>
#define OVERFLOW -2
#define OK 1
#define TRUE 1
#define ERROR 0
#define FALSE 0
#define EQ(a,b) ((a)==(b))
#define LT(a,b) ((a)<(b))
#define LQ(a,b) ((a)<=(b))
typedef int Status;
typedef struct Volunteer {
  int key;
  char name[15];
  char phoneNo[11];
}ElemType;
typedef struct BiNode{
  ElemType data;
  struct BiNode *lchild,*rchild;
}BiNode, *BiTree;
Status SearchBST(BiTree T,int key,BiTree f,BiTree &p)
{
  if(!T)
  {
    p=f;
    return FALSE;
  }
  else if(EQ(key,T->data.key))
  {
    p=T;
    return TRUE;
  }
  else if LT(key,T->data.key)
  {
    return SearchBST(T->lchild,key,T,p);
  }
  else
      return SearchBST(T->rchild,key,T,p);
}
Status InsertBST(BiTree &T,ElemType e)
{
  BiTree s,p;
  if(!SearchBST(T,e.key,NULL,p))
  {
    if(!(s=(BiTree)malloc(sizeof(BiNode))))
    exit(OVERFLOW);
    s->data=e;
    s->lchild=s->rchild=NULL;
    if(!p)
    {
      T=s;
    }
    else if LT(e.key,p->data.key)
    {
      p->lchild=s;
    }
    else 
    {
      p->rchild=s;
    }
    return TRUE;
  }
  else
  return FALSE;
 } 
Status Delete(BiTree &p)
{
  BiTree q,s;
  if(!p->rchild)
  {
    q=p;
    p=p->lchild;
    free(q);
  }
  else if(!p->lchild)
  {
    q=p;
    p=p->rchild;
    free(q);
  }
  else
  {
    q=p;
    s=p->lchild;
    while(s->rchild)
    {
      q=s;
      s=s->rchild;
    }
    p->data=s->data;
    if(q!=p)
    {
      q->rchild=s->lchild;
    }
    else
    {
      q->lchild=s->lchild;
    }
    free(s);
    return TRUE;
  } 
}
Status DeleteBST(BiTree &T,int key)
{
  if(!T)
  {
    return ERROR;
  }
  else 
  {
    if(EQ(key,T->data.key))
    {
      Delete(T);
    }
    else if(LT(key,T->data.key))
    {
      return DeleteBST(T->lchild,key);
    }
    else
    {
      return DeleteBST(T->rchild,key);
    }
  }
}
void InOrderTraverse(BiTree T)
{
  if(T)
  {
    InOrderTraverse(T->lchild);
    printf("%d\t%s\t%s\n",T->data.key,T->data.name,T->data.phoneNo);
    InOrderTraverse(T->rchild);
  }
}
void showmenu()
{
  printf("******欢迎进入志愿者信息管理系统******\n");
  printf("*            1:我要报名              *\n");
  printf("*          2:我要取消报名            *\n");
  printf("*  3:我想知道关心的同伴是否也报名了  *\n");
  printf("*       4:看看全部的报名信息         *\n");
  printf("*            5:退出系统              *\n");
  printf("*     请选择你所要执行的操作(1-5)  *\n");
  printf("**************************************\n");
}
int main()
{
  BiTree T=NULL,p=NULL;
  ElemType e;
  int no,flag,st;
  while(1)
  {
    showmenu();
    scanf("%d",&flag);
    switch(flag)
    {
      case 1:printf("请输入你的学号,姓名和联系方式,用空格隔开!\n");
             printf("\n");
             scanf("%d%s%s",&e.key,e.name,e.phoneNo);
             InsertBST(T,e);
             printf("\n");
             printf("报名成功,你是一个有爱心的同学,为你点赞!\n");
             printf("\n");
             break;
      case 2:if(!T)
             {
                printf("请先报名,再操作!\n");
                break;
           }
           printf("请输入你的学号: ");
           scanf("%d",&no);
           DeleteBST(T,no);
           printf("\n");
           printf("你的报名信息已删除,不过欢迎你随时加入我们志愿者团队哦!\n");
           printf("\n");
           break;
        case 3:if(!T)
        {
        printf("二叉排序树还未建立,请先建立后再操作!\n");
        break;
        }
        printf("请输入你关心的同伴的学号:");
        scanf("%d",&no);
        st=SearchBST(T,no,NULL,p);
        if(st)
        {
          printf("\n");
          printf("你关心的同学已经报名,快来报名加入我们的志愿者活动吧!\n");
          printf("\n");
        }
        else
        {
          printf("\n");
          printf("你关心的同伴还未报名,快邀请同伴一起加入我们的志愿队伍吧!\n");
          printf("\n");
        }
        break;
       case 4:printf("已报名的志愿者信息为:\n");
              printf("\n");
              InOrderTraverse(T);
              printf("\n");
              break;
       case 5:exit (0);
       default :printf("输入非法,请输入数字1-5!\n");
       fflush(stdin);
    }
  }
}

微信图片_20220927112323.png

相关文章
|
16天前
|
存储 机器学习/深度学习 算法
C 408—《数据结构》算法题基础篇—链表(下)
408考研——《数据结构》算法题基础篇之链表(下)。
79 29
|
16天前
|
存储 算法 C语言
C 408—《数据结构》算法题基础篇—链表(上)
408考研——《数据结构》算法题基础篇之链表(上)。
72 25
|
16天前
|
存储 人工智能 算法
C 408—《数据结构》算法题基础篇—数组(通俗易懂)
408考研——《数据结构》算法题基础篇之数组。(408算法题的入门)
58 23
|
1月前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
51 2
|
2月前
|
存储 运维 监控
探索局域网电脑监控软件:Python算法与数据结构的巧妙结合
在数字化时代,局域网电脑监控软件成为企业管理和IT运维的重要工具,确保数据安全和网络稳定。本文探讨其背后的关键技术——Python中的算法与数据结构,如字典用于高效存储设备信息,以及数据收集、异常检测和聚合算法提升监控效率。通过Python代码示例,展示了如何实现基本监控功能,帮助读者理解其工作原理并激发技术兴趣。
70 20
|
3月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
99 1
|
3月前
|
数据采集 存储 算法
Python 中的数据结构和算法优化策略
Python中的数据结构和算法如何进行优化?
|
3月前
|
机器学习/深度学习 算法 数据挖掘
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
196 6
|
3月前
|
存储 算法 编译器
数据结构实验之矩阵的运算器(二维数组)
本实验旨在通过团队合作,掌握数组和矩阵相关运算的代码实现,包括矩阵的加减、数乘、转置、乘法、n次方及行列式的计算。实验过程中,成员们需分工协作,解决编程难题,最终实现一个功能完备的矩阵计算器。通过本实验,不仅锻炼了编程能力,还加深了对数学概念的理解,同时培养了团队合作精神。
88 4
|
3月前
|
机器学习/深度学习 存储 算法
数据结构实验之二叉树实验基础
本实验旨在掌握二叉树的基本特性和遍历算法,包括先序、中序、后序的递归与非递归遍历方法。通过编程实践,加深对二叉树结构的理解,学习如何计算二叉树的深度、叶子节点数等属性。实验内容涉及创建二叉树、实现各种遍历算法及求解特定节点数量。
128 4

热门文章

最新文章