数据结构实验四五六

合集下载

数据结构实验四报告

数据结构实验四报告

实验日期:_______________ 实验指导老师:
实验4 无向图的深度优先搜索
一、实验目的和实验环境
【实验目的】
1、了解图的定义、特点,区分无向图和有向图的概念;
2、了解图的数据结构和搜索方法;
3、掌握无向图的邻接矩阵、邻接表的表示方法;
4、写出无向图的深度优先搜索程序。

【实验环境】VC++6.0
二、理论依据
邻接多重表是无向图的一种很有效链式存储结构,在邻接表中容易求得顶点和边的各种信息。

除了在边结点中增加一个标志域外,邻接多重表所需的存储量和邻接表相同。

三、实验内容
设无向图G有n个点e条边,写一算法建立G的邻接多表,并按照深度优先搜索输出顶点,要求该算法时间复杂性为O(n+e),且除邻接多表本身所占空间之外只用O(1)辅助空间。

四、实验步骤
1、了解图的定义、特点,区分无向图和有向图的概念;
2、了解图的数据结构和搜索方法;
3、掌握无向图的邻接矩阵、邻接表的表示方法;
4、写出无向图的深度优先搜索程序
五、实验结果
1.源代码如下:
实验日期:_______________ 实验指导老师:
2.运行界面截图如下:
六、小结
1、在创建邻接多重表时,由于邻接多重表的数据类型为字符型,键盘输入总是很难控制。

这时可以通过人为设置函数过滤去键盘输入中的空格。

2、在邻接多重表上,各种基本操作的实现和邻接表相似。

3、在邻接多重表中,所有依附于同一顶点的边串联在同一链表中。

数据结构 实验

数据结构 实验

数据结构实验数据结构实验1. 实验目的通过本次实验,掌握数据结构的基本概念,了解常见的数据结构和其应用。

2. 实验内容本次实验主要包括以下内容:1. 数组:了解数组的概念、特点和基本操作;掌握数组的存储方式和访问方法;基于数组实现常见数据结构(如栈、队列)。

2. 链表:理解链表的概念及其不同类型(如单向链表、双向链表);学习链表的插入、删除和查找操作;比较链表和数组的优缺点。

3. 树:了解树的基本概念及其特点;学习树的存储方式和遍历方法;掌握二叉树的特点和基本操作(如插入、删除、查找)。

4. 图:理解图的基本概念和相关术语;学习图的存储方式和遍历方法;掌握图的常见算法(如深度优先搜索、广度优先搜索)。

3. 实验步骤根据实验内容,按以下步骤进行实验:3.1 数组1. 了解数组的概念和特点,例如数组是一种线性表数据结构,用于存储连续的元素。

2. 学习数组的基本操作,如创建数组、访问数组元素、修改数组元素的值。

3. 理解数组的存储方式,例如元素在内存中是连续存储的。

4. 实现栈和队列的基本功能,并使用数组作为底层数据结构。

3.2 链表1. 理解链表的概念及其不同类型,如单向链表和双向链表。

2. 学习链表的插入、删除和查找操作,例如在链表中插入一个节点、删除一个节点、查找指定值的节点。

3. 比较链表和数组的优缺点,例如链表的插入和删除操作效率更高,但访问元素的效率较低。

4. 实现链表的基本功能,如创建链表、插入节点、删除节点、查找节点。

3.3 树1. 了解树的基本概念和特点,如树由节点和边组成,每个节点最多有一个父节点和多个子节点。

2. 学习树的存储方式,如链式存储和数组存储。

3. 掌握二叉树的特点和基本操作,如二叉树是每个节点最多有两个子节点的树结构。

4. 实现二叉树的基本功能,如插入节点、删除节点、查找节点。

3.4 图1. 理解图的基本概念和相关术语,如图由顶点和边组成。

2. 学习图的存储方式,如邻接矩阵和邻接表。

数据结构实验报告实验5

数据结构实验报告实验5

数据结构实验报告实验5一、实验目的本次实验的主要目的是深入理解和掌握常见的数据结构,如链表、栈、队列、树和图等,并通过实际编程实现,提高对数据结构的操作和应用能力。

同时,培养解决实际问题的思维和编程能力,提高代码的可读性、可维护性和效率。

二、实验环境本次实验使用的编程语言为C++,开发环境为Visual Studio 2019。

三、实验内容1、链表的基本操作创建链表插入节点删除节点遍历链表2、栈的实现与应用用数组实现栈用链表实现栈栈的应用:括号匹配3、队列的实现与应用用数组实现队列用链表实现队列队列的应用:排队模拟4、二叉树的遍历前序遍历中序遍历后序遍历5、图的表示与遍历邻接矩阵表示法邻接表表示法深度优先遍历广度优先遍历四、实验步骤1、链表的基本操作创建链表:首先定义一个链表节点结构体,包含数据域和指向下一个节点的指针域。

然后通过动态内存分配创建链表节点,并将节点逐个连接起来,形成链表。

插入节点:根据插入位置的不同,分为在表头插入、在表尾插入和在指定位置插入。

在指定位置插入时,需要先找到插入位置的前一个节点,然后进行节点的连接操作。

删除节点:同样需要根据删除位置的不同进行处理。

删除表头节点时,直接将头指针指向下一个节点;删除表尾节点时,找到倒数第二个节点,将其指针置为空;删除指定位置节点时,找到要删除节点的前一个节点,然后调整指针。

遍历链表:通过从链表头开始,依次访问每个节点,输出节点的数据。

2、栈的实现与应用用数组实现栈:定义一个固定大小的数组作为栈的存储空间,同时用一个变量记录栈顶位置。

入栈操作时,先判断栈是否已满,如果未满则将元素放入栈顶位置,并更新栈顶位置;出栈操作时,先判断栈是否为空,如果不空则取出栈顶元素,并更新栈顶位置。

用链表实现栈:与链表的操作类似,将新元素添加在链表头部作为栈顶。

括号匹配:输入一个包含括号的字符串,使用栈来判断括号是否匹配。

遇到左括号入栈,遇到右括号时与栈顶的左括号进行匹配,如果匹配成功则出栈,否则括号不匹配。

数据结构实报告实验四

数据结构实报告实验四

数据结构实验报告专业:信科10-4姓名:纵兆丹学号:08103575一、实验目的1 熟练掌握顺序搜索、折半搜索和索引搜索等基本搜索算法,熟悉这些算法适合在何种存储结构下实现;2 熟练掌握二叉排序树的特性、建立方法以及动态搜索算法;3 熟练掌握散列表的特点及构造方法。

二、实验内容基本题1、实现基于有序顺序表的折半搜索。

2、设单链表的结点是按关键字的值从小到大排列的,试写出对此表的搜索程序并调试。

