数据结构实验五 查找算法的实现

广州大学学生实验报告

 

开课实验室:计算机科学与工程实验(电子楼416B)     2019年6月11日

学院

计算机科学与教育软件学院

年级、专业、班

 

姓名

 

学号

 

实验课程名称

数据结构实验

成绩

 

实验项目名称

实验五 查找算法

指导老师

 

一、实验目的

掌握线性的定义及基本操作,用链表实现:遍历、查找、插入、删除、翻转。

二、使用仪器、器材

微机一台

操作系统:WinXP

编程软件:C++

三、实验内容及原理

顺序查找:使用数组或链表结构。用随机函数生成16个不重复的字母(’a’~’z’),键盘输入待查找的字母,返回查找成功与否,若成功则返回该字母所在的位置(序号),并计算比较次数。

折半查找:用数组实现,查找前元素先排序。计算比较次数。分别用查找成功、不成功进行测试。

二叉查找树:手工输入10个字母,生成一棵二叉查找树,用递归算法打印树结构或分别输出先序和中序遍历序列以确认其结构。键盘输入待查找的字母,计算比较次数。分别用查找成功、不成功进行测试。

 

注意:实验报告包含运行测试截屏,内容包括16个数据元素、待查找的元素、查找成功与否、比较的次数等。

  • 实验过程原始数据记录
  1. 顺序查找

// ConsoleApplication73.cpp : 定义控制台应用程序的入口点。

//

 

#include "stdafx.h"

//顺序查找算法

#include<stdlib.h>

#include "SeqSearch.h"

#include "time.h"

 

int main()

{

    time_t t;   // 定义时间变量

    srand((unsigned)time(&t));  //由时间确定随机序列,执行一次

    int a[26];

    int sjzm[16];

 

    int w, tt;

    for (int i = 0; i<26; i++)

         a[i] = i + 1;

    for (int i = 0; i<16; i++)

    {

         w = rand() % (26 - i) + i;

         tt = a[i];

         a[i] = a[w];

         a[w] = tt;

    }

    for (int i = 0; i < 16; i++)

         sjzm[i] = a[i] + 96;

 

    RecType R[MAXL];

    CreateList(R, sjzm, 16);

    printf("随机生成的16个不重复的字母为:"); DispList(R, 16);

    int time = 0;

    int flag;

    char search;

    int result;

    printf("进入查询请输入非零数字,退出查询请输入0\n");

    scanf_s("%d", &flag);

    getchar();

    while (flag) {

         printf("请输入要查找的字母:");

         scanf_s("%c", &search);

         result=SeqSearch(R, 16, search, time);

         getchar();

         if (result != 0) {

             printf("要查找的字母的位置为:%d \n", result);

         }

         else

             printf("查询非法\n");

         printf("进入查询请输入非零数字,退出查询请输入0\n");

         scanf_s("%d",& flag);

         getchar();

    }

    return 1;

}

 

 

#pragma once

#include <stdio.h>

#define MAXL 100      //最大长度

typedef int KeyType//定义关键字类型为int

typedef char InfoType;

 

typedef struct

{

    KeyType key;      //关键字项

    InfoType data;        //其他数据项,类型为InfoType

} RecType;                //查找元素的类型

void CreateList(RecType R[], KeyType keys[], int n);//创建顺序表

void DispList(RecType R[], int n); //输出顺序表

 

int SeqSearch(RecType R[], int n, KeyType k, int& time);

 

 

 

#include "stdafx.h"

#include"SeqSearch.h"

