顺序表的查找和二叉排序树的查找-数据结构类C语言

目录

一、功能函数(func.cpp)

二、主调函数(main.cpp)

三、头文件(before.h)

四、运行截图及功能函数部分展示

        1、顺序表

       (1)顺序表的创建

       (2)顺序查找法

       (3)冒泡排序

       (4)折半查找法

        2、二叉排序树

        (1)二叉排序树的建立

        (2)二叉排序树的插入

        (3)二叉排序树的查找

五、运行环境


一、功能函数(func.cpp)

#include <iostream>
#include "before.h"

using namespace std;

//*************************************//
//顺序表相关函数定义
status CreateSST(SSTable &ST,int numb)
{
    ST.R = (ElemType *)malloc(sizeof(ElemType)*(numb+1));
    if(!ST.R) return ERROR;                     //空间分配失败
    ST.length = numb;
    cout << "---请输入" << numb << "个元素:" << endl;
    for(int i = 1;i < numb+1;i ++) cin >> ST.R[i].key;
    fflush(stdin);                        //清除缓存
    return OK;                                 //创建成功
}//创建顺序表

status Search_Seq(SSTable ST,KeyType key,int &cnt)
{
    ST.R[0].key = key;                             //监视哨
    int i;
    for(i = ST.length;i > 0;i --)                  //末尾开始查找
    {
        if(ST.R[i].key != key)
        {
            cnt ++;
            cout << "经过的元素:" << ST.R[i].key << endl;
        }
        if(ST.R[i].key == key) break;
    }
    cnt ++;
    return i;                                    //返回-1则不存在于顺序表中
}//顺序查找

status Search_Bin(SSTable ST,KeyType key,int &cnt)
{
    int low = 1;
    int high = ST.length;
    int mid;
    if(high < 1) return OVERFLOW;                    //表空
    while(low <= high)
    {
        mid = (low+high)/2;
        cout << "经过元素:" << ST.R[mid].key << endl;
        cnt ++;
        if(key == ST.R[mid].key) return mid;        //找到待查元素
        else if(key < ST.R[mid].key) high = mid-1;  //在前一子表进行查找
        else low = mid+1;                           //在后一子表进行查找
    }
    return ERROR;                                   //key不存在于顺序表
}//二分查找

status Bubble(SSTable &ST)
{
    int length = ST.length;
    if(length < 1) return OVERFLOW;                 //表为空
    for(int i = length-1;i > 0;i --)                //循环次数
    {
        for(int j = 1;j < i+1;j ++)
        {
            if(ST.R[j].key > ST.R[j+1].key)         //后一个值比前一个值小就交换
            {
                KeyType temp = ST.R[j].key;
                ST.R[j].key = ST.R[j+1].key;
                ST.R[j+1].key = temp;
            }
        }
    }
    return OK;
}//冒泡排序

status QuickSort(SSTable &ST,int left,int right)
{
    if(left >= right) return OK;
    int begin = left;
    int end = right;
    int keyi = begin;
    while(left < end)
    {
        while(begin < end && ST.R[end].key >= ST.R[keyi].key) end--;
        while(begin < end && ST.R[begin].key <= ST.R[keyi].key) begin++;

        KeyType temp = ST.R[begin].key;
        ST.R[begin].key = ST.R[end].key;
        ST.R[end].key = temp;
    }
    KeyType temp = ST.R[begin].key;
    ST.R[begin].key = ST.R[keyi].key;
    ST.R[keyi].key = temp;

    QuickSort(ST,left,begin-1);
    QuickSort(ST,begin+1,right);
}//快速排序

void TraverseSST(SSTable ST)
{
    cout << "当前顺序表为:" << endl;
    for(int i = 1;i < ST.length+1;i ++)
    {
        if(i%7 == 0) cout << endl;
        cout << ST.R[i].key << "  ";
    }
    cout << endl;
}//遍历顺序表
//*************************************//

//*************************************//
//二叉排序树的函数定义
void CreateBST(BSTree &T)
{
    T = NULL;          //初始化为空树
    ElemType e;
    int numb[1000],i;
    cout << "---请输入一组二叉排序树的整型元素(以-1作为结束标志):" << endl;
    for(i = 0;numb[i] != -1;i ++)
    {
        cin >> numb[i];
        if(numb[i] == -1) break;
        e.key = numb[i];
        InsertBST(T,e);
    }
}//二叉排序树的创建