三、实验过程和方法1、程序代码基础题1#include <iostream.h>#include <conio.h>int Search_Bin(int *a,int key,int n){//在有序表a中折半查找其关键字等于key的数据数据元素,若找到,则函数值为//该元素在表中的位置,否则为0int low=1;int high=n;int mid;while(low<=high){mid = (low+high)/2;if(key==a[mid])return mid;else if(key<a[mid])high=mid-1;elselow=mid+1;}return 0;}//Search_Binvoid main(){int a[11];int x;for(int i=1;i<=10;i++){a[i]=i;}cout<<"请输入您想查找的元素值(请在1—10中选择):"<<endl;cin>>x;cout<<"您输入的元素的位置为:"<<endl;cout<<Search_Bin(a,x,10)<<endl;getch();}基础题2#include <iostream>#include <conio.h>#include <list>using namespace std;void disp(list<int> List){list<int>::iterator a;for(a=List.begin(); a != List.end(); a++)cout<<*a<<" ";cout<<endl;}//dispint Search(list<int> List,int key){list<int>::iterator b;int i=1;for(b=List.begin(); b!= List.end(); b++){if(key==*b){return i;}i++;}return 0;}//Searchvoid main(){list<int> L;int m[100];int i=0;cout<<"请输入您要建立的链表的各个节点的关键字,以0为结束!"<<endl; do{cin>>m[i++];}while(m[i-1]!=0);for(int j=0;j<i-1;j++){L.push_back(m[j]);cout<<"插入成功!"<<endl;}L.sort();cout<<"单链表节点顺序为:"<<endl;disp(L);int n,x;do{cout<<"1,查找;2,退出。

数据结构实验报告五,查找与排序-

数据结构实验报告五,查找与排序-

数据结构实验报告五,查找与排序-查找与排序一、实验目的:1.理解掌握查找与排序在计算机中的各种实现方法。

2.学会针对所给问题选用最适合的算法。

3.熟练掌握常用排序算法在顺序表上的实现。

二、实验要求:掌握利用常用的查找排序算法的思想来解决一般问题的方法和技巧,进行算法分析并写出实习报告。

三、实验内容及分析:设计一个学生信息管理系统,学生对象至少要包含:学号、性别、成绩1、成绩总成绩等信息。

要求实现以下功能:1.平均成绩要求自动计算;2.查找:分别给定学生学号、性别,能够查找到学生的基本信息(要求至少用两种查找算法实现);3.? 排序:分别按学生的学号、成绩1、成绩2、平均成绩进行排序(要求至少用两种排序算法实现)。

四、程序的调试及运行结果五、程序代码#includestdio.h#includestring.hstruct student//定义结构体{char name;int a1,a2,a3,num;double pow;}zl;int count=0;void jiemian1(); //主界面//函数声明int jiemian2(); //选择界面void luru(); //录入函数void xianshi(); //显示void paixv(); //排序void diaoyong(int); //循环调用选择界面void tianjia(); //添加信息void chaxun1(); //按学号查询详细信息void chaxun2(); //按姓名查询详细信息void xiugai(); //修改信息void shanchu(); //删除信息void main() //main函数{jiemian1();//函数点用}void jiemian1() //主界面定义{char a;printf(“\n\n\n\n\t\t\t学员信息管理器\n\n\n\t\t\t 数据结构课程设计练习六\n\n\n\t\t\t 09信计2:于学彬\n\n“);printf("\n\t\t\t 按回车键继续:");scanf("%c",system("cls");jiemian2();}int jiemian2() //选择界面{int a,b;printf("*******************************主要功能********************************");printf("\n\n\n\n\t\t\t\t1.录入信息\n\n\t\t\t\t2.添加信息\n\n\t\t\t\t3.查看信息\n\n\t\t\t\t4.查询信息\n\n\t\t\t\t5.修改信息\n\n\t\t\t\t6.删除信息\n\n\t\t\t\t7.退出\n\n\t\t\t\t请选择:");scanf("%d",switch(a){case 1:system("cls");luru();break;case 2:system("cls");tianjia();break;case 3:system("cls");paixv();break;case 4:system("cls");printf("1.按学号查询详细信息\n2.按姓名查询详细信息\n请选择:");scanf("%d",switch(b){case 1:system("cls");chaxun1();break;case 2:system("cls");chaxun2();break;} break;case 5:system("cls");xiugai();break;case 6:system("cls");shanchu();break;case 7:system("cls");return a;break;}}void diaoyong(int b) //循环调用选择界面{char a='y';printf("是否返回选择页(y/n):");fflush(stdin);//清空输入缓冲区,通常是为了确保不影响后面的数据读取(例如在读完一个字符串后紧接着又要读取一个字符,此时应该先执行fflush(stdin);)a=getchar();system("cls");while(a=='y'||a=='Y'){b=jiemian2();if(b==7){break;}}}void luru() //录入函数{char a;//='y';do{printf("请输入学员信息:\n");printf("学号:");scanf("%d",zl[count].num);//调用结构体printf("姓名:");fflush(stdin);gets(zl[count].name);printf("三门成绩:\n");printf("成绩1:");scanf("%d",zl[count].a1);printf("成绩2:");scanf("%d",zl[count].a2);printf("成绩3:");scanf("%d",zl[count].a3);zl[count].pow=(zl[count].a1+zl[count].a2+zl[count].a3)/3;//求平均数printf("是否继续(y/n):");fflush(stdin);a=getchar();count++;system("cls");}while(a=='y'count100);//paixv();diaoyong(count);}void tianjia() //添加信息{char a='y';do{printf("请输入学员信息:\n");printf("学号:");scanf("%d",zl[count].num);printf("姓名:");//fflush(stdin);gets(zl[count].name);printf("三门成绩:\n");printf("成绩1:");scanf("%d",zl[count].a1);printf("成绩2:");scanf("%d",zl[count].a2);printf("成绩3:");scanf("%d",zl[count].a3);zl[count].pow=(zl[count].a1+zl[count].a2+zl[count].a3)/3; printf("是否继续(y/n):");//fflush(stdin);a=getchar();count++;system("cls");}while(a=='y'count100);paixv(count);diaoyong(count);}void xianshi() //显示{int i;printf("学号\t \t姓名\t\t\t平均成绩\n");for(i=0;icount;i++){printf("%d\t \t%s\t\t\t%f\n",zl[i].num,zl[i].name,zl[i].pow); }}void paixv() //排序{int i,j;struct student zl1;printf("排序前:\n");xianshi();for(i=0;icount;i++){for(j=1;jcount-i;j++){if(zl[j-1].powzl[j].pow){zl1=zl[j-1];zl[j-1]=zl[j];zl[j]=zl1;}}}printf("排序后:\n");xianshi();diaoyong(count);}void chaxun1() //按学号查询详细信息{int i,num;printf("请输入要查询学员的学号:");scanf("%d",num);printf("学号\t姓名\t成绩1\t成绩2\t成绩3\t平均成绩\n"); for(i=0;icount;i++){if(zl[i].num==num){printf("%d\t%s\t%d\t%d\t%d\t%.2f\n",zl[i].num,zl[i].name,zl[i].a1,zl[i].a2,zl [i].a3,zl[i].pow);}}diaoyong(count);}void chaxun2() //按姓名查询详细信息{int i;struct student zl1;printf("请输入要查询学员的姓名:");fflush(stdin);gets();printf("学号\t姓名\t成绩1\t成绩2\t成绩3\t平均成绩\n");for(i=0;icount;i++){if((strcmp(zl[i].name,))==0)//比较两个字符串的大小{printf("%d\t%s\t%d\t%d\t%d\t%.2f\n",zl[i].num,zl[i].name,zl[i].a1,zl[i].a2,zl [i].a3,zl[i].pow);}}diaoyong(count);}void xiugai() //修改信息{int i,num;printf("请输入要查询学员的学号:");scanf("%d",num);printf("学号\t姓名\t成绩1\t成绩2\t成绩3\t平均成绩\n");for(i=0;icount;i++){if(zl[i].num==num){break;}}printf("%d\t%s\t%d\t%d\t%d\t%.2f\n",zl[i].num,zl[i].name,zl[i].a1,zl[i].a2,zl [i].a3,zl[i].pow);printf("请输入学员信息:\n");printf("学号:");scanf("%d",zl[i].num);printf("姓名:");fflush(stdin);gets(zl[i].name);printf("三门成绩:\n");printf("成绩1:");scanf("%d",zl[i].a1);printf("成绩2:");scanf("%d",zl[i].a2);printf("成绩3:");scanf("%d",zl[i].a3);zl[i].pow=(zl[i].a1+zl[i].a2+zl[i].a3)/3;printf("学号\t姓名\t成绩1\t成绩2\t成绩3\t平均成绩\n"); printf("%d\t%s\t%d\t%d\t%d\t%.2f\n",zl[i].num,zl[i].name,zl[i].a1,zl[i].a2,zl[i].a3,zl[i].pow);diaoyong(count);}void shanchu() //删除信息{int num,i,j;printf("请输入要删除的学员学号:");scanf("%d",num);for(i=0;icount;i++){if(zl[i].num==num){for(j=i;jcount;j++){zl[j]=zl[j+1];}}}count--;xianshi();diaoyong(count);}。

