赞
踩
目录
- #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.
- //

- #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.
- //

- #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.
- //

- 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 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 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不存在于顺序表
- }//二分查找

- 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); //在右子树中继续查找
- }
- }//二叉排序树的递归查找

CLion、Dev(注:Dev中运行可能需要加上一些头文件,如:#include <stdlib.h>)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。