void InsertBST(BSTree &T,ElemType e)
{
    if(!T)
    {
        BSTNode *s = (BSTNode *)malloc(sizeof(BSTNode));
        s->data.key = e.key;
        s->lchild = s->rchild = NULL;
        T = s;
    }
    else if(e.key < T->data.key) InsertBST(T->lchild,e);    //插入左子树
    else if(e.key > T->data.key) InsertBST(T->rchild,e);    //插入右子树
}//二叉排序树的插入

BSTree SearchBST(BSTree T,KeyType key,int &cnt)
{
    cnt ++;
    if((T == NULL) || (T->lchild==NULL&&T->rchild==NULL&&T->data.key!=key) || key==T->data.key)
    {
        return T;//查找结束
    }
    else if(key < T->data.key)
    {
        cout << "经过元素:" << T->data.key << endl;
        return SearchBST(T->lchild,key,cnt); //在左子树中继续查找
    }
    else
    {
        cout << "经过元素:" << T->data.key << endl;
        return SearchBST(T->rchild,key,cnt); //在右子树中继续查找
    }
}//二叉排序树的递归查找

status TraverseBST(BSTree T)
{
    if(T == NULL) return OK;
    else
    {
        TraverseBST(T->lchild);
        cout << T->data.key << "  ";
        TraverseBST(T->rchild);
    }
}//二叉排序树的中序遍历

//调用菜单
void Menu()
{
    printf("\t\t\t********************此为最后一次数据结构实验的菜单***********************\n");
    printf("\t\t\t\t1、顺序表                        2、 二叉排序树                       \n");
    printf("\t\t\t\t0、退出当前操作系统                                                   \n");
    printf("\t\t\t**********************************************************************\n");
}//调用菜单的打印

void Menu_SL()
{
    printf("\t\t\t*************************此为顺序表的菜单*******************************\n");
    printf("\t\t\t\t1、顺序表的创建                          2、顺序查找                   \n");
    printf("\t\t\t\t3、冒泡排序                              4、快速排序                   \n");
    printf("\t\t\t\t5、折半查找法                            6、遍历顺序表                 \n");
    printf("\t\t\t\t0、退出当前操作系统                                                   \n");
    printf("\t\t\t**********************************************************************\n");
}//顺序表菜单的打印

void Menu_BST()
{
    printf("\t\t\t***********************此为二叉排序树的菜单*****************************\n");
    printf("\t\t\t\t1、二叉排序树的建立                      2、二叉排序树的查找            \n");
    printf("\t\t\t\t3、二叉排序树的插入                      4、二叉排序树的遍历            \n");
    printf("\t\t\t\t0、退出当前操作系统                                                   \n");
    printf("\t\t\t**********************************************************************\n");
}//二叉排序树菜单的打印

//
//Created by somewon on 2022/12/6.
//

二、主调函数(main.cpp)

#include <iostream>
#include "before.h"

using namespace std;

