数据结构中图的两种存储结构和两种遍历
《数据结构》教学大纲
《数据结构》教学大纲课程名称:数据结构适用班级:2016级计算机科学与技术(专升本函授)、计算机应用技术(专科业余函授)辅导教材:《数据结构》胡学钢等编著安徽大学出版社一、本课程的地位、任务和作用《数据结构与算法》是非计算机专业本科教育的一门专业基础课,它是学习操作系统、编译原理、数据库原理、软件工程等计算机专业核心课程的基础。
本课程的主要目的是:一方面训练学生理解掌握各种基本数据结构的要领,以便能够编写出各种典型算法,另一方面,培养学生应用各种典型算法解决具体应用问题的能力。
本课程在讲述过程中将适当掌握面向对象的思想和技术,以解决C语言本身在描述和解决客观世界能力方面的不足,为后续课程和未来的工程实践打下良好的基础。
二、本课程的相关课程本课程的先前课程为:计算机文化基础、程序设计语言、离散数学。
通过它们,一方面可以使得学生理解计算机和编程的一些基本内容和概念,另一方面为学生进行实践活动提供相应的技术手段和支持。
三、本课程的基本内容及要求第一章绪论什么是数据结构基本概念和术语抽象数据类型的表示与实现算法与算法分析要求:熟悉各名词、术语的含义,掌握基本概念,特别是数据的逻辑结构和存储结构之间的关系;了解抽象数据类型的定义、表示和实现方法;熟悉类C 语言的书写规范;理解算法五个要素的确切含义;掌握计算语句频度和估算算法时间复杂度的方法。
第二章线性表线性表的类型定义线性表的顺序表示和实现线性表的链式表示和实现一元多项式的表示及相加要求:线性表的逻辑结构定义、抽象数据类型定义和各种存储结构的表述方法;在线性表的两类存储结构(顺序存储和链式存储)上实现基本操作;一元多项式的抽象数据类型定义、表示及加法的实现。
第三章栈和队列栈栈的应用举例队列要求:栈和队列的结构特征;在两种存储结构上如何实现栈和队列的基本操作以及栈和队列在程序设计中的应用。
第四章串串类型定义串的表示和实现串操作应用举例要求:串的数据类型定义;串的三种存储表示:定长顺序存储结构、块链存储结构;串的各种基本操作的实现。
数据结构期末考试试题及答案
数据结构期末考试试题及答案一、选择题1. 以下哪种数据结构是线性存储结构?A. 树B. 图C. 栈D. 队列答案:C2. 在链表中,如果一个节点既没有前驱也没有后继,那么这个节点被称作什么?A. 首节点B. 尾节点C. 中间节点D. 孤立节点答案:B3. 树的度是指什么?A. 树中节点的个数B. 树中最大的层次数C. 树的分支数D. 树的节点的度的最大值答案:C4. 在二叉搜索树中,若要查找给定值的节点,当查找失败时应返回的值是?A. -1B. 0C. 1D. 该值本身答案:A5. 快速排序算法的时间复杂度最坏情况下是多少?A. O(n)B. O(nlogn)C. O(n^2)D. O(n!)答案:C二、填空题1. 在顺序表中,元素的物理位置相邻的特点是________,这使得顺序表在________操作上具有较高的效率。
答案:连续性;访问2. 链表相比顺序表的优势在于它能够动态地________存储空间,并且________操作不需要移动大量元素。
答案:分配和释放;插入与删除3. 栈是一种________的数据结构,只允许在________进行插入和删除操作。
答案:后进先出;栈顶4. 图的遍历算法主要有两种,分别是________和________。
答案:深度优先搜索;广度优先搜索5. 哈夫曼树是一种特殊的二叉树,它常用于数据压缩,其构建过程是基于________原则。
答案:最小权值三、简答题1. 请简述数组和链表的优缺点。
答案:数组通过索引直接访问元素,访问速度快,但大小固定,插入和删除操作需要移动大量元素。
链表元素通过指针连接,可以动态分配大小,插入和删除效率高,但访问速度较慢,因为需要从头开始遍历。
2. 什么是二叉树的前序遍历、中序遍历和后序遍历?答案:二叉树的前序遍历是先访问根节点,然后遍历左子树,最后遍历右子树。
中序遍历是先遍历左子树,然后访问根节点,最后遍历右子树。
后序遍历是先遍历左子树,然后遍历右子树,最后访问根节点。
数据结构-实验6图的存储和遍历
实验6.1实现图的存储和遍历一,实验目的掌握图的邻接矩阵和邻接表存储以及图的邻接矩阵存储的递归遍历。
二,实验内容6.1实现图的邻接矩阵和邻接表存储编写一个程序,实现图的相关运算,并在此基础上设计一个主程序,完成如下功能:(1)建立如教材图7.9所示的有向图G的邻接矩阵,并输出。
(2)由有向图G的邻接矩阵产生邻接表,并输出。
(3)再由(2)的邻接表产生对应的邻接矩阵,并输出。
6.2 实现图的遍历算法(4)在图G的邻接矩阵存储表示基础上,输出从顶点V1开始的深度优先遍历序列(递归算法)。
(5)利用非递归算法重解任务(4)。
(6)在图G的邻接表存储表示基础上,输出从顶点V1开始的广度优先遍历序列。
三,源代码及结果截图#include<stdio.h>#include<stdlib.h>#include<string.h>#include<iostream.h>#include<malloc.h>#define MAX_VERTEX_NUM 20typedef char VRType;typedef int InfoType; // 存放网的权值typedef char VertexType; // 字符串类型typedef enum{DG,DN,AG,AN}GraphKind; // {有向图,有向网,无向图,无向网}/*建立有向图的邻接矩阵*/typedef struct ArcCell{VRType adj;//VRType是顶点关系类型,对无权图用1或0表示是否相邻;对带权图则为权值类型InfoType *info; //该弧相关信息的指针(可无)}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];typedef struct{VertexType vexs[MAX_VERTEX_NUM];//顶点向量AdjMatrix arcs;//邻接矩阵int vexnum,arcnum;;//图的当前顶点数和弧数GraphKind kind;//图的种类标志}MGraph;/* 顶点在顶点向量中的定位*/int LocateVex(MGraph &M,VRType v1){int i;for(i=0;i<M.vexnum;i++)if(v1==M.vexs[i])return i;return -1;}void CreateGraph(MGraph &M)//建立有向图的邻接矩阵{int i,j,k,w;VRType v1,v2;M.kind=DN;printf("构造有向网:\n");printf("\n输入图的顶点数和边数(以空格作为间隔):");scanf("%d%d",&M.vexnum,&M.arcnum);printf("输入%d个顶点的值(字符):",M.vexnum);getchar();for(i=0;i<M.vexnum;i++) //输入顶点向量{scanf("%c",&M.vexs[i]);}printf("建立邻接矩阵:\n");for(i=0;i<M.vexnum;i++)for(j=0;j<M.vexnum;j++){M.arcs[i][j].adj=0;M.arcs[i][j].info=NULL;}printf("请顺序输入每条弧(边)的权值、弧尾和弧头(以空格作为间隔):\n");for(k=0;k<M.arcnum;++k)// 构造表结点链表{cin>>w>>v1>>v2;i=LocateVex(M,v1);j=LocateVex(M,v2);M.arcs[i][j].adj=w;}}//按邻接矩阵方式输出有向图void PrintGraph(MGraph M){int i,j;printf("\n输出邻接矩阵:\n");for(i=0; i<M.vexnum; i++){printf("%10c",M.vexs[i]);for(j=0; j<M.vexnum; j++)printf("%2d",M.arcs[i][j].adj);printf("\n");}}// 图的邻接表存储表示typedef struct ArcNode{int adjvex; // 该弧所指向的顶点的位置struct ArcNode *nextarc; // 指向下一条弧的指针InfoType *info; // 网的权值指针)}ArcNode; // 表结点typedef struct VNode{VertexType data; // 顶点信息ArcNode *firstarc; // 第一个表结点的地址,指向第一条依附该顶点的弧的指针}VNode,AdjList[MAX_VERTEX_NUM];// 头结点typedef struct{AdjList vertices;int vexnum,arcnum; // 图的当前顶点数和弧数int kind; // 图的种类标志}ALGraph;void CreateMGtoDN(ALGraph &G,MGraph &M){//由有向图M的邻接矩阵产生邻接表int i,j;ArcNode *p;G.kind=M.kind;G.vexnum=M.vexnum;G.arcnum=M.arcnum;for(i=0;i<G.vexnum;++i){//构造表头向量G.vertices[i].data=M.vexs[i];G.vertices[i].firstarc=NULL;//初始化指针}for(i=0;i<G.vexnum;++i)for(j=0;j<G.vexnum;++j)if(M.arcs[i][j].adj){p=(ArcNode*)malloc(sizeof(ArcNode));p->adjvex=j;p->nextarc=G.vertices[i].firstarc;p->info=M.arcs[i][j].info;G.vertices[i].firstarc=p;}}void CreateDNtoMG(MGraph &M,ALGraph &G){ //由邻接表产生对应的邻接矩阵int i,j;ArcNode *p;M.kind=GraphKind(G.kind);M.vexnum=G.vexnum;M.arcnum=G.arcnum;for(i=0;i<M.vexnum;++i)M.vexs[i]=G.vertices[i].data;for(i=0;i<M.vexnum;++i){p=G.vertices[i].firstarc;while(p){M.arcs[i][p->adjvex].adj=1;p=p->nextarc;}//whilefor(j=0;j<M.vexnum;++j)if(M.arcs[i][j].adj!=1)M.arcs[i][j].adj=0;}//for}//输出邻接表void PrintDN(ALGraph G){int i;ArcNode *p;printf("\n输出邻接表:\n");printf("顶点:\n");for(i=0;i<G.vexnum;++i)printf("%2c",G.vertices[i].data);printf("\n弧:\n");for(i=0;i<G.vexnum;++i){p=G.vertices[i].firstarc;while(p){printf("%c→%c(%d)\t",G.vertices[i].data,G.vertices[p->adjvex].data,p->info);p=p->nextarc;}printf("\n");}//for}int visited[MAX_VERTEX_NUM]; // 访问标志数组(全局量)void(*VisitFunc)(char* v); // 函数变量(全局量)// 从第v个顶点出发递归地深度优先遍历图G。
《数据结构》期末考试试卷试题及答案
《数据结构》期末考试试卷试题及答案一、选择题(每题5分,共20分)1. 下列哪个不是线性结构?A. 栈B. 队列C. 图D. 数组2. 下列哪个不是栈的基本操作?A. 入栈B. 出栈C. 查找D. 判断栈空3. 下列哪个不是队列的基本操作?A. 入队B. 出队C. 查找D. 判断队列空4. 下列哪个不是图的基本概念?A. 顶点B. 边C. 路径D. 环二、填空题(每题5分,共20分)5. 栈是一种______结构的线性表,队列是一种______结构的线性表。
6. 图的顶点集记为V(G),边集记为E(G),则无向图G=(V(G),E(G)),有向图G=(______,______)。
7. 树的根结点的度为______,度为0的结点称为______。
8. 在二叉树中,一个结点的左子结点是指______的结点,右子结点是指______的结点。
三、简答题(每题10分,共30分)9. 简述线性表、栈、队列、图、树、二叉树的基本概念。
10. 简述二叉树的遍历方法。
11. 简述图的存储结构及其特点。
四、算法题(每题15分,共30分)12. 编写一个算法,实现栈的入栈操作。
13. 编写一个算法,实现队列的出队操作。
五、综合题(每题20分,共40分)14. 已知一个无向图G=(V,E),其中V={1,2,3,4,5},E={<1,2>,<1,3>,<2,4>,<3,4>,<4,5>},画出图G,并给出图G的邻接矩阵。
15. 已知一个二叉树,其前序遍历序列为ABDCE,中序遍历序列为DBACE,请画出该二叉树,并给出其后序遍历序列。
答案部分一、选择题答案1. C2. C3. C4. D二、填空题答案5. 后进先出先进先出6. V(G),E(G)7. 0 叶结点8. 左孩子右孩子三、简答题答案9. (1)线性表:一个线性结构,其特点是数据元素之间存在一对一的线性关系。
02272《数据结构》国开形考任务(1-4)试题答案集
02272《数据结构》国开形考任务(1-4)试题答案集任务1:数据结构基础1. 数据结构是指数据元素之间的关系和操作的组织方式。
它包括数据的逻辑结构、数据的存储结构以及对数据的操作等内容。
2. 数据结构的逻辑结构包括线性结构、树形结构、图形结构等。
3. 数据结构的存储结构包括顺序存储结构和链式存储结构。
4. 数据结构的操作包括插入、删除、查找、修改等。
5. 数据结构的选择应根据具体应用需求来确定,需要考虑数据的规模、操作的效率、存储空间的利用等因素。
任务2:线性表1. 线性表是一种最基本的数据结构,它包括顺序表和链表两种存储结构。
2. 顺序表是用一段连续的存储空间存储线性表的元素,可以通过下标直接访问元素。
顺序表的插入和删除操作需要移动其他元素,效率较低。
3. 链表是通过节点之间的指针来连接元素的,可以实现灵活的插入和删除操作。
链表的缺点是访问元素需要从头节点开始遍历,效率较低。
4. 单链表是最简单的链表结构,每个节点包含数据和指向下一个节点的指针。
5. 双链表在单链表的基础上增加了一个指向前一个节点的指针,可以实现双向遍历。
任务3:树和二叉树1. 树是一种非线性的数据结构,它包括节点和边组成。
节点之间存在一对多的关系。
2. 二叉树是一种特殊的树结构,每个节点最多有两个子节点。
3. 二叉树的遍历方式包括前序遍历、中序遍历和后序遍历。
4. 前序遍历先访问根节点,然后依次访问左子树和右子树。
5. 中序遍历先访问左子树,然后访问根节点,最后访问右子树。
6. 后序遍历先访问左子树,然后访问右子树,最后访问根节点。
任务4:图的表示和遍历1. 图是一种由节点和边组成的数据结构,节点之间存在多对多的关系。
2. 图的表示方式有邻接矩阵和邻接表两种。
3. 邻接矩阵是一个二维数组,用于表示节点之间的连接关系。
4. 邻接表是由链表构成的数组,每个节点的链表存储与其相邻的节点。
5. 图的遍历方式包括深度优先搜索和广度优先搜索。
数据结构-实验四图的的操作及应用
实验四 图的的操作及应用实验课程名: 图的的操作及应用专业班级: 11计科(1) 学 号: 姓 名:实验时间: 2012. 12.11 实验地点: 指导教师:一、实验目的1、理解图的基本概念及术语;2、掌握图的两种存储结构(邻接矩阵和邻接表)的表示方法;3、熟练掌握图的两种遍历(深度优先搜索遍历和广度优先搜索遍历)的算法思想、步骤,并能列出在两种存储结构上按上述两种遍历算法得到的序列;4、理解最小生成树的概念,能按Prim算法构造最小生成树;领会并掌握拓扑排序、关键路径、最短路径的算法思想。
二、实验的内容和步骤1、构造图的邻接矩阵存储结构或邻接表存储结构。
代码:# include <iostream.h># include <malloc.h># include <conio.h># define INFINITY 1000# define MAX_VERTEX_NUM 20# define OK 1#define STARTS "********************************"typedef enum{DG,DN,UDG,UDN} GraphKind;typedef int EType;typedef int InfoType;typedef int VertexType;typedef struct ArcCell //define structure MGraph{ EType adj;InfoType *info;}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];typedef struct{ VertexType vexs[MAX_VERTEX_NUM];AdjMatrix arcs;int vexnum,arcnum;GraphKind kind;}MGraph;int CreatUDN(MGraph &G) //CreatUDN() sub-function{int IncInfo,i,j,k,v1,v2,w;cout<<endl<<"Please input the number of G.vexnum (eg,G.vexnum=4): ";cin>>G.vexnum; //input the number of vexcout<<"Please input the number of G.arcnum (eg,G.arcnum=4): ";cin>>G.arcnum; //input the number of arc: ";cout<<"Please input IncInfo (0 for none)cin>>IncInfo;for(i=0;i<G.vexnum;++i)for(j=0;j<G.vexnum;++j){ G.arcs[i][j].adj=INFINITY; //initial G.arcs[i][j].adj//initial G.arcs[i][j].infoG.arcs[i][j].info=NULL;}cout<<"Plese input arc(V1-->V2), For example: (V1=1,V2=3),(V1=2,V2=4)..."<<endl;for(k=0;k<G.arcnum;++k) //input arc(v1,v2){cout<<endl<<"Please input the "<<k+1<<"th arc's v1 (0<v1<G.vexnum) :";cin>>v1; //input v1cout<<"Please input the "<<k+1<<"th arc's v2 (0<v2<G.vexnum) :";cin>>v2; //input v2:";cout<<"Please input the "<<k+1<<"th arc's weightcin>>w; //input weighti=v1;j=v2;//if (v1,v2) illegal,againwhile(i<1||i>G.vexnum||j<1||j>G.vexnum){cout<<"Please input the "<<k+1<<"th arc's v1 (0<v1<G.vexnum) :";cin>>v1;cout<<"Please input the "<<k+1<<"th arc's v2 (0<v1<G.vexnum) :";cin>>v2;:";cout<<"Please input the "<<k+1<<"th arc's weightcin>>w;i=v1;j=v2;} //while endi--;j--;G.arcs[i][j].adj=G.arcs[j][i].adj=w; //weightcout<<"G.arcs["<<i+1<<"]["<<j+1<<"].adj="<<"G.arcs["<<j+1<<"]["<<i+1<<"].adj="<<w<<e ndl;if(IncInfo){ cout<<"Please input the "<<k+1<<"th arc's Info :";cin>>*G.arcs[i][j].info;}} //for endreturn (OK);} //CreatUDN() end打印邻接矩阵void Gprintf(MGraph G) //{cout<<"邻接矩阵数组为:\n";for(int i=0;i<G.vexnum;i++){for(int k=0;k<G.vexnum;k++)cout<<G.arcs[i][k].adj<<"\t";cout<<endl;}}/*邻接表*/typedef struct ArcNode //define structure ALGraph{ int adjvex;struct ArcNode *nextarc;InfoType *info;}ArcNode;typedef struct VNode{ VertexType data;ArcNode *firstarc;}VNode,AdjList[MAX_VERTEX_NUM];typedef struct{ AdjList vertices;int vexnum,arcnum;int kind;}ALGraph;int CreateDG(ALGraph &G) //CreateDG() subfunction{ int IncInfo,i,j,k,v1,v2,w;cout<<endl<<"Please input the number of G.vexnum (eg,G.vexnum=4): "; cin>>G.vexnum; //input the number of vexcout<<"Please input the number of G.arcnum (eg,G.arcnum=4): ";cin>>G.arcnum; //input the numbe of arc: ";cout<<"Please input the number of IncInfo (0 for none)cin>>IncInfo; //if no information, input 0for(i=0;i<G.vexnum;++i){ G.vertices[i].data=i; //initial G.vertices[i].data//initial G.vertices[i].firstarcG.vertices[i].firstarc=NULL;}cout<<"Plese input arc(V1-->V2), For example: (V1=1,V2=3),(V1=2,V2=4)..."<<endl; for(k=0;k<G.arcnum;++k) //input arc(v1,v2){ cout<<endl<<"Please input the "<<k+1<<"th arc's v1 (0<v1<G.vexnum): ";cin>>v1;cout<<"Please input the "<<k+1<<"th arc's v2 (0<v2<G.vexnum0: ";cin>>v2;i=v1;j=v2;while(i<1||i>G.vexnum||j<1||j>G.vexnum) //if (v1,v2) illegal{ cout<<endl<<"Please input the "<<k+1<<"th arc's v1 (0<v1<G.vexnum): ";cin>>v1;cout<<"Please input the "<<k+1<<"th arc's v2 (0<v2<G.vexnum): ";cin>>v2;i=v1;j=v2;} //while endi--;j--;ArcNode *p;p=(ArcNode *)malloc(sizeof(ArcNode)); //allocate memoryif(!p){ cout<<"Overflow!";return (0);}p->adjvex=j; //assign p->adjvexp->nextarc=G.vertices[i].firstarc;p->info=NULL;G.vertices[i].firstarc=p;if(IncInfo){ cout<<"Please input the info :";//input informationcin>>*(p->info);}} //for endreturn (OK);} //CreateDG() endint main(){MGraph MG;ALGraph AG;int a=-1;while(a!=0){cout<<STARTS<<STARTS<<endl;cout<<"1)邻接矩阵(无向网)\t"<<"2)邻接表(有向图)\t"<<"3)退出"<<endl;cout<<"选择存储方式:";cin>>a;switch(a){case 1: {CreatUDN(MG);Gprintf(MG);break;}case 2: CreateDG(AG);break;case 3: a=0;break;选择错误\n"<<endl;default:cout<<"}}return 0;}运行结果:2.按照建立一个带权有向图的操作需要,编写在邻接矩阵或邻接表存储结构下,带权有向图基本操作的实现函数(如初始化图、在图中插入一个结点、在图中插入一条边、在图中寻找序号为v的结点的第一个邻接结点、在图中寻找序号为v1结点的邻接结点v2的下一个邻接结点、图的深度优先遍历、图的广度优先遍历等)。
数据结构试题集(8套卷子+答案)
《数据结构》试卷一一、填空题:(共20分)1、当线性表的元素总数基本稳定,且很少进行插入和删除操作,但要求以最快的速度存取线性表中的元素时,应采用存储结构。
2、队列是限制插入只能在表的一端,而删除在表的另一端进行的线性表,其特点是。
3、在一棵二叉树中,度为0的结点个数为n0,度为2的个数为n2,则n0= 。
4、二叉树的前序遍历序列等同于该二叉树所对应森林的遍历序列5、对一棵二叉排序树,若以遍历该树,将得到一个以关键字递增顺序排列的有序序列。
6、三个结点a,b,c组成二叉树,共有种不同的结构。
7、在AVL树中,由于在A结点的右孩子的右子树上插入结点,使A结点的平衡因子由-1变为-2,使其失去平衡,应采用型平衡旋转。
8、图的遍历有两种,它们是。
9、堆排序的时间复杂度为。
10、在含有N个结点的二叉链表中有空链域,通常用这些空链域存储线索,从而得另一种链式存储结构----线索链表。
二、单项选择题(共20分)1、若进栈序列为1,2,3,4,假定进栈和出栈可以穿插进行,则可能的出栈序列是()(A)2,4,1,3(B)3,1,4,2(C)3,4,1,2(D)1,2,3,42、有一棵非空的二叉树,(第0层为根结点),其第i层上最多有多少个结点?()(A)2i(B)21-i(C)21+i(D) i3、设电文中出现的字母为A,B,C,D,E,每个字母在电文中出现的次数分别为9,27,3,5,11,按huffman编码,则字母A编码为()(A)10(B)110(C)1110(D)11114、下面关于数据结构的叙述中,正确的叙述是()(A)顺序存储方式的优点是存储密度大,且插、删除运算效率高(B)链表中每个结点都恰好包含一个指针(C)包含n个结点的二叉排序树的最大检索长度为logn2(D)将一棵树转为二叉树后,根结点无右子树5、程序段:y:=0while n>=(y+1)*(y+1) doy:=y+1enddo的时间复杂度为()(A)O(n) (B)O(n2) (C)O(n2/1) (D)O(1)6、排序方法中,关键码比较的次数与记录的初始排列无关的是( )(A) shell排序 (B) 归并排序 (C) 直接插入排序 (D) 直接选择排序7、数组q[0..n-1]作为一个环行队列,f 为当前队头元素的前一位置,r为队尾元素的位置,假定队列中元素的个数总小于n,则队列中元素个数为( )(A) r-f (B) n+f-r (C) n+r-f (D) (n+r-f) mod n8、为了有效的利用散列查找技术,需要解决的问题是:( )Ⅰ:找一个好的散列函数Ⅱ:设计有效的解决冲突的方法Ⅲ:用整数表示关键码值(A) Ⅰ和Ⅲ (B) Ⅰ和Ⅱ (C) Ⅱ和Ⅲ (D) Ⅰ,Ⅱ和Ⅲ9、引入线索二叉树的目的是()(A) 加快查找结点的前驱或后继的速度(B) 为了能在二叉树中方便的进行插入与删除(C) :为了能方便的找到双亲(D) 使二叉树的遍历结果唯一10、用二分(折半)查找表的元素的速度比用顺序法()(A) 必然快(B) 必然慢(C): 相等(D): 不能确定三、简答题:(共40分)1、已知某二叉树按中序遍历序列为BFDAEGC,按前序遍历序列为ABDFCEG,试画出该二叉树形状,并写出它的后序遍历序列。
图的上机实验报告
图的上机实验报告一、实验目的本次实验的目的是进一步了解图的概念、图的存储结构和图的遍历算法,并通过具体的上机实验来熟悉图的相关操作。
二、实验环境- 操作系统:Windows 10- 编程语言:C++- 开发环境:Visual Studio 2019三、实验内容本次实验主要包括以下几个方面的内容:1.图的基本概念首先,我们需要了解图的基本概念。
图是一种非线性的数据结构,由顶点集合和边集合构成。
顶点代表图中的一个节点,而边则代表顶点之间的关系。
图可以分为有向图和无向图,其中有向图的边是有方向的,而无向图的边是无方向的。
2.图的存储结构图的存储结构有两种常见的方式:邻接矩阵和邻接表。
邻接矩阵是用一个二维数组来表示图的结构,数组中的元素表示两个顶点之间是否有边。
邻接表则是由一个链表数组组成,每个数组元素对应一个顶点,链表中存储了与该顶点相邻的其他顶点。
3.图的遍历算法图的遍历算法有两种常见的方式:深度优先搜索(DFS)和广度优先搜索(BFS)。
深度优先搜索是从某个顶点开始,递归地访问该顶点的邻接顶点,直到无法再继续深入为止,然后回溯到之前的顶点。
而广度优先搜索是从某个顶点开始,依次访问该顶点的所有邻接顶点,然后按照同样的方式访问邻接顶点的邻接顶点,直到所有顶点都被访问完毕。
四、实验步骤根据上述内容,我们进行了如下实验步骤:1. 创建一个图对象,选择合适的存储结构(邻接矩阵或邻接表);2. 根据实际需求,添加图的顶点和边;3. 选择相应的遍历算法(DFS或BFS);4. 遍历图,输出遍历结果。
五、实验结果在实验过程中,我们成功地创建了一个图对象,并使用邻接矩阵存储了图的结构。
然后,我们添加了一些顶点和边的信息,并选择了深度优先搜索算法进行遍历。
最后,我们成功地遍历了整个图,并输出了遍历结果。
六、实验总结通过本次实验,我们进一步掌握了图的基本概念、图的存储结构和图的遍历算法。
同时,我们也了解到不同的存储结构和遍历算法在不同的应用场景中,有着各自的优缺点。
数据结构-图
出发点,访问D,标注数字序号④;
(a)无向图 G9
(b)深度优先遍历
图的遍历
3.1图的深度优先遍历
接着到G,访问G, 标注数字序号⑤;G 相邻顶点都访问过了,顺着虚线箭头方向
回退到 D,D 相邻顶点都访问过了,顺着虚线箭头方向回退到C,C 相邻顶点也都访问过
图的基本概念
1.2图的操作定义
02
PART
图的存储结构
2.1邻接矩阵
首先介绍的是数组表示法,即用两个数组分别存储顶点的信息和顶点之间的关系。
用来存放图中 n 个顶点的数组称为顶点数组。我们可将图中顶点按任意顺序保存到顶点数组中,
这样按存放次序每个顶点就对应一个位置序号(简称位序),依次为0~n-1;接着用一个 n×n 的二维
称为有向图。例如,当V={v1,v2,v3,v4,v5},VR={<v1,v2>,
<v1,v4>,<v2,v4>,<v3,v1>,<v3,v5>,<v4,v3>,<v5,v4>},则顶点集合
V、关系集合VR 构成有向图G1=(V,VR),如图(a)所示。
图的基本概念
1.1图的定义与基本术语
无向图(Undirected Graph)。如果顶点间的关系是无
序号作为表结点的值,所以一条弧对应一个表结点。右图为有向图 G1
和无向图 G2的邻接表表示法存储示意图。
图的存储结构
2.2邻接表
对于有向网和无向网,由于表结点表示边或弧,因此需要对表结点扩充一个属性域,表
结点至少包含顶点序号、权值和下一表结点指针 3 个属性,由此构成网的邻接表。
数据结构与算法
数据结构与算法第一节数据结构及算法概述一、数据结构图、四类基本结构的示意图【要点】 1 .数据元素是数据的基本单位。
2 .数据结构是相互之间存在一种或多种特定关系的数据元素的集合。
3 .4类基本的规律结构:集合、线性结构、树形结构和网状结构。
4 .4种数据存储方式:挨次、链式、索引和散列。
【例题•单选题】(2022年义省信用社聘请考试真题)下列说法不正确的是()OA.数据元素是数据的基本单位B.数据项是数据中不行分割的最小标志单位 C.数据可由若干个数据元素构成D.数据项可由若干个数据元素构成『正确答案』D『答案解析』数据元素是数据的基本单位,在计算机程序中通常被作为一个整体进 行考虑和处理。
一个数据元素可由若干个数据项组成。
数据项是不行分割的、含有独立 意义的最小数据单位。
因此D 选项不正确。
二、算法O ——O ——O ——O ——O ⑹树型结构⑹线性结构 (d)图形结构算法是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每条指令表示一个或多个操作。
算法的特性:有穷性、确定性、可行性、输入和输出。
【要点】评价算法优劣标准:正确性、可读性、健壮性、高效率与低存储量需求。
其次节线性表线性表是n (n≥0)个数据元素al, a2,…,an组成的有限序列,n=0时称为空表。
非空的线性表,有以下特征:L有且仅有一个开头结点al,没有直接前趋,有且仅有一个直接后继a2。
2.有且仅有一个终结结点an,没有直接后继,有且仅有一个直接前趋a-。
3.其余的内部结点ai (2WiWnT)都有且仅有一个直接前趋a-和一个直接后继3i+ι o线性表的链式存储包括单链表、循环链表和双链表。
head 头结点百结点尾结点【留意】与单链表的插入和删除操作不同的是,在双链表中插入和删除须同时修改两个方向上的指针。
第三节栈和队列一、栈栈是一种“特别的”线性表,这种线性表中的插入和删除运算限定在表的某一端进行。
不含任何数据元素的栈称为空栈。
数据结构第六章图理解练习知识题及答案解析详细解析(精华版)
图1. 填空题⑴设无向图G中顶点数为n,则图G至少有()条边,至多有()条边;若G为有向图,则至少有()条边,至多有()条边。
【解答】0,n(n-1)/2,0,n(n-1)【分析】图的顶点集合是有穷非空的,而边集可以是空集;边数达到最多的图称为完全图,在完全图中,任意两个顶点之间都存在边。
⑵任何连通图的连通分量只有一个,即是()。
【解答】其自身⑶图的存储结构主要有两种,分别是()和()。
【解答】邻接矩阵,邻接表【分析】这是最常用的两种存储结构,此外,还有十字链表、邻接多重表、边集数组等。
⑷已知无向图G的顶点数为n,边数为e,其邻接表表示的空间复杂度为()。
【解答】O(n+e)【分析】在无向图的邻接表中,顶点表有n个结点,边表有2e个结点,共有n+2e个结点,其空间复杂度为O(n+2e)=O(n+e)。
⑸已知一个有向图的邻接矩阵表示,计算第j个顶点的入度的方法是()。
【解答】求第j列的所有元素之和⑹有向图G用邻接矩阵A[n][n]存储,其第i行的所有元素之和等于顶点i的()。
【解答】出度⑺图的深度优先遍历类似于树的()遍历,它所用到的数据结构是();图的广度优先遍历类似于树的()遍历,它所用到的数据结构是()。
【解答】前序,栈,层序,队列⑻对于含有n个顶点e条边的连通图,利用Prim算法求最小生成树的时间复杂度为(),利用Kruskal 算法求最小生成树的时间复杂度为()。
【解答】O(n2),O(elog2e)【分析】Prim算法采用邻接矩阵做存储结构,适合于求稠密图的最小生成树;Kruskal算法采用边集数组做存储结构,适合于求稀疏图的最小生成树。
⑼如果一个有向图不存在(),则该图的全部顶点可以排列成一个拓扑序列。
【解答】回路⑽在一个有向图中,若存在弧、、,则在其拓扑序列中,顶点vi, vj, vk的相对次序为()。
【解答】vi, vj, vk【分析】对由顶点vi, vj, vk组成的图进行拓扑排序。
数据结构-图及其存储结构
for (j=0;j<G.vexnum;+ +j ) adj Info G.arcs[i][j]={∞,NULL}; //Arccell的形式为: for (k=0;k<G.arcnum;+ +i ) { //二维数组存放各边上的信息 scanf(v1,v2,w); i=locatevex(G,v1); j=locatevex(G,v2); //求顶点v1,v2在图中的位置 G.arcs[i][j].adj=w; G.arcs[j][i].adj=w; //无向网的邻接矩阵是对称的 if (IncInfo) Input (*G.arcs[i][j].info); //将弧上的信息存储在指针info
case UDN: return CreateUDN(G);
default : return ERROR; }//CreateGraph
二、存储结构
2.数组表示法前提下图的输入
*以无向网为例,即当用户输入图的类型标志为UDN时,有:
Status CreateUDN(MGraph &G){ scanf(G.vexnum,G.arcnum,IncInfo); //IncInfo 为0时表示各弧
v2 6 5
v1 5 1 5 v3 3 6 4 2 v4
一个连通无向图的生成树是该图的一个连通分量,它 包含有该图的所有n个顶点以及连接这n个顶点的(n-1) 条边。 边或弧上带权值的图称为带权图或网(分为无向网和 有向网)。 一个无向图的所有生成树中,边上的权值之和最小的 生成树称为该图的最小生成树或最小代价生成树。
数据结构自考试题及答案
数据结构自考试题及答案一、单项选择题(每题1分,共10分)1. 在数据结构中,最基本的数据结构是()。
A. 线性结构B. 非线性结构C. 顺序结构D. 链式结构答案:A2. 线性表的顺序存储结构和链式存储结构相比,其主要优点是()。
A. 存储密度高B. 存储密度低C. 存储空间少D. 插入和删除操作快答案:A3. 在一个长度为n的顺序表中,删除第i个元素(1≤i≤n)时,需要移动的元素个数为()。
A. i-1B. n-iC. n-i+1D. n-1答案:C4. 栈的基本运算中,不包括()。
A. 入栈B. 出栈C. 读栈顶元素D. 判断栈空答案:D5. 队列的特点是()。
A. 先进先出B. 先进后出C. 后进先出D. 后进后出答案:A6. 树的深度为5,其中度为3的结点最多有()个。
A. 3B. 7C. 9D. 15答案:D7. 在二叉树的前序遍历序列、中序遍历序列、后序遍历序列中,唯一与树的形态一一对应的序列是()。
A. 前序遍历序列B. 中序遍历序列C. 后序遍历序列D. 无法确定答案:A8. 在图的遍历过程中,若某结点的入度为0,则该结点()。
A. 一定为起点B. 一定为终点C. 可以为起点或终点D. 既不是起点也不是终点答案:C9. 哈夫曼编码是一种()。
A. 定长编码B. 变长编码C. 唯一编码D. 非唯一编码答案:B10. 用邻接矩阵表示图时,若该图是无向图,则其邻接矩阵一定是()。
A. 对称矩阵B. 非对称矩阵C. 稀疏矩阵D. 密集矩阵答案:A二、填空题(每题2分,共20分)1. 在数据结构中,算法的时间复杂度是指算法执行过程中所需要的基本运算次数与输入数据量之间的关系。
算法的时间复杂度通常用大O符号表示,例如,O(n)表示时间复杂度与输入数据量成______关系。
答案:线性2. 线性表的两种存储结构分别是顺序存储结构和______存储结构。
答案:链式3. 在栈中,栈顶元素是最后被插入的元素,遵循______原则。
数据结构(C语言版)_第7章 图及其应用
实现代码详见教材P208
7.4 图的遍历
图的遍历是对具有图状结构的数据线性化的过程。从图中任 一顶点出发,访问输出图中各个顶点,并且使每个顶点仅被访 问一次,这样得到顶点的一个线性序列,这一过程叫做图的遍 历。
图的遍历是个很重要的算法,图的连通性和拓扑排序等算法 都是以图的遍历算法为基础的。
V1
V1
V2
V3
V2
V3
V4
V4
V5
图9.1(a)
图7-2 图的逻辑结构示意图
7.2.2 图的相关术语
1.有向图与无向图 2.完全图 (1)有向完全图 (2)无向完全图 3.顶点的度 4.路径、路径长度、回路、简单路径 5.子图 6.连通、连通图、连通分量 7.边的权和网 8.生成树
2. while(U≠V) { (u,v)=min(wuv;u∈U,v∈V-U); U=U+{v}; T=T+{(u,v)}; }
3.结束
7.5.1 普里姆(prim)算法
【例7-10】采用Prim方法从顶点v1出发构造图7-11中网所对 应的最小生成树。
构造过程如图7-12所示。
16
V1
V1
V2
7.4.2 广度优先遍历
【例7-9】对于图7-10所示的有向图G4,写出从顶点A出发 进行广度优先遍历的过程。
访问过程如下:首先访问起始顶点A,再访问与A相邻的未被 访问过的顶点E、F,再依次访问与E、F相邻未被访问过的顶 点D、C,最后访问与D相邻的未被访问过的顶点B。由此得到 的搜索序列AEFDCB。此时所有顶点均已访问过, 遍历过程结束。
【例7-1】有向图G1的逻辑结构为:G1=(V1,E1) V1={v1,v2,v3,v4},E1={<v1,v2>,<v2,v3>,<v2,v4>,<v3,v4>,<v4,v1>,<v4,v3>}
数据结构中图的遍历算法研究
数据结构中图的遍历算法研究作者:陈思薇来源:《课程教育研究》2018年第40期【摘要】图算法是数据结构与算法中一个比较重要的内容,而图的遍历算法是图算法的基础,也就是说其他的图算法都是在遍历算法的基础之上加以改进。
本篇论文主要介绍了两种图的遍历算法,分别是图的深度优先遍历和图的宽度优先遍历。
在介绍图的遍历算法之前,先介绍了图的基础知识,其中包括图的定义、邻接点和关联边、顶点的度、(强)连通图和图的表示方法。
介绍图的遍历算法时,依次介绍了遍历算法的基本步骤、程序框图和伪代码。
最后对全文做总结,并对图的遍历算法在未来如何应用的问题进行了展望。
【关键词】深度优先遍历 ;宽度优先遍历【中图分类号】G63 【文献标识码】A 【文章编号】2095-3089(2018)40-0222-021.引言遍历算法是目前计算机领域中的一个重要的研究方向,一个问题的求解就是从最开始的状态,利用已经存在的规则和条件改变当前状态,直到把当前状态变为最终目的状态,把中间出现的状态全部连接起来,变成一条遍历路径的过程。
通过图的遍历,我们可以找到这条路径[1]。
图的遍历算法主要有两种,一种是按照深度优先的顺序展开遍历的算法,也就是深度优先遍历[2];另一种是按照宽度优先的顺序展开遍历的算法,也就是宽度优先遍历[3]。
宽度优先遍历是沿着图的深度遍历图的所有节点,每次遍历都会沿着当前节点的邻接点遍历,直到所有点全部遍历完成。
如果当前节点的所有邻接点都遍历过了,则回溯到上一个节点,重复这一过程一直到已访问从源节点可达的所有节点为止。
如果还存在没有被访问的节点,则选择其中一个节点作为源节点并重复以上过程,直到所有节点都被访问为止。
利用图的深度优先搜索可以获得很多额外的信息,也可以解决很多图论的问题。
宽度优先遍历又名广度优先遍历。
通过沿着图的宽度遍历图的节点,如果所有节点均被访问,算法随即终止。
宽度优先遍历的实现一般需要一个队列来辅助完成。
数据结构期末考试题及答案
数据结构期末考试题及答案一、选择题1. 以下哪种数据结构是线性存储结构?A. 树B. 图C. 链表D. 哈希表答案:C2. 栈和队列的共同特点是:A. 只能在一端进行插入和删除操作B. 插入和删除操作在不同的两端进行C. 插入和删除操作在同一端进行D. 没有共同点答案:B3. 在二叉搜索树中,若要查找值为x的节点,当发现一个节点的值大于x时,应该:A. 在该节点的左子树中查找B. 在该节点的右子树中查找C. 停止查找D. 随机查找答案:A4. 快速排序算法的时间复杂度为:A. O(log n)B. O(n log n)C. O(n^2)D. O(1)答案:B5. 下面哪种排序算法适用于大数据量的排序?A. 冒泡排序B. 插入排序C. 快速排序D. 选择排序答案:C二、填空题1. 链表的基本操作包括________、________、________和________。
答案:创建、插入、删除、查找2. 在图的表示中,邻接矩阵法的主要缺点是________,而邻接表法的主要缺点是________。
答案:空间消耗大、查询效率低3. 哈夫曼树是一种基于________的最优二叉树,广泛应用于数据压缩和编码。
答案:字符频率4. 红黑树是一种自平衡的二叉搜索树,它的插入和删除操作能保证最坏情况下的查找时间复杂度对数级,具体为________。
答案:O(log n)5. 散列表(哈希表)解决冲突的方法主要有开放定址法、链地址法和________。
答案:双重散列法三、简答题1. 请简述数组和链表的区别及各自的优缺点。
答案:数组是一种顺序存储结构,它的特点是通过索引直接访问元素,访问速度快,但是大小固定,不便于动态扩展。
链表是非连续的存储结构,元素通过指针连接,可以动态地插入和删除元素,但是访问元素需要从头开始遍历,速度较慢。
2. 描述二分查找的算法过程及其时间复杂度。
答案:二分查找是一种在有序数组中查找特定元素的算法。
数据结构专题实验
上机实验要求及规范《数据结构》课程具有比较强的理论性,同时也具有较强的可应用性和实践性,因此上机实验是一个重要的教学环节。
一般情况下学生能够重视实验环节,对于编写程序上机练习具有一定的积极性,但是容易忽略实验的总结,忽略实验报告的撰写。
对于一名大学生必须严格训练分析总结能力、书面表达能力。
需要逐步培养书写科学实验报告以及科技论文的能力。
拿到一个题目,一般不要急于编程,而是应该按照面向过程的程序设计思路(关于面向对象的训练将在其它后继课程中进行),首先理解问题,明确给定的条件和要求解决的问题,然后按照自顶向下,逐步求精,分而治之的策略,逐一地解决子问题。
具体步骤如下:1.问题分析与系统结构设计充分地分析和理解问题本身,弄清要求做什么(而不是怎么做),限制条件是什么。
按照以数据结构为中心的原则划分模块,搞清数据的逻辑结构(是线性表还是树、图?),确定数据的存储结构(是顺序结构还是链表结构?),然后设计有关操作的函数。
在每个函数模块中,要综合考虑系统功能,使系统结构清晰、合理、简单和易于调试。
最后写出每个模块的算法头和规格说明,列出模块之间的调用关系(可以用图表示),便完成了系统结构设计。
2.详细设计和编码详细设计是对函数(模块)的进一步求精,用伪高级语言(如类C语言)或自然语言写出算法框架,这时不必确定很多结构和变量。
编码,即程序设计,是对详细设计结果的进一步求精,即用某种高级语言(如C/C++语言)表达出来。
尽量多设一些注释语句,清晰易懂。
尽量临时增加一些输出语句,便于差错矫正,在程序成功后再删去它们。
3.上机准备熟悉高级语言用法,如C语言。
熟悉机器(即操作系统),基本的常用命令。
静态检查主要有两条路径,一是用一组测试数据手工执行程序(或分模块进行);二是通过阅读或给别人讲解自己的程序而深入全面地理解程序逻辑,在这个过程中再加入一些注释和断言。
如果程序中逻辑概念清楚,后者将比前者有效。
4.上机调试程序调试最好分块进行,自底向上,即先调试底层函数,必要时可以另写一个调用驱动程序,表面上的麻烦工作可以大大降低调试时所面临的复杂性,提高工作效率。
实验报告:图的存储结构和遍历
int queue[6],front=0,rear=0;
int visited[6];
int w,i;
for(i=0;i<G->n;i++)
visited[i]=0;
printf("%d ",v);
visited[v]=1;
rear=(rea叶1)%6;
queue[rear]=v;
ArcNode *p;
for(i=0;i<G->n;i++)
{ p=G->adjlist[i].firstarc; printf("%d:",i);
while (p!=NULL)
{ printf("%d ",p->adjvex); p=p_>nextarc;
}
printf("\n");
}
}
void dfs (ALGraph *G,int v)
{ p=(ArcNode*)malloc(sizeof(ArcNode)); p->adjvex=j;
p->nextarc=G->adjlist[i].firstarc;
G->adjlist[i].firstarc=p;
}
G->n=g.n;
}
void dispadj(ALGraph *G)
{ int i;
printf("\n");
}
printf("邻接矩阵\n");
G=(ALGraph*)malloc(sizeof(ALGraph));
mattolist(g,G);
《数据结构》课程教学大纲
课程教学大纲课程代号:07021021学时数:56+S16适用专业:计算机科学与技术专业一、本课程的性质、目的和任务1。
本课程的性质数据结构是高等院校计算机各专业的核心课程之一,也是重要的专业基础课,主要介绍和研究各种基本的数据结构及其应用.2。
本课程的目的通过本课程的学习,使学生获得有关数据的各种逻辑结构、在存储器上的存储结构以及相关运算的算法:并能够根据实际问题的需要选择和设计出相应运算的算法。
为《操作系统》、《数据库概论》等后续课程的学习及为应用软件特别是非数值应用软件的开发打下良好的基础和时间基础。
3.本课程的任务本课程的主要任务是培养学生:(1)熟练掌握各种数据结构的特点、存储表示,操作算法及在计算机科学中基本应用。
(2)初步掌握算法的时间分析和空间分析的技巧。
(3)培养、训练学生选用合格的数据结构和使用类C语言编写质量高、风格好的应用程序及初步评价算法程序的能力.二、教学基本内容和要求1。
绪论(1)教学目的与要求熟悉数据结构的一些基本概念;了解抽象数据类型的定义、表示和实现方法;掌握C++语言的语句及算法描述的书写规则;掌握计算语句频度和估算算法时间复杂度的方法。
(2)主要内容数据、数据元素、数据对象、数据类型、数据结构等概念;抽象数据类型的定义、表示和实现方法;描述算法的C++语言;算法设计的基本要求以及从时间和空间角度分析算法的方法。
(3)重点、难点重点:算法的时间和空间复杂性的评价;难点:算法效率的度量。
2.线性表(1)教学目的与要求掌握线性表的定义和顺序存储结构;掌握线性表的链式存储结构;掌握线性表的插入、删除、归并等基本运算;了解静态链表和一元多项式的有关知识。
(2)主要内容线性表的顺序存储结构、线性表的链式存储结构;在线性表的两类存储结构(顺序的和链式的)上实现基本操作;静态链表的存储结构和运算;一元多项式的抽象数据类型定义、表示及加法的实现。
(3)重点、难点重点:线性表的链式存储结构;难点:静态链表的存储结构和运算。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
}
int main()
{
int i,j,n,m;
Graph *p;
p=(Graph *)malloc(sizeof(Graph));
printf("输入图的顶点数:");scanf("%d",&p->n);
printf("输入图的边数:"); scanf("%d",&p->e);
for(i=1;i<=p->n;i++)
邻接矩阵
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
int a[20][20];
int n;
int e;
}Graph;
int visit[20];
void DFS(Graph *p,int n)
{
int i;
printf("%4d",n);
visit[i]=0;
printf("BFS遍历:\n");
BFS(p,1);
printf("\n");
return 0;
}
邻接表
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int n;
struct node *next;
}Node;
a[x].a->next=p;
p=new Node;
p->n=x;
p->next=a[y].a->next;
a[y].a->next=p;
}
}
void DFS(int n)
{
Node *p;
visit[n]=1;
printf("%d ",n);
for(p=a[n].a->next;p;p=p->next)
for(j=1;j<=p->n;j++)
p->a[i][j]=0;
printf("输入图的每条边:\n");
for(i=1;i<=p->e;i++)
{
printf("%d: ",i);
scanf("%d%d",&n,&m);
p->a[n][m]=1;
p->a[m][n]=1;
}
for(i=1;i<=p->n;i++)
typedef struct
{
int m;
Node *a;
}PP;
PP a[30];
int n,e,visit[30];
void Create()
{
int i,x,y;
Node *p;
printf("输入图的顶点数和边数:");
scanf("%d%d",&n,&e);
for(i=1;i<=n;i++)
{
a[i].m=i;
a[i].a=new Node;
a[i].a->next=NULL;
}
printf("输入图的边数:\n");
for(i=1;i<=e;i++)
{
printf("%d: ",i);
scanf("%d%d",&x,&y);
p=new Node;
p->n=y;
p->next=a[x].a->next;
{
for(j=1;j<=p->n;j++)
printf("%4d",p->a[i][j]);
printf("\n");
}
for(i=1;i<=p->n;i++)
visit[i]=0;
printf("DFS遍历:\n");
DFS(p,1);
printf("\n");
for(i=1;i<=p->n;i++)
for(i=1;i<=n;i++) visit[i]=0; printf("广度有限搜索:"); BFS(1);printf("\n");
return 0;
}
/*8Biblioteka 111 21 82 7
2 6
7 4
4 6
4 3
3 6
3 5
8 5
6 8
*/
if(visit[p->n]==0)
DFS(p->n);
}
void BFS(int n)
{
int i;
int aa[20],top=0;
Node *p;
aa[++top]=n;
while(top)
{
p=a[aa[1]].a->next;
for(i=1;i<top;i++)
aa[i]=aa[i+1];
top--;
for(;p;p=p->next)
if(visit[p->n]==0)
{
printf("%d ",p->n);
visit[p->n]=1;
aa[++top]=p->n;
}
}
}
int main()
{
int i;
Node *p;
Create();
for(i=1;i<=n;i++) visit[i]=0; printf("深度优先搜索:"); DFS(1);printf("\n");
a[++top]=n;
while(top)
{
t=a[1];
for(i=1;i<top;i++)
a[i]=a[i+1];
top--;
for(i=1;i<=p->n;i++)
if(p->a[t][i]&&visit[i]==0)
{
printf("%4d",i);
visit[i]=1;
a[++top]=i;
visit[n]=1;
for(i=1;i<=p->n;i++)
if(i!=n&&visit[i]==0&&p->a[n][i])
DFS(p,i);
}
void BFS(Graph *p,int n)
{
int i,top=0,t;
int a[20];
printf("%4d",n);
visit[n]=1;