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

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

实验内容:

基本内容:

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

相关文章
|
机器学习/深度学习 算法 数据挖掘
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
1750 6
|
存储 算法 编译器
数据结构实验之矩阵的运算器(二维数组)
本实验旨在通过团队合作,掌握数组和矩阵相关运算的代码实现,包括矩阵的加减、数乘、转置、乘法、n次方及行列式的计算。实验过程中,成员们需分工协作,解决编程难题,最终实现一个功能完备的矩阵计算器。通过本实验,不仅锻炼了编程能力,还加深了对数学概念的理解,同时培养了团队合作精神。
368 4
数据结构实验之串模式匹配问题
本实验旨在掌握串模式匹配技术,通过创建文本文件、实现单词计数与定位功能,最终构建一个包含文件建立、单词统计与定位、程序退出等选项的主菜单,以增强对字符串处理的理解与应用能力。
229 4
|
10月前
|
存储 监控 安全
企业上网监控系统中红黑树数据结构的 Python 算法实现与应用研究
企业上网监控系统需高效处理海量数据,传统数据结构存在性能瓶颈。红黑树通过自平衡机制,确保查找、插入、删除操作的时间复杂度稳定在 O(log n),适用于网络记录存储、设备信息维护及安全事件排序等场景。本文分析红黑树的理论基础、应用场景及 Python 实现,并探讨其在企业监控系统中的实践价值,提升系统性能与稳定性。
651 1
|
10月前
|
存储 监控 算法
基于跳表数据结构的企业局域网监控异常连接实时检测 C++ 算法研究
跳表(Skip List)是一种基于概率的数据结构,适用于企业局域网监控中海量连接记录的高效处理。其通过多层索引机制实现快速查找、插入和删除操作,时间复杂度为 $O(\log n)$,优于链表和平衡树。跳表在异常连接识别、黑名单管理和历史记录溯源等场景中表现出色,具备实现简单、支持范围查询等优势,是企业网络监控中动态数据管理的理想选择。
266 0
|
存储 算法 Java
算法系列之数据结构-二叉树
树是一种重要的非线性数据结构,广泛应用于各种算法和应用中。本文介绍了树的基本概念、常见类型(如二叉树、满二叉树、完全二叉树、平衡二叉树、B树等)及其在Java中的实现。通过递归方法实现了二叉树的前序、中序、后序和层次遍历,并展示了具体的代码示例和运行结果。掌握树结构有助于提高编程能力,优化算法设计。
447 10
 算法系列之数据结构-二叉树
|
算法 Java
算法系列之数据结构-Huffman树
Huffman树(哈夫曼树)又称最优二叉树,是一种带权路径长度最短的二叉树,常用于信息传输、数据压缩等方面。它的构造基于字符出现的频率,通过将频率较低的字符组合在一起,最终形成一棵树。在Huffman树中,每个叶节点代表一个字符,而每个字符的编码则是从根节点到叶节点的路径所对应的二进制序列。
430 3
 算法系列之数据结构-Huffman树
|
算法 Java
算法系列之数据结构-二叉搜索树
二叉查找树(Binary Search Tree,简称BST)是一种常用的数据结构,它能够高效地进行查找、插入和删除操作。二叉查找树的特点是,对于树中的每个节点,其左子树中的所有节点都小于该节点,而右子树中的所有节点都大于该节点。
593 22
|
存储 机器学习/深度学习 算法
C 408—《数据结构》算法题基础篇—链表(下)
408考研——《数据结构》算法题基础篇之链表(下)。
557 30
|
C语言 C++ 容器
【数据结构】二叉搜索树(二叉排序树)
本文介绍了二叉搜索树(Binary Search Tree, BST)的定义、实现及其性能分析。二叉搜索树是一种特殊的二叉树,其特点是左子树所有节点值小于根节点值,右子树所有节点值大于根节点值,且每个子树也满足此特性。文中详细讲解了BST的节点结构、插入、查找、删除等操作的实现,并通过C++代码展示了这些功能。此外,还讨论了BST的性能:在理想情况下,时间复杂度接近O(logN),但在最坏情况下可能退化为O(N)。为了提高效率,后续将学习自平衡二叉搜索树如AVL树和红黑树。掌握BST有助于理解STL中的set和map容器。感谢阅读,欢迎点赞支持。
1481 9

热门文章

最新文章