int main()
{
    int CH;
    do {
        Menu();
        cout << "---请输入进入的菜单:";
        cin >> CH;
        if(CH == 1)         //顺序表调用函数
        {
            int ch;
            int numb;
            int fine,cnt;
            KeyType find;
            SSTable ST;
            do {
                Menu_SL();
                cout << "---请输入你的选择:";
                cin >> ch;
                switch(ch)
                {
                    case 1:
                        cout << "---请输入顺序表元素的个数:";
                        cin >> numb;
                        fine = CreateSST(ST,numb);
                        if(fine == ERROR) cout << "当前顺序表空间分配失败!请再次进行操作!" << endl;
                        else TraverseSST(ST);
                        break;
                    case 2:
                        cout << "---请输入需要查找的元素:";
                        cin >> find;
                        cnt = 0;                     //查找次数
                        fine = Search_Seq(ST,find,cnt);
                        if(fine == 0)
                        {
                            cout << "该元素不在顺序表中!" << endl;
                            cout << "查找次数为:" << cnt << endl;        //末尾开始查找
                        }
                        else
                        {
                            cout << "所查找的元素" << find << "的位置为:" << fine << endl;
                            cout << "查找次数为:" << cnt << endl;        //末尾开始查找
                        }
                        break;
                    case 3:
                        fine = Bubble(ST);
                        if(fine == OVERFLOW) cout << "当前顺序表为空!" << endl;
                        else if(fine == OK)
                        {
                            cout << "冒泡排序成功!" << endl;
                            TraverseSST(ST);
                        }
                        break;
                    case 4:
                        fine = QuickSort(ST,1,ST.length);
                        if(fine == OK)
                        {
                            cout << "快速排序成功!" << endl;
                            TraverseSST(ST);
                        }
                        break;
                    case 5:
                        cout << "---请输入需要查找的元素:";
                        cin >> find;
                        cnt = 0;
                        fine = Search_Bin(ST,find,cnt);
                        if(fine == ERROR)
                        {
                            cout << "该元素不在顺序表中!" << endl;
                            cout << "查找的次数为:" << cnt << endl;
                        }
                        else if(fine == OVERFLOW) cout << "该表为空!" << endl;
                        else
                        {
                            cout << "所查找的元素" << find << "的位置为:" << fine << endl;
                            cout << "查找的次数为:" << cnt << endl;
                        }
                        break;
                    case 6:
                        TraverseSST(ST);
                        break;
                    case 0:
                        goto END;
                }
            }while(ch);
        }
        else if(CH == 2)    //二叉排序树调用函数
        {
            int ch;
            BSTree T,s;
            int cnt;
            KeyType find;
            ElemType e;
            do {
                Menu_BST();
                cout << "---请输入你的选择:";
                cin >> ch;
                switch(ch)
                {
                    case 1:
                        CreateBST(T);
                        cout << "二叉排序树建立完成!" << endl;
                        TraverseBST(T);
                        cout << endl;
                        break;
                    case 2:
                        cout << "---请输入需要查询的整型数据:";
                        cin >> find;
                        cnt = 0;
                        s = NULL;
                        s = SearchBST(T,find,cnt);
                        if(s == NULL || s->data.key!=find)
                        {
                            cout << "该元素不存在于二叉排序树中!" << endl;
                            cout << "查找次数为:" << cnt << endl;
                        }
                        else
                        {
                            cout << "查找的元素" << find <<"存在于二叉排序树中!" << endl;
                            cout << "查找次数为:" << cnt << endl;
                        }
                        break;
                    case 3:
                        cout << "---请输入需要插入的元素:";
                        cin >> e.key;
                        InsertBST(T,e);
                        cout << "插入成功!" << endl;
                        cout << "当前排序二叉树为:" << endl;
                        TraverseBST(T);
                        cout << endl;
                        break;
                    case 4:
                        cout << "当前排序二叉树为:" << endl;
                        TraverseBST(T);
                        cout << endl;
                        break;
                    case 0:
                        goto END;
                }
            }while(ch);
        }
        else if(CH == 0) goto ENDD;
        else cout << "无该选择!" << endl;
        END:
        cout << "已退出当前菜单!" << endl;
    }while(CH);
    ENDD:
    cout << "已退出当前程序!" << endl;
    return 0;
}
//
//Created by somewon on 2022/12/6.
//

三、头文件(before.h)

#ifndef _BEFORE_H
#define _BEFORE_H

#define OK 1
#define ERROR 0
#define OVERFLOW (-1)

typedef int status;
typedef int KeyType;
typedef int InfoType;
typedef struct
{
    KeyType key;
    InfoType otherinfo;
}ElemType;

//顺序表相关函数声明
typedef struct
{
    ElemType *R;
    int length;
}SSTable;

status CreateSST(SSTable &ST,int numb);           //创建顺序表
status Search_Seq(SSTable ST,KeyType key,int &cnt);//顺序查找
status Search_Bin(SSTable ST,KeyType key,int &cnt);//二分查找
status Bubble(SSTable &ST);                       //冒泡排序
status QuickSort(SSTable &ST,int left,int right); //快速排序
void TraverseSST(SSTable ST);                     //遍历顺序表

//排序二叉树相关函数声明
typedef struct BSTNode
{
    ElemType data;
    struct BSTNode *lchild,*rchild;
}BSTNode,*BSTree;

void CreateBST(BSTree &T);                        //二叉排序树的创建
void InsertBST(BSTree &T,ElemType e);             //二叉排序树的插入
BSTree SearchBST(BSTree T,KeyType key,int &cnt);  //二叉排序树的递归查找
status TraverseBST(BSTree T);                     //二叉排序树的遍历