void CreateList(RecType R[], KeyType keys[], int n//创建顺序表

{

    for (int i = 0; i<n; i++)

         R[i].key = keys[i];

}

void DispList(RecType R[], int n//输出顺序表

{

    for (int i = 0; i<n; i++)

         printf("%c ", R[i].key);

    printf("\n");

}

 

int SeqSearch(RecType R[], int n, KeyType k,int& time)

{

    int i = 0;

    while (i < n && R[i].key != k) //从表头往后找

    {

         i++;

         time++;

    }

    if (i >= n)

         return 0;

    else

         return i + 1;

}

 

  1. 折半查找

// ConsoleApplication74.cpp : 定义控制台应用程序的入口点。

//

 

#include "stdafx.h"

#include"BinSearch.h"

 

 

//折半查找算法

int main()

{

    int n = 11;

    RecType R[MAXL];

    KeyType a[] = { 3,2,10,20,15,25,28,29,40,35,30 };

    printf("原始数据:");

    for (int i = 0; i < 11; i++)

         printf("%d  ", a[i]);

    printf("\n");

    CreateList(R, a, n);

    QuickSort(R, 0, 10);

    printf("查找表:"); DispList(R, n);

    int flag,result,search,time=0;

    printf("进入查询请输入非零数字,退出查询请输入0\n");

    scanf_s("%d", &flag);

    getchar();

    while (flag) {

         time = 0;

         printf("请输入要查找的数字:");

         scanf_s("%d", &search);

         result = BinSearch(R, 11, search, time);

         getchar();

         if (result != 0) {

             printf("要查找的字母的位置为:%d \n", result);

             printf("查找次数为:%d \n", time);

         }

         else

             printf("查询非法\n");

         printf("进入查询请输入非零数字,退出查询请输入0\n");

         scanf_s("%d", &flag);

         getchar();

    }

    return 1;

}

 

 

#pragma once

#include <stdio.h>

#define MAXL 100      //最大长度

typedef int KeyType//定义关键字类型为int

typedef char InfoType;

 

typedef struct

{

    KeyType key;      //关键字项

    InfoType data;        //其他数据项,类型为InfoType

} RecType;                //查找元素的类型

                          //顺序表基本运算算法

void CreateList(RecType R[], KeyType keys[], int n); //创建顺序表

void DispList(RecType R[], int n); //输出顺序表

 

int BinSearch(RecType R[], int n, KeyType k, int &time); //折半查找算法

 

int partition(RecType R[], int s, int t);   //一趟划分

void QuickSort(RecType R[], int s, int t); //对R[s..t]的元素进行快速排序

 

 

 

#include "stdafx.h"

#include"BinSearch.h"

//顺序表基本运算算法

void CreateList(RecType R[], KeyType keys[], int n//创建顺序表

{

    for (int i = 0; i<n; i++)

         R[i].key = keys[i];

}

void DispList(RecType R[], int n//输出顺序表

{

    for (int i = 0; i<n; i++)

         printf("%d ", R[i].key);

    printf("\n");

}

 

 

int BinSearch(RecType R[], int n, KeyType k,int &time) //折半查找算法

{

    int low = 0, high = n - 1, mid;

    while (low <= high)            //当前区间存在元素时循环

    {

         mid = (low + high) / 2;

         if (k == R[mid].key)      //查找成功返回其逻辑序号mid+1

         {

             return mid + 1;

             time++;

         }

         if (k < R[mid].key)       //继续在R[low..mid-1]中查找

         {

             high = mid - 1;

             time++;

         }

         else                  //k>R[mid].key

         {

             low = mid + 1;            //继续在R[mid+1..high]中查找

             time++;

         }

    }

    return 0;                      //未找到时返回0(查找失败)

}

 

int count = 0;

int partition(RecType R[], int s, int t)    //一趟划分

{

    int i = s, j = t;

    RecType tmp = R[i];            //以R[i]为基准

    while (i<j)               //从两端交替向中间扫描,直至i=j为止

    {

         while (j>i && R[j].key >= tmp.key)

             j--;              //从右向左扫描,找一个小于tmp.key的R[j]

         R[i] = R[j];              //找到这样的R[j],放入R[i]处

         while (i<j && R[i].key <= tmp.key)

             i++;              //从左向右扫描,找一个大于tmp.key的R[i]

         R[j] = R[i];              //找到这样的R[i],放入R[j]处

    }

    R[i] = tmp;

    return i;

}

void QuickSort(RecType R[], int s, int t) //对R[s..t]的元素进行快速排序

{

    int i;

    RecType tmp;

    if (s<t)                       //区间内至少存在两个元素的情况

    {

         count++;

         i = partition(R, s, t);

         DispList(R, 10);          //调试用

         QuickSort(R, s, i - 1);        //对左区间递归排序

         QuickSort(R, i + 1, t);        //对右区间递归排序

    }

}

 

  1. 二叉查找树

#include "stdafx.h"

 

 

//二叉排序树算法

#include <stdio.h>

#include <malloc.h>

#include"SearchBST.h"

 

int main()

{

BSTNode *bt,*f,*result;

int n = 10;

char in[10];

printf("请依次输入10个不重复的字母:\n");

for(int i=0;i<10;i++)

{

    printf("请依次输入第%d个不重复的字母:\n",i);

    scanf_s("%c", &in[i]);

    getchar();

}

//KeyType a[]={25,18,46,2,53,39,32,4,74,67,60,11};

bt=CreateBST(in,n);

printf("BST:");DispBST(bt);printf("\n");

int flag,search;

printf("进入查询请输入非零数字,退出查询请输入0\n");

scanf_s("%d", &flag);

getchar();

while (flag) {

    int time = 0;

    printf("请输入要查找的字母:");

    scanf_s("%c", &search);

    result = SearchBST1(bt, search , NULL,f,time);

    getchar();

    if (result != NULL&&f !=NULL) {

         printf("%c的双亲是%c\n", search, f->key);

         printf("查找次数为:%d \n", time);

    }

    else if (result != NULL&&f == NULL) {

         printf("%c的双亲是首首元素\n", search);

         printf("查找次数为:1\n");

    }

    else if (result == NULL&&f == NULL)

         printf("查询非法\n");

    printf("进入查询请输入非零数字,退出查询请输入0\n");

    scanf_s("%d", &flag);

    getchar();

}

 

DestroyBST(bt);

return 1;

}

 

 

#pragma once

typedef char KeyType;

typedef char InfoType[10];

typedef struct node

{

    KeyType key;                   //关键字项

    InfoType data;                     //其他数据域

    struct node *lchild, *rchild;  //左右孩子指针

} BSTNode;                         //二叉排序树结点类型

bool InsertBST(BSTNode *&bt, KeyType k);

//在二叉排序树bt中插入一个关键字为k的结点。插入成功返回真,否则返回假

 

BSTNode *CreateBST(KeyType A[], int n); //创建二叉排序树

                                                //返回BST树根结点指针

 

void DispBST(BSTNode *bt); //输出一棵排序二叉树

 

BSTNode *SearchBST(BSTNode *bt, KeyType k);

 

BSTNode *SearchBST1(BSTNode *bt, KeyType k, BSTNode *f1, BSTNode *&f, int &time);

void Delete1(BSTNode *p, BSTNode *&r);  //当被删p结点有左右子树时的删除过程

 

void Delete(BSTNode *&p);  //从二叉排序树中删除p结点

 

int DeleteBST(BSTNode *&bt, KeyType k); //在bt中删除关键字为k的结点

 

void DestroyBST(BSTNode *&bt); //销毁二叉排序树bt

 

 

 

 

#include "stdafx.h"

#include"SearchBST.h"

#include <malloc.h>

bool InsertBST(BSTNode *&bt, KeyType k)//在二叉排序树bt中插入一个关键字为k的结点。插入成功返回真,否则返回假

{

    if (bt == NULL)                         //原树为空,新插入的结点为根结点

    {

         bt = (BSTNode *)malloc(sizeof(BSTNode));

         bt->key = k; bt->lchild = bt->rchild = NULL;

         return true;

    }

    else if (k == bt->key)                  //树中存在相同关键字的结点,返回假

         return false;

    else if (k<bt->key)

         return InsertBST(bt->lchild, k);   //插入到左子树中

    else

         return InsertBST(bt->rchild, k);   //插入到右子树中

}

 

BSTNode *CreateBST(KeyType A[], int n)      //创建二叉排序树

                                                //返回BST树根结点指针

{

    BSTNode *bt = NULL;                //初始时bt为空树

    int i = 0;

    while (i<n)

    {

         InsertBST(bt, A[i]);           //将关键字A[i]插入二叉排序树bt中

         i++;

    }

    return bt;                         //返回建立的二叉排序树的根指针

}

 

void DispBST(BSTNode *bt)      //输出一棵排序二叉树

{

    if (bt != NULL)

    {

         printf("%c ", bt->key);

         if (bt->lchild != NULL || bt->rchild != NULL)

         {

             printf("(");                       //有孩子结点时才输出(

             DispBST(bt->lchild);               //递归处理左子树

             if (bt->rchild != NULL) printf(",");    //有右孩子结点时才输出,

             DispBST(bt->rchild);               //递归处理右子树

             printf(")");                       //有孩子结点时才输出)

         }

    }

}

BSTNode *SearchBST(BSTNode *bt, KeyType k)

{

    if (bt == NULL || bt->key == k)         //递归终结条件

         return bt;

    if (k<bt->key)

         return SearchBST(bt->lchild, k);  //在左子树中递归查找

    else

         return SearchBST(bt->rchild, k);  //在右子树中递归查找

}

BSTNode *SearchBST1(BSTNode *bt, KeyType k, BSTNode *f1, BSTNode *&f,int &time)

/*在bt中查找关键字为k的结点,若查找成功,该函数返回该结点的指针,

f返回其双亲结点;否则,该函数返回NULL。

其调用方法如下:

SearchBST(bt,x,NULL,f);

这里的第3个参数f1仅作中间参数,用于求f,初始设为NULL*/

{

    if (bt == NULL)

    {

         f = NULL;

         return(NULL);

    }

    else if (k == bt->key)

    {

         f = f1;

         time++;

         return(bt);

    }

    else if (k < bt->key)

    {

         time++;

         return SearchBST1(bt->lchild, k, bt, f, time);//在左子树中递归查找

    }

    else

    {

         time++;

         return SearchBST1(bt->rchild, k, bt, f, time);  //在右子树中递归查找

    }

}

 

void Delete1(BSTNode *p, BSTNode *&r//当被删p结点有左右子树时的删除过程

{

    BSTNode *q;

    if (r->rchild != NULL)

         Delete1(p, r->rchild); //递归找最右下结点r

    else                      //找到了最右下结点r

    {

         p->key = r->key;          //将*结点的值赋给结点p

         q = r;

         r = r->lchild;            //直接将其左子树的根结点放在被删结点的位置上

         free(q);              //释放原结点r的空间

    }

}

void Delete(BSTNode *&p)       //从二叉排序树中删除p结点

{

    BSTNode *q;

    if (p->rchild == NULL)    //p结点没有右子树的情况

    {

         q = p;

         p = p->lchild;            //直接将其右子树的根结点放在被删结点的位置上

         free(q);

    }

    else if (p->lchild == NULL)    //p结点没有左子树的情况

    {

         q = p;

         p = p->rchild;            //将p结点的右子树作为双亲结点的相应子树

         free(q);

    }

    else Delete1(p, p->lchild);    //p结点既没有左子树又没有右子树的情况

}

int DeleteBST(BSTNode *&bt, KeyType k//在bt中删除关键字为k的结点

{

    if (bt == NULL)

         return 0;                 //空树删除失败

    else

    {

         if (k<bt->key)

             return DeleteBST(bt->lchild, k);   //递归在左子树中删除为k的结点

         else if (k>bt->key)

             return DeleteBST(bt->rchild, k);   //递归在右子树中删除为k的结点

         else

         {

             Delete(bt);       //调用Delete(bt)函数删除*bt结点

             return 1;

         }

    }

}

void DestroyBST(BSTNode *&bt)      //销毁二叉排序树bt

{

    if (bt != NULL)

    {

         DestroyBST(bt->lchild);

         DestroyBST(bt->rchild);

         free(bt);

    }

}

 

  • 实验结果及分析
  1. 顺序查找

 

2.折半查找

 

 

3.二叉查找树

 

   

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/418874.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端学习(1811):前端调试之css装饰cursor练习

index.html <!DOCTYPE html> <html lang"en"><head><!--系统内置 start--><script type"text/javascript"></script><!--系统内置 end--><meta charset"UTF-8"><title>练习</title&g…

数据结构实验六 综合数据处理

广州大学学生实验报告 开课实验室&#xff1a;计算机科学与工程实验&#xff08;电子楼416A&#xff09; 2019年6月14日 学院 计算机科学与教育软件学院 年级、专业、班 计算机大类 144班 姓名 学号 实验课程名称 数据结构实验 成绩 实验项目名称 实验六…

CSS中的text-shadow。

text-shadow&#xff08;文字投影&#xff09;&#xff0c;box-shadow&#xff08;容器投影&#xff09;&#xff0c;border-radius&#xff08;圆角&#xff09;这三个属性估计以后用的比较多&#xff0c;记录 一下。目前不支持IE系列&#xff08;不过可以使用其他方法实现&am…

前端学习(1803):前端调试之事件伪类练习二

index.html <!DOCTYPE html> <html lang"en"><head><!--系统内置 start--><script type"text/javascript"></script><!--系统内置 end--><meta charset"UTF-8"><title>练习</title&g…

数据结构课程设计 神秘国度的爱情故事

数据结构 课程设计报告 广州大学 计算机科学与网络工程学院 计算机系 17级计科专业2班 2019年6月30日 广州大学学生实验报告 开课学院及实验室&#xff1a;计算机科学与工程实验室 2019年07月01日 学院 计算机科学与网络工程学院 年级/专业/班 计科1…

前端学习(1805):前端调试之列表伪类练习

index.html <!DOCTYPE html> <html lang"en"><head><!--系统内置 start--><script type"text/javascript"></script><!--系统内置 end--><meta charset"UTF-8"><title>练习</title&g…

Android中的一些基础知识(二)

这几天在回顾Android的基础知识&#xff0c;就把一些常见的知识点整理一下&#xff0c;以后忘了也可以翻出来看一看。 简单介绍一下Activity的生命周期 在API文档中对生命周期回调的函数描述的很详细&#xff0c;这里我只是翻译了一下。 onCreate&#xff1a;当Activity第一次…

关于Open browser failed!! Please check if you have installed the browser chrome correctly!错误的一种解决方法

新建一个文件夹&#xff0c;再在新建的文件夹里写html文件&#xff0c;再用快捷键&#xff1a;altb打开即可。

前端学习(1806):前端调试之列表伪类练习二

index.html <!DOCTYPE html> <html lang"en"><head><!--系统内置 start--><script type"text/javascript"></script><!--系统内置 end--><meta charset"UTF-8"><title>练习</title&g…

虚拟机安装

带你解密Linux的【Vm】-CSDN博客https://blog.csdn.net/lz17267861157/article/details/134031133

推荐开发工具系列之--LinrF5(自动刷新)

最近有点事&#xff1b;略忙&#xff1b;以至于上篇文章说好的明天一直到了今天才到&#xff1b; //*******************************分割是会呼吸的痛****************************** 作为一个程序员&#xff1b;尤其是作为一个网站开发程序员&#xff1b;如果再更尤其点作为一…

前端学习(1807):前端调试之列表伪类练习三

index.html <!DOCTYPE html> <html lang"en"><head><!--系统内置 start--><script type"text/javascript"></script><!--系统内置 end--><meta charset"UTF-8"><title>练习</title&g…

关于win32与win64的兼容性问题

源代码&#xff1a; &#xff08;操作系统作业&#xff09;printf("\nMemory attached at %X\n",(int)shm); shm是个char*地址&#xff1b; gcc编译出现警告&#xff1a;lcylcy-Lenovo-R720-15IKBN:~ $ gcc -o shmread shmread.c shmread.c: In function ‘main’:…

前端学习(1812):前端调试之shadow练习

index.html <!DOCTYPE html> <html lang"en"><head><!--系统内置 start--><script type"text/javascript"></script><!--系统内置 end--><meta charset"UTF-8"><title>练习</title&g…

bullet HashMap 内存紧密的哈希表

last modified time&#xff1a;2014-11-9 14:07:00 bullet 是一款开源物理引擎&#xff0c;它提供了碰撞检測、重力模拟等功能&#xff0c;非常多3D游戏、3D设计软件&#xff08;如3D Mark&#xff09;使用它作为物理引擎。作为物理引擎&#xff0c;对性能的要求是非常苛刻的&…

前端学习(1813):前端调试之微博个人banner开发

index.html <!DOCTYPE html> <html lang"en"><head> <!--系统内置 start--> <script type"text/javascript"></script> <!--系统内置 end--><meta charset"UTF-8"><title>微博实战--ban…

操作系统课设——设计模拟一个SPOOLING假脱机输出程序

广州大学操作系统课程设计报告 要求&#xff1a;书写课程设计报告&#xff0c;报告中应该包含如下内容&#xff1a; 一&#xff0e;课程设计题目及内容 课程设计题目&#xff1a;题目三&#xff1a; 设计模拟一个SPOOLING假脱机输出程序 &#xff08;1&#xff09; 系统设计要…