北邮数据结构实验报告实验四

北邮数据结构实验报告实验四

2009级数据结构实验报告实验名称:实验四——排序学生姓名:班级:班内序号:学号:日期:2010/12/171.实验要求实验目的:通过选择下面两个题目之一,学习、实现、对比各种排序算法,掌握各种排序算法的优劣,以及各种算法使用的情况。

实验内容:使用简单数组实现下面各种排序算法,并进行比较。

排序算法:1、插入排序2、希尔排序3、冒泡排序4、快速排序5、简单选择排序6、堆排序7、归并排序8、基数排序(选作)9、其他要求:1、测试数据分成三类:正序、逆序、随机数据2、对于这三类数据,比较上述排序算法中关键字的比较次数和移动次数(其中关键字交换计为3次移动)。

3、对于这三类数据,比较上述排序算法中不同算法的执行时间,精确到微秒(选作)4、对2和3的结果进行分析,验证上述各种算法的时间复杂度编写测试main()函数测试线性表的正确性。

2. 程序分析2.1 存储结构使用最简单的一维数组存储待排序的数据。

共使用两个数组,一个用来存储原始数据,一个用来存储待排序数据。

每次排序完毕,用原始数据更新一次待排序数据,保证每一次都对同一组数据排序。

(图略)2.2 关键算法分析1.直接插入的改进:在一般的直接插入中,关键码每移动一次就需要比较一次。

在移动的方面,优化是比较困难的,因为对静态线性表的插入必然要带来大量的移动。

但是,我们可以在比较上进行一些优化。

在查找技术一张曾学过的“折半查找法”,在这里就可以照葫芦画瓢地运用。

一趟排序的伪代码如下:1.如果该元素大于处于其左侧相邻的元素则跳过该元素;2.low=0,high=i;3.循环直至low==high3.1 mid=(low+high)/2;3.2如果当前元素大于中值high=mid;3.3否则low=mid+1;4.当前元素赋值给临时变量;5.将有序区中处于low位置及其右侧的元素右移;6.临时变量置于low位置简单说一下这里的折半查找与一般查找算法的区别。

这里的查找,尤其是对无重复数据和大量数据的处理中,更多的时候是找不到完全相等的项的。

数据结构-实验4

数据结构-实验4

《数据结构》实验报告年级_2012级__ 学号_ 姓名 __ 成绩______专业_计算机科学与技术实验地点___指导教师__实验项目实验四串实验性质设计性实验日期:一、实验目的:1、掌握串的定义及其基本操作的实现。

2、掌握链表及其基本操作的实现。

3、通过上机实践进一步加深对串的顺序存储方式及链式存储方式的理解。

4、通过上机实践加强利用数据结构解决实际应用应用问题的能力。

二、实验内容与要求:1、实验题目一:顺序串的定义及其操作算法的实现要求:编程实现串的类型定义及串的初始化操作、插入操作、删除操作、取元素操作、输出操作等,并对其进行验证。

2、实验题目二:文本加密和解密要求:掌握每一种串操作的一般函数的实现及其应用。

三、实验问题描述一个文本串可用事先给定的字母映射表进行加密。

例如,设字母映射表为:abcdefghijklmnopqrstuvwxyzngzqtcobmuhelkpdawxfyivrsj则字符串“encrypt”被加密为“tkzwsdf”。

设计一个程序将输入的文本串进行加密后输出,然后进行解密输出。

四、实验步骤1.实验问题分析这里用到了c语言里的while 语句、for语句、if语句以及指针2.功能(函数)设计void Encrypt(char *pszSrc, char *pszEncrypt){char *p1;char *p2;int i=0;int j=0;p1=(char *)CharArray1;p2=(char *)CharArray2;cout<<"请输入要加密的字符串\n";fflush(stdin);cin.getline(pszSrc, 100);}五、实验结果(程序)及分析#include<iostream>using namespace std;const char CharArray1[26]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};const char CharArray2[26]={'n','g','z','q','t','c','o','b','m','u','h','e','l','k','p','d','a','w','x','f','y','i','v','r','s','j'};void Encrypt(char*pszSrc,char*pszEncrypt){char*p1;char*p2;int i=0;int j=0;p1=(char*)CharArray1;p2=(char*)CharArray2;cout<<"请输入要加密的字符串\n";fflush(stdin);cin.getline(pszSrc,100);i=0;j=0;while(*(pszSrc+i)!='\0'){for(j=0;j<26;j++){if(*(pszSrc+i)==*(p1+j)){*(pszEncrypt+i)=*(p2+j);break;}else{;}}i++;}*(pszEncrypt+i)='\0';}void Decrypt(char*pszSrc,char*pszDecrypt) {char*p1;char*p2;int i=0;int j=0;p1=(char*)CharArray1;p2=(char*)CharArray2;cout<<"请输入一行已加密的字符串:\n"; fflush(stdin);cin.getline(pszSrc,100);i=0;j=0;while(*(pszSrc+i)!='\0'){for(j=0;j<26;j++){if(*(pszSrc+i)==*(p2+j)){*(pszDecrypt+i)=*(p1+j);break;}else{;}}i++;}*(pszDecrypt+i)='\0';}int main(){char*pszSrc;char*pszDest;int select;int i=0;int j=0;if((pszSrc=new char[100])==NULL){cout<<"申请内存空间失败,程序退出!\n";exit(1);}if((pszDest=new char[100])==NULL){cout<<"申请内存空间失败,程序退出!\n";exit(1);}while(1){cout<<"请选择加密或解密(1.加密2.解密0.退出):";cin>>select;if(1==select){Encrypt(pszSrc,pszDest);cout<<"加密后的字符串\n";i=0;while(*(pszDest+i)!='\0'){cout<<*(pszDest+i);i++;}cout<<endl;}else if(2==select){Decrypt(pszSrc,pszDest);cout<<"解密后的字符串\n";i=0;while(*(pszDest+i)!='\0'){cout<<*(pszDest+i);i++;}cout<<endl;}else if(0==select){break;}else{cout<<"你没有输入正确的选择,请重新选择:";}}delete[]pszSrc;delete[]pszDest;return0;}六、结论与分析在本次实验中掌握了串的各种操作,以及其实际作用,掌握串的定义及其基本操作的实现和掌握链表及其基本操作的实现。