//相关菜单的函数声明
void Menu();                                    //大菜单
void Menu_SL();                                 //顺序表的菜单
void Menu_BST();                                //二叉排序树的菜单

#endif
//
//Created by somewon on 2022/12/6.
//

四、运行截图及功能函数部分展示

        1、顺序表

       (1)顺序表的创建

status CreateSST(SSTable &ST,int numb)
{
    ST.R = (ElemType *)malloc(sizeof(ElemType)*(numb+1));
    if(!ST.R) return ERROR;                     //空间分配失败
    ST.length = numb;
    cout << "---请输入" << numb << "个元素:" << endl;
    for(int i = 1;i < numb+1;i ++) cin >> ST.R[i].key;
    fflush(stdin);                        //清除缓存
    return OK;                                 //创建成功
}//创建顺序表

         (2)顺序查找法

status Search_Seq(SSTable ST,KeyType key,int &cnt)
{
    ST.R[0].key = key;                             //监视哨
    int i;
    for(i = ST.length;i > 0;i --)                  //末尾开始查找
    {
        if(ST.R[i].key != key)
        {
            cnt ++;
            cout << "经过的元素:" << ST.R[i].key << endl;
        }
        if(ST.R[i].key == key) break;
    }
    cnt ++;
    return i;                                    //返回-1则不存在于顺序表中
}//顺序查找

 

        (3)冒泡排序

status Bubble(SSTable &ST)
{
    int length = ST.length;
    if(length < 1) return OVERFLOW;                 //表为空
    for(int i = length-1;i > 0;i --)                //循环次数
    {
        for(int j = 1;j < i+1;j ++)
        {
            if(ST.R[j].key > ST.R[j+1].key)         //后一个值比前一个值小就交换
            {
                KeyType temp = ST.R[j].key;
                ST.R[j].key = ST.R[j+1].key;
                ST.R[j+1].key = temp;
            }
        }
    }
    return OK;
}//冒泡排序

         (4)折半查找法

status Search_Bin(SSTable ST,KeyType key,int &cnt)
{
    int low = 1;
    int high = ST.length;
    int mid;
    if(high < 1) return OVERFLOW;                    //表空
    while(low <= high)
    {
        mid = (low+high)/2;
        cout << "经过元素:" << ST.R[mid].key << endl;
        cnt ++;
        if(key == ST.R[mid].key) return mid;        //找到待查元素
        else if(key < ST.R[mid].key) high = mid-1;  //在前一子表进行查找
        else low = mid+1;                           //在后一子表进行查找
    }
    return ERROR;                                   //key不存在于顺序表
}//二分查找

        2、二叉排序树

        (1)二叉排序树的建立

void CreateBST(BSTree &T)
{
    T = NULL;          //初始化为空树
    ElemType e;
    int numb[1000],i;
    cout << "---请输入一组二叉排序树的整型元素(以-1作为结束标志):" << endl;
    for(i = 0;numb[i] != -1;i ++)
    {
        cin >> numb[i];
        if(numb[i] == -1) break;
        e.key = numb[i];
        InsertBST(T,e);
    }
}//二叉排序树的创建

         (2)二叉排序树的插入

void InsertBST(BSTree &T,ElemType e)
{
    if(!T)
    {
        BSTNode *s = (BSTNode *)malloc(sizeof(BSTNode));
        s->data.key = e.key;
        s->lchild = s->rchild = NULL;
        T = s;
    }
    else if(e.key < T->data.key) InsertBST(T->lchild,e);    //插入左子树
    else if(e.key > T->data.key) InsertBST(T->rchild,e);    //插入右子树
}//二叉排序树的插入

 

         (3)二叉排序树的查找

BSTree SearchBST(BSTree T,KeyType key,int &cnt)
{
    cnt ++;
    if((T == NULL) || (T->lchild==NULL&&T->rchild==NULL&&T->data.key!=key) || key==T->data.key)
    {
        return T;//查找结束
    }
    else if(key < T->data.key)
    {
        cout << "经过元素:" << T->data.key << endl;
        return SearchBST(T->lchild,key,cnt); //在左子树中继续查找
    }
    else
    {
        cout << "经过元素:" << T->data.key << endl;
        return SearchBST(T->rchild,key,cnt); //在右子树中继续查找
    }
}//二叉排序树的递归查找

         

