文章目录
实验性质:综合性实验
要求:
(1)采用邻接矩阵/邻接表建立图;
(2)采用深度优先/广度优先搜索方式遍历图;
(3)编程实现Dijkstra最短路径算法。
目的:
(1)掌握图的邻接矩阵和邻接表存储方式;
(2)掌握图的遍历算法;
(3)掌握图的实际应用——最短路径算法。
代码
#include <iostream>
using namespace std;
//**折半查找**//
typedef struct {
int key;//查找表中每个数据元素的值
}ElemType;
typedef struct{
ElemType *elem;//存放查找表中数据元素的数组
int length;//记录查找表中数据的总数量
}SSTable;
//**二叉排序树**//
int m=-1; //二叉排序树初始化计数
int n=0; //二叉排序树关键字序列下标和查找次数计数
typedef struct {
string key;//查找表中每个数据元素的值
int position;//结点在关键字序列中的位置
}ElemType2;
typedef struct BSTNode
{
ElemType2 data;
struct BSTNode *lchild,*rchild; //左右孩子指针
}BSTNode,*BSTree;
//**排序**//
#define MAXSIZE 100
typedef struct {
int key; //关键字项
}RedType; //记录类型
typedef struct {
RedType r[MAXSIZE+1]; //r[0]闲置
int length; //顺序表长度
}SqList; //顺序表类型
void CreateList(SSTable &ST); //创建有序线性表
void Search_Bin(SSTable ST,int key); //折半查找
void CreateTree(BSTree &T); //创建二叉链表
void InOrderTraverse(BSTree T); //中序遍历
BSTree SearchBST(BSTree T, string key);//二叉树的递归查找
void InitList(SqList &L);//初始化及赋初始值
void OutputKey(SqList &L); //输出当前顺序表数值
void InsertSort(SqList &L);//直接插入排序
void BInsertSort(SqList &L); //折半插入排序
void Menu(); //文字菜单提示信息
int main()
{
SSTable ST;
BSTree T;
SqList L;
Menu();
int i; //输入的数字
int key;string key2; //输入的待查元素
cout<<"请输入操作代码:";
cin>>i;
while(true)
{
switch(i)
{
case 1:
CreateList(ST);
break;
case 2:
cout<<"请输入待查元素:";
cin>>key;
Search_Bin(ST,key);
break;
case 3:
CreateTree(T);
cout<<"二叉排序树创建成功"<<endl;
cout<<"其中序遍历结果为:";
n=0; //置二叉排序树关键字序列下标从0开始
InOrderTraverse(T);
cout<<endl;
break;
case 4:
cout<<"请输入待查元素:";
cin>>key2;
n=0; //置查找次数为0
cout<<"待查元素为第"<<SearchBST(T,key2)->data.position+1<<"个元素,";
cout<<"共查找了"<<n<<"次"<<endl;
break;
case 5:
cout<<"顺序表初始化成功,";
InitList(L);
break;
case 6:
InsertSort(L);
break;
case 7:
BInsertSort(L);
break;
default:
if(i<0)
return 0;
else
{
cout<<"输入的位置非法,请重新输入";
break;
}
}
cout<<"请输入操作代码:";
cin>>i;
}
return 0;
}
//**折半查找**//
void CreateList(SSTable &ST)
{
ST.elem=new ElemType[MAXSIZE];
if(!ST.elem) cout<<"存储分配失败"<<endl;
ST.length=11;
int a[11]={
5,16,20,27,30,36,44,55,60,67,71};
cout<<"有序线性表创建成功,其数值为:";
for (int i=1; i<=ST.length; i++) //从下标1开始存储
{
ST.elem[i].key=a[i-1]; //设置初始顺序表数值
cout<<ST.elem[i].key<<" ";
}
cout<<endl;
}
void Search_Bin(SSTable ST,int key)
{
int low=1;int high=ST.length;int mid;
int times=0;bool isHave=false;
while(low<=high)
{
mid=(low+high)/2;
times++; //查找次数
if(key==ST.elem[mid].key)
{
cout<<"待查元素为第"<<mid<<"个元素,共查找了"<<times<<"次"<<endl;
isHave=true;
break;
}
else if(key<ST.elem[mid].key) high=mid-1; //在前面找
else low=mid+1; //在后面找
}
if(!isHave)
cout<<"待查元素不在有序表中,共查找了"<<times<<"次"<<endl;
}
//**二叉排序树**//
void CreateTree(BSTree &T)
{
string ch[13]={
"45","24","12","#","#","37","#","#","53","#","93","#","#"};
m+=1;
if(ch[m]=="#")
T=NULL;
else
{
T=new BSTNode;
T->data.key=ch[m];
CreateTree(T->lchild); //递归创建左子树
CreateTree(T->rchild); //递归创建右子树
}
}
void InOrderTraverse(BSTree T) //中序遍历
{
if(T)
{
InOrderTraverse(T->lchild); //中序遍历左子树
cout<<T->data.key<<" "; //访问根节点
T->data.position=n;
n++;
InOrderTraverse(T->rchild);
}
}
BSTree SearchBST(BSTree T, string key)//二叉树的递归查找
{
n++;
if((!T) || key==T->data.key) return T;
else if (key<T->data.key)
return SearchBST(T->lchild,key); //在左子树中继续查找
else
return SearchBST(T->rchild,key); //在右子树中继续查找
}
//**排序**//
void InitList(SqList &L)//初始化且赋初始值
{
int a[8]={
49,38,65,97,76,13,27,49};
L.length=0;
for(int i=1;i<=8;i++)
{
L.r[i].key=a[i-1];
L.length++;
}
OutputKey(L);
}
void OutputKey(SqList &L) //输出当前顺序表数值
{
cout<<"当前顺序表值为:";
for(int i=1;i<=8;i++)
{
cout<<L.r[i].key<<" ";
}
cout<<endl;
}
void InsertSort(SqList &L)//直接插入排序
{
for(int i=2;i<=L.length;++i)
{
if( L.r[i].key<L.r[i-1].key)//将L.r[i]插入有序子表
{
L.r[0]=L.r[i]; // 复制为哨兵
L.r[i]=L.r[i-1];
int j;
for(j=i-2; L.r[0].key<L.r[j].key;--j)
L.r[j+1]=L.r[j]; // 记录后移
L.r[j+1]=L.r[0]; //插入到正确位置
}
}
cout<<"直接插入排序成功,";
OutputKey(L);
}
void BInsertSort(SqList &L ) //折半插入排序
{
for (int i = 2;i<=L.length; ++i )
{
L.r[0] = L.r[i];
int low = 1 ; int high = i-1 ;
while (low <=high)
{
m=( low + high )/2 ;
if(L.r[0].key < L.r[m]. key)
high = m -1 ;
else
low = m + 1;
}
for (int j=i-1; j>=high+1; --j)
L.r[j+1] = L.r[j];
L.r[high+1] = L.r[0];
}
cout<<"折半插入排序成功,";
OutputKey(L);
}
void Menu()
{
cout << "---------------------------" << endl;
cout << "********by 夏日********" << endl;
cout << "---------------------------" << endl;
cout << "1-----创建有序线性表(折半查找前提)"<< endl;
cout << "2-----折半查找" << endl;
cout << "3-----创建二叉排序树 "<< endl;
cout << "4-----二叉排序树查找" << endl;
cout << "5-----顺序表初始化及赋初始值" << endl;
cout << "6-----直接插入排序" << endl;
cout << "7-----折半插入排序" << endl;
cout << " 退出,输入一个负数!" << endl;
}
输出示例
1.创建有序线性表
2.折半查找
3.创建二叉排序树
4.二叉排序树查找
5.顺序表初始化
6.直接插入排序
7.折半插入排序
数据结构核心原理与算法应用
150讲轻松搞定Python网络爬虫