数据结构实验6报告

数据结构实验6报告

数据结构实验报告第 6 次实验一、实验目的1.理解栈是操作受限(插入push, 删除pop)的线性表, 受限的是插入删除的位置。

2.在链式存储结构下实现:StackEmpty, Push,Pop, 几个基本操作。

3.通过调用基本操作实现括号匹配算法。

二、实验内容(问题)写一个算法, 识别依次读入的一个字符序列是否为形如‘序列1&序列2’模式的字符序列。

其中序列1和序列2中都不含字符‘&’, 且序列2是序列1的逆序列。

例如, ‘a+b&b+a’是属该模式的字符序列, 而’1+3&3-1’则不是。

测试数据: ’1+3&3-1’; ’a+b+c&c+b+a’; ’a+b+c&c+b’; ’b+c&c+b+a’;提示:利用栈 , 利用已实现的基本操作三、算法描述(给出自然语言描述的算法)1.向后依次扫描字符序列, 如果考察的字符不等于‘&’则入栈, 遇到‘&’则停止。

2.从‘&’后继续扫描, 考察字符的时候, 栈顶元素出栈, 若二者相等, 继续扫描;不等, 模式不成立。

3.扫描结束后, 栈空则模式成立四、详细设计(画流程图)五、程序代码#include<stdio.h>#include<stdlib.h>#define True 1#define False 0#define OK 1#define ERROR 0typedef int status;typedef char ElemType;typedef struct SNode{ElemType data;struct SNode *next;}SNode, *LinkStack;status InitStack(LinkStack &S);int StackEmpty(LinkStack S);status Push(LinkStack &S, ElemType e);status Pop(LinkStack &S, ElemType &e);status Is_Match(ElemType f[20]);main(){ElemType formula[20];int i;for(i=0;i<=3;i++){printf("\n请输入一个字符序列表达式: ");scanf("%s",formula);if(Is_Match(formula)==1) printf(" \n这个表达式符合‘序列1&序列2’模式!\n"); else printf("\n 这个表达式不符合‘序列1&序列2’模式!\n");}return(1);}status InitStack(LinkStack &S){S=NULL;return(OK);}int StackEmpty(LinkStack S){if(S==NULL) return(True);else return(False);}status Push(LinkStack &S, ElemType e){LinkStack p;p=(LinkStack)malloc(sizeof(SNode));if(!p) return(ERROR);p->data=e;p->next=S;S=p;return(OK);}status Pop(LinkStack &S, ElemType &e){LinkStack p;if(!S) return(ERROR);e=S->data;p=S;S=S->next;free(p);return(OK);}status Is_Match(ElemType f[20]){LinkStack St; ElemType *p,c;InitStack(St);p=f;for(;*p!='&';p++){ Push(St,*p);if(!Push(St, *p)) return(ERROR);}p++;for(;*p!='\0';p++){Pop(St,c);if(!Pop(St,c)) return(ERROR);else if(c!=*p) return(ERROR);}if(StackEmpty(St)) return(OK);else return(ERROR);}七、用户手册(教用户怎么用这个程序)用途: 判断字符串是否是“序列1&序列2’模式”用法:启动此程序, 屏幕会提示你输入数据, 输入数据并按下回车键即可。

《数据结构》实验报告查找

《数据结构》实验报告查找

实验四——查找一、实验目的1.掌握顺序表的查找方法,尤其是折半查找方法;2.掌握二叉排序树的查找算法。

二、实验内容1.建立一个顺序表,用顺序查找的方法对其实施查找;2.建立一个有序表,用折半查找的方法对其实施查找;3.建立一个二叉排序树,根据给定值对其实施查找;4.对同一组数据,试用三种方法查找某一相同数据,并尝试进行性能分析。

三、实验预习内容实验一包括的函数有:typedef struct ,创建函数void create(seqlist & L),输出函数void print(seqlist L),顺序查找int find(seqlist L,int number),折半查找int halffind(seqlist L,int number)主函数main().实验二包括的函数有:结构体typedef struct,插入函数void insert(bnode * & T,bnode * S),void insert1(bnode * & T),创建函数void create(bnode * & T),查找函数bnode * search(bnode * T,int number),主函数main().四、上机实验实验一:1.实验源程序。

#include<>#define N 80typedef struct{int number; umber;for(i=1;[i].number!=0;){cin>>[i].name>>[i].sex>>[i].age;++;cout<<endl;cin>>[++i].number;}}umber<<"\t"<<[i].name<<"\t"<<[i].sex<<"\t"<<[i].age<<endl;}umber==number)return i;}umber)return mid;elseif(number<[mid].number)high=mid-1;elselow=mid+1;}return 0;}void main(){int i,number;seqlist L;create(L);print(L);cout<<"折半查找:"<<endl;cout<<"输入学生学号:";cin>>number;if((i=halffind(L,number))!=0)cout<<"\t"<<[i].number<<"\t"<<[i].name<<"\t"<<[i].sex<<"\t"<<[i].age<<endl;elsecout<<"失败!"<<endl;cout<<"顺序查找:"<<endl;cout<<"输入学生学号:";cin>>number;if((i=find(L,number))!=0)cout<<"\t"<<[i].number<<"\t"<<[i].name<<"\t"<<[i].sex<<"\t"<<[i].age<<endl;elsecout<<"失败!"<<endl;}实验二:#include<>typedef struct{int number; 立二叉排序树"<<"\n\t2.插入学生信息"<<"\n\t3.查找学生信息"<<endl;cout<<"选择:";cin>>choice;switch(choice){case 1:{create(T);cout<<"成功建立!"<<endl;};break;case 2:{insert1(T);cout<<"插入成功!"<<endl;};break;case 3:{cout<<"输入待查学生的学号:";cin>>number;p=search(T,number);if(p)cout<<p-><<"\t"<<p-><<"\t"<<p-><<"\t"<<p-><<endl;elsecout<<"查找失败!"<<endl;};break;}cout<<"Continue(Y/N):";cin>>ctinue;if(ctinue=='y'||ctinue=='y')flag=1;elseflag=0;}}2.实验结果(截图)。

