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

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

实验内容:

基本内容:

算法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

相关文章
|
6月前
|
机器学习/深度学习 数据采集 算法
【机器学习】基于机器学习的分类算法对比实验
【机器学习】基于机器学习的分类算法对比实验
126 6
【机器学习】基于机器学习的分类算法对比实验
|
1月前
|
算法 搜索推荐 Java
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
这篇文章介绍了如何使用Java后端技术,结合Graphics2D和Echarts等工具,生成包含个性化信息和图表的海报,并提供了详细的代码实现和GitHub项目链接。
105 0
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
|
1月前
|
存储 算法 数据管理
数据结构与算法学习二零:二叉排序树(BST)、平衡二叉树(AVL)
这篇文章通过需求分析、代码实现和测试验证,详细介绍了二叉排序树的创建、遍历和删除操作,以及二叉平衡树(AVL)的自平衡特性和单旋转操作,旨在提高树结构在数据管理中的效率和性能。
29 0
数据结构与算法学习二零:二叉排序树(BST)、平衡二叉树(AVL)
|
1月前
|
算法 Java 索引
数据结构与算法学习十五:常用查找算法介绍,线性排序、二分查找(折半查找)算法、差值查找算法、斐波那契(黄金分割法)查找算法
四种常用的查找算法:顺序查找、二分查找(折半查找)、插值查找和斐波那契查找,并提供了Java语言的实现代码和测试结果。
20 0
|
1月前
|
算法
计科一二班算法数据结构实验9答案
计科一二班算法数据结构实验9答案
14 0
|
3月前
|
算法 Java 测试技术
算法分析(蛮力法与减治算法应用实验报告)
这篇文章是关于算法分析的实验报告,介绍了如何使用蛮力法解决背包问题,并通过伪代码和Java代码实现,同时分析了其时间效率;还介绍了基于减治法思想实现的二叉查找树的插入与查找,同样提供了伪代码、Java源代码实现和时间效率分析,最后展示了测试结果截图。
算法分析(蛮力法与减治算法应用实验报告)
|
3月前
|
机器学习/深度学习 算法 Java
算法设计(动态规划应用实验报告)实现基于贪婪技术思想的Prim算法、Dijkstra算法
这篇文章介绍了基于贪婪技术思想的Prim算法和Dijkstra算法,包括它们的伪代码描述、Java源代码实现、时间效率分析,并展示了算法的测试用例结果,使读者对贪婪技术及其应用有了更深入的理解。
算法设计(动态规划应用实验报告)实现基于贪婪技术思想的Prim算法、Dijkstra算法
|
3月前
|
算法 Java 测试技术
算法设计(动态规划实验报告) 基于动态规划的背包问题、Warshall算法和Floyd算法
这篇文章介绍了基于动态规划法的三种算法:解决背包问题的递归和自底向上实现、Warshall算法和Floyd算法,并提供了它们的伪代码、Java源代码实现以及时间效率分析。
算法设计(动态规划实验报告) 基于动态规划的背包问题、Warshall算法和Floyd算法
|
3月前
|
算法 搜索推荐
算法设计 (分治法应用实验报告)基于分治法的合并排序、快速排序、最近对问题
这篇文章是关于分治法应用的实验报告,详细介绍了如何利用分治法实现合并排序和快速排序算法,并探讨了使用分治法解决二维平面上的最近对问题的方法,包括伪代码、源代码实现及时间效率分析,并附有运行结果和小结。
|
5月前
|
算法 Java
JavaSE——算法(2/2):查找算法-二分查找(前言、详细图解、代码部分)
JavaSE——算法(2/2):查找算法-二分查找(前言、详细图解、代码部分)
61 2