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

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

实验内容:

基本内容:

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

相关文章
|
存储 监控 安全
企业上网监控系统中红黑树数据结构的 Python 算法实现与应用研究
企业上网监控系统需高效处理海量数据,传统数据结构存在性能瓶颈。红黑树通过自平衡机制,确保查找、插入、删除操作的时间复杂度稳定在 O(log n),适用于网络记录存储、设备信息维护及安全事件排序等场景。本文分析红黑树的理论基础、应用场景及 Python 实现,并探讨其在企业监控系统中的实践价值,提升系统性能与稳定性。
851 1
|
存储 监控 算法
基于跳表数据结构的企业局域网监控异常连接实时检测 C++ 算法研究
跳表(Skip List)是一种基于概率的数据结构,适用于企业局域网监控中海量连接记录的高效处理。其通过多层索引机制实现快速查找、插入和删除操作,时间复杂度为 $O(\log n)$,优于链表和平衡树。跳表在异常连接识别、黑名单管理和历史记录溯源等场景中表现出色,具备实现简单、支持范围查询等优势,是企业网络监控中动态数据管理的理想选择。
350 0
|
存储 算法 Java
算法系列之数据结构-二叉树
树是一种重要的非线性数据结构,广泛应用于各种算法和应用中。本文介绍了树的基本概念、常见类型(如二叉树、满二叉树、完全二叉树、平衡二叉树、B树等)及其在Java中的实现。通过递归方法实现了二叉树的前序、中序、后序和层次遍历,并展示了具体的代码示例和运行结果。掌握树结构有助于提高编程能力,优化算法设计。
588 10
 算法系列之数据结构-二叉树
|
算法 Java
算法系列之数据结构-Huffman树
Huffman树(哈夫曼树)又称最优二叉树,是一种带权路径长度最短的二叉树,常用于信息传输、数据压缩等方面。它的构造基于字符出现的频率,通过将频率较低的字符组合在一起,最终形成一棵树。在Huffman树中,每个叶节点代表一个字符,而每个字符的编码则是从根节点到叶节点的路径所对应的二进制序列。
533 3
 算法系列之数据结构-Huffman树
|
算法 Java
算法系列之数据结构-二叉搜索树
二叉查找树(Binary Search Tree,简称BST)是一种常用的数据结构,它能够高效地进行查找、插入和删除操作。二叉查找树的特点是,对于树中的每个节点,其左子树中的所有节点都小于该节点,而右子树中的所有节点都大于该节点。
716 22
|
存储 机器学习/深度学习 算法
C 408—《数据结构》算法题基础篇—链表(下)
408考研——《数据结构》算法题基础篇之链表(下)。
731 30
|
存储 算法 C语言
C 408—《数据结构》算法题基础篇—链表(上)
408考研——《数据结构》算法题基础篇之链表(上)。
1041 25
|
存储 人工智能 算法
C 408—《数据结构》算法题基础篇—数组(通俗易懂)
408考研——《数据结构》算法题基础篇之数组。(408算法题的入门)
1121 23
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
515 59
|
存储 C语言 C++
【C++数据结构——栈与队列】顺序栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现顺序栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 1.初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储
1284 77

热门文章

最新文章