数据结构实验 实验四

数据结构实验 实验四

设计四查找和排序一、设计目的1.掌握顺序查找,二分法查找,分块查找的算法;2.掌握各种排序算法及其性能的比较。

二、设计内容1.任务描述任务1:编写一个程序输出在顺序表{13,22,35,43,54,68,71,82,98,1005}中采用顺序方法和折半方法查找某个关键字的过程。

任务2:编写一个程序实现直接插入排序过程,并输出{94,28,57,66,35,84,63,42,71,10}的排序过程。

任务3:编写一个程序实现快速排序算法,并输出{94,28,57,66,35,84,63,42,71,10}的排序过程。

2.问题的表示方案使用一个顺序表存储所有输入数据,一个整型变量存储数据长度3.主要数据类型与变量int data[MAXSIZE];int Count;4.算法或程序模块任务1:void Sequence(ostream &out, int key)功能:顺序查找void Half(ostream &out, int key)功能:折半查找任务2:void InsertSort(ostream &out)功能:直接插入排序任务3:int Partition(int low, int high)功能:把待排序数组分为两部分,使基准元素左边的元素都小于基准元素,右边的都大于基准元素。

void QuickSort(ostream &out, int left, int right)功能:快速排序三、测试1.方案任务1:测试方案:输入表中存在的元素,输入表中不存在的元素测试数据:顺序表{13,22,35,43,54,68,71,82,98,1005},key=68,key=32。

任务2、3:测试数据:数组{94,28,57,66,35,84,63,42,71,10}2.结果四、总结与讨论本设计还存在的问题有:1、使用int型的一维数组存储数据,未考虑数据不为整型等情况。

数据结构实习报告12345

数据结构实习报告12345

数据结构实习报告所在院系:班号:学号:专业:姓名:指导老师:二零一三年六月目录1 一元多项式计算 (2)1.1基本算法: (2)1.1.1输入输出 (2)1.1.2多项式的加法 (2)1.1.3多项式的减法 (3)1.2 程序: (4)1.3 运行结果: (8)2设计一个模拟计算器的程序 (8)2.1设计思路 (8)2.2 功能模块: (9)2.3 程序: (9)2.4 测试结果: (16)3 学生成绩查询系统 (16)3.1设计思路 (16)3.2系统流程图: (17)3.3 程序: (17)3.4测试结果: (20)4构造n个城市连接的最小生成树 (20)4.1设计思路 (21)4.2数据结构定义 (21)4.3系统功能模块 (22)4.4 运行结果: (22)5哈夫曼编码的应用 (23)5.1问题分析哈夫曼树的定义 (23)5.2 功能模块图 (24)5.3 程序: (24)5.4 测试结果: (30)6 实习总结: (30)1 一元多项式计算能够按照指数降序排列建立并输出多项式;能够完成两个多项式的相加、相减和相乘,并将结果输出。

1.1基本算法:1.1.1输入输出(1)功能:将要进行运算的多项式输入输出。

(2)数据流入:要输入的多项式的系数与指数。

(3)数据流出:合并同类项后的多项式。

(4)程序流程图:多项式输入流程图如图1所示。

(5)测试要点:输入的多项式是否正确,若输入错误则重新输入流程图:1.1.2多项式的加法(1)功能:将两多项式相加。

(2)数据流入:输入函数。

(3)数据流出:多项式相加后的结果。

(4)程序流程图:多项式的加法流程图如图2所示。

(5)测试要点:两多项式是否为空,为空则提示重新输入,否则,进行运算。

流程图:1.1.3多项式的减法(1)功能:将两多项式相减。

(2)数据流入:调用输入函数。

(3)数据流出:多项式相减后的结果。

(4)程序流程图:多项式的减法流程图如图3所示。

数据结构实验报告(实验)

数据结构实验报告(实验)

数据结构实验报告(实验)数据结构实验报告(实验)1. 实验目的1.1 理解数据结构的基本概念和操作1.2 学会使用数据结构解决实际问题1.3 掌握常用数据结构的实现和应用2. 实验环境2.1 操作系统:Windows 102.2 编程语言:C++2.3 开发工具:Visual Studio3. 实验内容3.1 实验一:线性表的实现和应用3.1.1 设计并实现线性表的基本操作函数3.1.2 实现线性表的插入、删除、查找等功能 3.1.3 实现线性表的排序算法3.1.4 应用线性表解决实际问题3.2 实验二:栈和队列的实现和应用3.2.1 设计并实现栈的基本操作函数3.2.2 设计并实现队列的基本操作函数3.2.3 实现栈和队列的应用场景3.2.4 比较栈和队列的优缺点3.3 实验三:树的实现和应用3.3.1 设计并实现二叉树的基本操作函数3.3.2 实现二叉树的创建、遍历和查找等功能3.3.3 实现树的遍历算法(前序、中序、后序遍历)3.3.4 应用树解决实际问题4. 数据结构实验结果4.1 实验一的结果4.1.1 线性表的基本操作函数实现情况4.1.2 线性表的插入、删除、查找功能测试结果4.1.3 线性表的排序算法测试结果4.1.4 线性表解决实际问题的应用效果4.2 实验二的结果4.2.1 栈的基本操作函数实现情况4.2.2 队列的基本操作函数实现情况4.2.3 栈和队列的应用场景测试结果4.2.4 栈和队列优缺点的比较结果4.3 实验三的结果4.3.1 二叉树的基本操作函数实现情况4.3.2 二叉树的创建、遍历和查找功能测试结果 4.3.3 树的遍历算法测试结果4.3.4 树解决实际问题的应用效果5. 实验分析与总结5.1 实验问题与解决方案5.2 实验结果分析5.3 实验总结与心得体会6. 附件附件一:实验源代码附件二:实验数据7. 法律名词及注释7.1 版权:著作权法规定的对原创作品享有的权利7.2 专利:国家授予的在一定时间内对新型发明享有独占权利的证书7.3 商标:作为标识企业商品和服务来源的标志的名称、符号、图案等7.4 许可协议:指允许他人在一定条件下使用自己的知识产权的协议。

数据结构实验报告 实验五

数据结构实验报告 实验五

数据结构实验报告实验五一.实验内容:实现哈夫曼编码的生成算法。

二.实验目的:1、使学生熟练掌握哈夫曼树的生成算法。

2、熟练掌握哈夫曼编码的方法。