五、运行环境

        CLion、Dev(注:Dev中运行可能需要加上一些头文件,如:#include <stdlib.h>)

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会尽力回答您的问题。 首先,二叉排序树是一种特殊的二叉树,它满足以下条件: 1. 左子树上所有节点的关键字均小于根节点的关键字。 2. 右子树上所有节点的关键字均大于根节点的关键字。 3. 左右子树也分别为二叉排序树。 其实,二叉排序树建立和二叉树的建立似,只是在插入节点时需要按照特定的规则进行排序。 以下是基于顺序表存储结构实现建立二叉排序树的代码: ```c #include <stdio.h> #include <stdlib.h> typedef struct { int key; int value; } Node; typedef struct { Node *data; int size; } SeqList; typedef struct TreeNode { Node data; struct TreeNode *left; struct TreeNode *right; } TreeNode; void insert(TreeNode **root, Node data); void delete(TreeNode **root, int key); void inorderTraversal(TreeNode *root); float avgSearchLength(TreeNode *root, int level); SeqList *createSeqList(int size) { SeqList *list = (SeqList *)malloc(sizeof(SeqList)); list->data = (Node *)malloc(sizeof(Node) * size); list->size = size; return list; } void freeSeqList(SeqList *list) { free(list->data); free(list); } TreeNode *createTreeNode(Node data) { TreeNode *node = (TreeNode *)malloc(sizeof(TreeNode)); node->data = data; node->left = NULL; node->right = NULL; return node; } void freeTreeNode(TreeNode *node) { if (node != NULL) { freeTreeNode(node->left); freeTreeNode(node->right); free(node); } } int main() { int n, key, value; printf("请输入节点个数:"); scanf("%d", &n); SeqList *list = createSeqList(n); printf("请依次输入 %d 个节点的 key 和 value:", n); for (int i = 0; i < n; i++) { scanf("%d %d", &key, &value); list->data[i].key = key; list->data[i].value = value; } TreeNode *root = NULL; for (int i = 0; i < n; i++) { insert(&root, list->data[i]); } printf("中序遍历结果为:"); inorderTraversal(root); printf("\n"); printf("请输入要删除的节点 key:"); scanf("%d", &key); delete(&root, key); printf("中序遍历结果为:"); inorderTraversal(root); printf("\n"); printf("查找成功的平均长度为:%.2f\n", avgSearchLength(root, 1)); freeSeqList(list); freeTreeNode(root); return 0; } void insert(TreeNode **root, Node data) { if (*root == NULL) { *root = createTreeNode(data); return; } if (data.key < (*root)->data.key) { insert(&((*root)->left), data); } else { insert(&((*root)->right), data); } } void delete(TreeNode **root, int key) { if (*root == NULL) { return; } if ((*root)->data.key == key) { if ((*root)->left == NULL) { TreeNode *node = *root; *root = (*root)->right; free(node); } else if ((*root)->right == NULL) { TreeNode *node = *root; *root = (*root)->left; free(node); } else { TreeNode **p = &((*root)->left); while ((*p)->right != NULL) { p = &((*p)->right); } (*root)->data = (*p)->data; delete(p, (*p)->data.key); } } else if ((*root)->data.key > key) { delete(&((*root)->left), key); } else { delete(&((*root)->right), key); } } void inorderTraversal(TreeNode *root) { if (root != NULL) { inorderTraversal(root->left); printf("(%d,%d) ", root->data.key, root->data.value); inorderTraversal(root->right); } } float avgSearchLength(TreeNode *root, int level) { if (root == NULL) { return 0; } float left = avgSearchLength(root->left, level + 1); float right = avgSearchLength(root->right, level + 1); return (level + left + right); } ``` 在上面的代码中,我们用 `SeqList` 结构体表示顺序表,每个顺序表元素包含一个 `key` 和一个 `value`。用 `Node` 结构体表示二叉排序树中的节点,每个节点也包含一个 `key` 和一个 `value`。用 `TreeNode` 结构体表示二叉排序树中的节点,每个节点包含一个 `Node` 型的数据和指向左右子节点的指针。在 `main` 函数中,我们通过读入 `key` 和 `value` 构建了一个顺序表,然后依次将其中的元素插入到二叉排序树中。然后输出中序遍历结果,接着读入一个 `key` 并删除对应的节点,再输出中序遍历结果。最后计算查找成功的平均长度并输出。 希望这样的回答可以帮助您解决问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值