三.问题描述:已知n个字符在原文中出现的频率,求它们的哈夫曼编码。

1、读入n个字符,以及字符的权值,试建立一棵Huffman 树。

2、根据生成的Huffman树,求每个字符的Huffman编码。

并对给定的待编码字符序列进行编码,并输出。

四.问题的实现(1)郝夫曼树的存储表示typedef struct{unsigned int weight;unsigned int parent,lchild,rchild;}HTNode,*HuffmanTree; //动态分配数组存储郝夫曼树郝夫曼编码的存储表示typedef char* *HuffmanCode;//动态分配数组存储郝夫曼编码(2)主要的实现思路:a.首先定义郝夫曼树的存储形式,这里使用了数组b.用select()遍历n个字符,找出权值最小的两个c.构造郝夫曼树HT,并求出n个字符的郝夫曼编码HC总结1.基本上没有什么太大的问题,在调用select()这个函数时,想把权值最小的两个结点的序号带回HuffmanCoding(),所以把那2个序号设置成了引用。

2.在编程过程中,在什么时候分配内存,什么时候初始化花的时间比较长3.最后基本上实现后,发现结果仍然存在问题,经过分步调试,发现了特别低级的输入错误。

把HT.weight=HT.weight+HT.weight;中的s2写成了i 附://动态分配数组存储郝夫曼树typedef struct{int weight; //字符的权值int parent,lchild,rchild;}HTNode,*HuffmanTree;//动态分配数组存储郝夫曼编码typedef char* *HuffmanCode;//选择n个(这里是k=n)节点中权值最小的两个结点void Select(HuffmanTree &HT,int k,int &s1,int &s2) { int i;i=1;while(i //下面选出权值最小的结点,用s1指向其序号s1=i;for(i=1;i {if(HT.parent==0&&HT.weight}//下面选出权值次小的结点,用s2指向其序号for(i=1;i {if(HT.parent==0&&i!=s1)break;}s2=i;for(i=1;i {if(HT.parent==0&&i!=s1&&HT.weight}}//构造Huffman树,求出n个字符的编码void HuffmanCoding(HuffmanTree &HT,HuffmanCode&HC,int *w,int n)int m,c,f,s1,s2,i,start;char *cd;if(n m=2*n-1; //n个叶子n-1个结点HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); //0号单元未用,预分配m+1个单元HuffmanTree p=HT+1;w++; //w的号单元也没有值,所以从号单元开始for(i=1;i {p->weight=*w;p->parent=p->rchild=p->lchild=0;}for(;i {p->weight=p->parent=p->rchild=p->lchild=0;}for(i=n+1;i {Select(HT,i-1,s1,s2); //选出当前权值最小的HT.parent=i;HT.parent=i;HT.lchild=s1;HT.rchild=s2;HT.weight=HT.weight+HT.weight;//从叶子到根逆向求每个字符的郝夫曼编码HC=(HuffmanCode)malloc((n+1)*sizeof(char*)); //分配n个字符编码的头指针变量cd=(char*)malloc(n*sizeof(char)); //分配求编码的工作空间cd='';//编码结束符for(i=1;i {start=n-1; //编码结束符位置for(c=i,f=HT.parent;f!=0;c=f,f=HT.parent) //从叶子到根逆向求编码{if(HT.lchild==c)cd='0';elsecd='1';}HC=(char*)malloc((n-start)*sizeof(char)); //为第i个字符编码分配空间strcpy(HC,&cd);//从cd复制编码到HC}free(cd); //释放工作空间}void main(){ int n,i;int* w; //记录权值char* ch; //记录字符HuffmanTree HT;HuffmanCode HC;cout cin>>n;w=(int*)malloc((n+1)*sizeof(int)); //记录权值,号单元未用ch=(char*)malloc((n+1)*sizeof(char));//记录字符,号单元未用cout for(i=1;i {cout }。

国家开放大学《数据结构》课程实验报告(实验6——查找)参考答案

国家开放大学《数据结构》课程实验报告(实验6——查找)参考答案
}
/*按平均成绩进行折半查找并插入新记录,使表仍按平均成绩降序排列*/
int BinSort(Student *a,int n,Student x)
{
int low,high,mid;
int i,j;
/*折半查找*/
low=0;
high=n-1;
while(low<=high)
{
mid=(low+high)/2;
void main()
{
Student a[N]={{"Zhao",95},{"Qian",90},{"Sun",86},{"Li",75}},x;
int n=4; /*学生人数,即表长*/
printf("初始%d位学生的信息表如下:\n",n);
Display(a,n);
printf("\n\n");
《数据结构》课程实验报告
(实验6——查找)
学生姓名
学 号
班 级
指导老师
实验名称
实验成绩
实验报告




实验目的:
某班学生成绩信息表中,每个学生的记录已按平均成绩由高到低排好序,后来发现某个学生的成绩没有登记到信息表中,使用折半查找法把该同学的记录插入到信息表中,使信息表中的记录仍按平均成绩有序。
实验要求:
(1)建立现有学生信息表,平均成绩已有序。
(2)输入插入学生的记录信息。
(3)用折半查找找到插入位置,并插入记录。
设计思路:
(1)用结构数组存储成绩信息表。
(2)对记录中的平均成绩进行折半查找并插入。
实验内容源自程序代码:/*实验5.1折半查找*/

数据结构实验报告实验5

数据结构实验报告实验5

数据结构实验报告实验5一、实验目的本次实验的主要目的是深入理解和掌握常见的数据结构,通过实际编程实现和操作,提高对数据结构的应用能力和编程技巧。

二、实验环境本次实验使用的编程语言为C++,开发工具为Visual Studio 2019。

三、实验内容1、线性表的基本操作实现线性表的创建、插入、删除、查找等基本操作。

对不同操作的时间复杂度进行分析和比较。

2、栈和队列的应用利用栈实现表达式求值。

使用队列模拟银行排队系统。

3、二叉树的遍历实现二叉树的先序、中序、后序遍历算法。

分析不同遍历算法的特点和应用场景。

4、图的表示和遍历采用邻接矩阵和邻接表两种方式表示图。

实现图的深度优先遍历和广度优先遍历算法。

四、实验步骤及结果1、线性表的基本操作首先,定义了一个线性表的结构体,包含数据域和指针域。

创建线性表时,动态分配内存空间,并初始化表头和表尾指针。

插入操作分为表头插入、表尾插入和指定位置插入。

在指定位置插入时,需要先找到插入点的前一个节点,然后进行插入操作。

删除操作同样需要找到要删除节点的前一个节点,然后释放删除节点的内存空间,并调整指针。

查找操作通过遍历线性表,逐个比较数据值来实现。

经过测试,不同操作的时间复杂度如下:创建操作的时间复杂度为 O(1)。

插入操作在表头和表尾插入的时间复杂度为 O(1),在指定位置插入的时间复杂度为 O(n)。

删除操作的时间复杂度为 O(n)。

查找操作的平均时间复杂度为 O(n)。

2、栈和队列的应用表达式求值:将表达式转换为后缀表达式,然后利用栈进行计算。

遇到操作数则入栈,遇到操作符则从栈中弹出两个操作数进行计算,并将结果入栈。

最后栈顶元素即为表达式的结果。

银行排队系统:使用队列模拟客户的排队过程。

客户到达时入队,服务窗口空闲时从队列头部取出客户进行服务。

实验结果表明,栈和队列能够有效地解决相关问题,提高程序的效率和可读性。

3、二叉树的遍历先序遍历:先访问根节点,然后递归遍历左子树,最后递归遍历右子树。

《数据结构》实验书

《数据结构》实验书

目录实验一线性表基本操作的编程实现 (201)实验二堆栈或队列基本操作的编程实现 (49)实验四二维数组基本操作的编程实现 (18)实验五二叉树基操作的编程实现 (20)实验六图基本操作的编程实现 (45)(特别提示:程序设计包含两个方面的错误。

其一是错误,其二是能错误。

为了提高学生的编程和能力,本指导书给出的程序代码并的两种错误。

并且也不保证程序的完整性,有一些语句已经故意删除,就是要求学生自己编制完成,这样才能达到我们的要求。

希望大家以自己所学高级语言的基本功和点为基础,不要过于依赖给出的参考代码,这样才能有所进步。

如果学生能够根据要求完全自己编制,那就不好了。

)实验一线性表基本操作的编程实现【实验目的】线性表基本操作的编程实现要求:线性表基本操作的编程实现(2学时,验证型),掌握线性表的建立、遍历、插入、删除等基本操作的编程实现,也可以进一步编程实现查找、逆序、排序等操作,存储结构可以在顺序结构或链表结分主要功能,也可以用菜单进行管理完成大部分功能。

还鼓励学生利用基本操作进行一些更实际的应用型程序设计。

【实验性质】【实验内容】把线性表的顺序存储和链表存储的数据插入、删除运算其中某项进行程序实现。

建议实现键盘输入数据以实现程序的通据的函数。

【注意事项】【思考问题】1.线性表的顺序存储和链表存储的差异?优缺点分析?2.那些操作引发了数据的移动?3.算法的时间效率是如何体现的?4.链表的指针是如何后移的?如何加强程序的健壮性?【参考代码】(一)利用顺序表完成一个班级学生课程成绩的简单管理1、预定义以及顺序表结构类型的定义(1)#define ListSize //根据需要自己设定一个班级能够容纳的最大学生数(2)typedef struct Stu{int num; //学生的学号char name[10]; //学生的姓名float wuli; //物理成绩float shuxue; //数学成绩float yingyu; //英语成绩}STUDENT; //存放单个学生信息的结构体类型typedef struct List{stu[ListSize]; //存放学生的数组定义,静态分配空间int length; //记录班级实际学生个数}LIST; //存放班级学生信息的顺序表类型2、建立班级的学生信息void listcreate(LIST *Li,int m) //m为该班级的实际人数{int i;Li->length=0;for(i=0;i<m;i++) //输入m个学生的所有信息{printf("please input the %dth student's information:\n",i+1);printf("num=");scanf("%d", ); //输入第i个学生的学号printf("name=");scanf("%s", ); //输入第i个学生的姓名printf("wuli=");scanf("%f", ); //输入第i个学生的物理成绩printf("shuxue=");scanf("%f", ); //输入第i个学生的数学成绩printf("yingyu=");scanf("%f", ); //输入第i个学生的英语成绩Li->length++; //学生人数加1}}3、插入一个学生信息int listinsert(LIST *Li,int i) //将学生插入到班级Li的第i个位置。

国家开放大学《数据结构》课程实验报告(实验4——二叉树)参考答案

国家开放大学《数据结构》课程实验报告(实验4——二叉树)参考答案
《数据结构》课程实验报告
(实验4二叉树)
学生姓名
学 号
班 级
指导老师
实验名称
实验成绩
实验报告
实ቤተ መጻሕፍቲ ባይዱ



实验目的:
(1)根据数组tree,建立与该二叉树对应的链式存储结构。
(2)对该二叉树采用中序遍历法显示遍历结果。
实验要求:
(1)在主函数中,通过键盘输入建立设定的完全二叉树的顺序存储结构。
(2)设计子函数,其功能为将顺序结构的二叉树转化为链式结构。
(2)中序遍历采用递归算法,即中序遍历左子树、访问根结点、中序遍历右子树。




程序代码:
/*实验3.1二叉树的顺序存储结构和链式存储结构*/
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 20
/*二叉树链式存储结构结点定义*/
typedef struct BTreeNode






指导教师 日期
(3)设计子函数,其功能为对给定二叉树进行中序遍历,显示遍历结果。
(4)通过实例判断算法和相应程序的正确性。
实验基本原理:
(1)顺序存储的二叉树转化为链式存储结构,采用递归算法,递归函数的形式为Creab(tree,n,i,b),其中形参:tree为顺序存储二叉树的数组,n为二叉树的结点数,i是二叉树某结点在数组tree中的下标(初始值为1),b为要建立的链式存储二叉树结点指针。转化时,首先建立*b结点,将tree[i]的值赋给*b的数据域,再调用递归函数分别构造左子树和右子树。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构实验实验四、图遍历的演示。

【实验学时】5学时【实验目的】(1)掌握图的基本存储方法。

(2)熟练掌握图的两种搜索路径的遍历方法。

【问题描述】很多涉及图上操作的算法都是以图的遍历操作为基础的。

试写一个程序,演示连通的无向图上,遍历全部结点的操作。

【基本要求】以邻接多重表为存储结构,实现连通无向图的深度优先和广度优先遍历。

以用户指定的结点为起点,分别输出每种遍历下的结点访问序列和相应生成树的边集。

【测试数据】教科书图7.33。

暂时忽略里程,起点为北京。

【实现提示】设图的结点不超过30个,每个结点用一个编号表示(如果一个图有n个结点,则它们的编号分别为1,2,…,n)。

通过输入图的全部边输入一个图,每个边为一个数对,可以对边的输入顺序作出某种限制。

注意,生成树的边是有向边,端点顺序不能颠倒。

【选作内容】(1)借助于栈类型(自己定义和实现),用非递归算法实现深度优先遍历。

(2)以邻接表为存储结构,建立深度优先生成树和广度优先生成树,再按凹入表或树形打印生成树。

(3)正如习题7。

8提示中分析的那样,图的路径遍历要比结点遍历具有更为广泛的应用。

再写一个路径遍历算法,求出从北京到广州中途不过郑州的所有简单路径及其里程。

【源程序】#include<iostream.h>#include <stdio.h>#include <stdlib.h>#define MAX_VERTEX_NUM 20#define STACK_INIT_SIZE 100#define STACKINCREMENT 10#define TRUE 1#define OK 1#define FALSE 0#define ERROR 0#define OVERFLOW -2typedef enum{DG,DN,UDG,UDN}GraphKind;//{有向图,有向网,无向图,无向网}bool visited[MAX_VERTEX_NUM];typedef struct ArcNode{int adjvex;//该弧所指向的顶点在数组中的下标struct ArcNode *nextarc;int *info;//该弧相关信息的指针}ArcNode;typedef struct VNode{int data;//顶点信息ArcNode *firstarc;//指向第一条依附该顶点的弧的指针}VNode,AdjList[MAX_VERTEX_NUM];typedef struct{AdjList vertices;int vexnum,arcnum;//图的当前顶点数和弧数int kind;//图的种类标志}ALGraph;typedef structint *base;int *top;int stacksize;}SqStack;typedef struct QNode{int data;struct QNode *next;}QNode,*QueuePtr;typedef struct{QueuePtr front;QueuePtr rear;}LinkQueue;int LocateVex(ALGraph G,int v) {//返回数组下标值int i;for(i=0;i<MAX_VERTEX_NUM;++i)if(G.vertices[i].data==v) return i;return -1;}void CreateDN(ALGraph &G){//采用邻接表存储表示,构造有向图G(G.kind=DN) int i,j,k;ArcNode *p;int v1,v2;G.kind=DN;printf(" 输入顶点数:");scanf("%d",&G.vexnum);printf(" 输入弧数:");scanf("%d",&G.arcnum);printf(" 输入顶点:\n");for(i=0;i<G.vexnum;++i){//构造表头向量scanf("%d",&G.vertices[i].data);G.vertices[i].firstarc=NULL;//初始化指针}for(k=0;k<G.arcnum;++k){printf("第%d条弧: ",k+1);scanf("%d",&v1);scanf("%d",&v2);//输入一条弧的始点和终点i=LocateVex(G,v1);j=LocateVex(G,v2);//确定v1和v2在G中位置p=(ArcNode*)malloc(sizeof(ArcNode));//假定有足够空间p->adjvex=j;p->nextarc=G.vertices[i].firstarc;G.vertices[i].firstarc=p;scanf("%d",&p->info);}//for}int Push(SqStack &S,int e){//插入元素e为新的栈顶元素if(S.top-S.base>=S.stacksize){//栈满,追加存储空间S.base=(int*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(int));if(!S.base)exit(OVERFLOW); //存储分配失败S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*S.top++=e;return OK;}int InitStack(SqStack &S) //栈的初始化{S.base=(int*)malloc(STACK_INIT_SIZE*sizeof(int));if(!S.base)exit(OVERFLOW); //存储分配失败S.top=S.base;S.stacksize=STACK_INIT_SIZE;return OK;}int Pop(SqStack &S,int &e) //删除栈顶元素{//若栈不空,则删除S的栈顶元素,用e返回其值if(S.top==S.base)return ERROR;e=*--S.top;return OK;}int GetTop(SqStack S,int &e) //取栈顶元素{//若栈不空,则用e返回S的栈顶元素if(S.top==S.base)return ERROR;e=*(S.top-1);return OK;}int StackEmpty(SqStack S) //栈空{if(S.top==S.base)return TRUE;elsereturn FALSE;}int InitQueue(LinkQueue &Q) //队列初始化{Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));if(!Q.front)exit(OVERFLOW);Q.front->next=NULL;return OK;}int EnQueue(LinkQueue &Q,int e) //插入{//插入元素e为Q的新的队尾元素QueuePtr p=(QueuePtr)malloc(sizeof(QNode)); if(!p)exit(OVERFLOW);p->data=e;p->next=NULL;Q.rear->next=p;Q.rear=p;return OK;}int DeQueue(LinkQueue &Q,int &e){//若队列不空,则删除Q的队头元素,用e返回其值if(Q.front==Q.rear)return ERROR;QueuePtr p=Q.front->next;e=p->data;Q.front->next=p->next;if(Q.rear==p)Q.rear=Q.front;free(p);return OK;}int QueueEmpty(LinkQueue Q) //队列空{if(Q.front==Q.rear)return TRUE;elsereturn FALSE;}int FirstAdjVex(ALGraph G,int u){if(!G.vertices[u].firstarc)return -1;return LocateVex(G,G.vertices[u].firstarc->adjvex); }int NextAdjVex(ALGraph G,int u,int w){ArcNode *p=G.vertices[u].firstarc;while(p&&LocateVex(G,p->adjvex)!=w)p=p->nextarc;if(!p)return FirstAdjVex(G,u);p=p->nextarc;if(!p)return -1;return LocateVex(G,p->adjvex);}void Visit(ALGraph G,int v){printf("%2d",G.vertices[v].data);}void DFSTraverse(ALGraph G){//按深度优先非递归遍历图G,使用辅助栈S和访问标志数组visited int v,w;SqStack S;for(v=0;v<G.vexnum;v++)visited[v]=FALSE;InitStack(S);for(v=0;v<G.vexnum;++v)if(!visited[v]){//v尚未被访问visited[v]=TRUE;Visit(G,v);Push(S,v);//v进栈while(!StackEmpty(S)){for(w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w)){if(!visited[w]){Visit(G,w);visited[w]=TRUE;Push(S,w);GetTop(S,v);}//if}//forPop(S,v);GetTop(S,v);}//while}//ifprintf("\n");}void BFSTraverse(ALGraph G){//按广度优先非递归遍历图G,使用辅助队列Q和访问标志数组visited int v,u,w;LinkQueue Q;for(v=0;v<G.vexnum;++v)visited[v]=FALSE;InitQueue(Q);for(v=0;v<G.vexnum;++v)if(!visited[v]){//v尚未被访问visited[v]=TRUE;Visit(G,v);EnQueue(Q,v);//v入队列while(!QueueEmpty(Q)){DeQueue(Q,u);//队头元素出队并置为ufor(w=FirstAdjVex(G,u);w>=0;w=NextAdjVex(G,u,w)) if(!visited[w]){//w为u的尚未访问的邻接顶点visited[w]=TRUE;Visit(G,w);EnQueue(Q,w);}//if}//while}//ifprintf("\n");}void PrintDN(ALGraph G) //图的显示{int i;ArcNode *p;printf("顶点:\n");for(i=0;i<G.vexnum;++i)printf("%2d",G.vertices[i].data);printf("\n弧:\n");for(i=0;i<G.vexnum;++i){p=G.vertices[i].firstarc;if(p){while(p){printf("%d→%d(%d)\t",i,p->adjvex,p->info);p=p->nextarc;}printf("\n");}//if}//for}void main(){ALGraph G;printf("************题目:图的遍历***************\n\n"); CreateDN(G);PrintDN(G);printf(" 深度优先遍历:");DFSTraverse(G);printf("\n 广度优先遍历:");BFSTraverse(G);}【运行结果】实验五查找算法实现【实验学时】5学时【实验目的】熟练掌握顺序查找、折半查找及二叉排序树、平衡二叉树上的查找、插入和删除的方法,比较它们的平均查找长度。

相关文档
最新文档