【学生版】实验六 图基本操作的编程实现

合集下载

实验六 图的基本操作

实验六 图的基本操作

南京信息工程大学实验(实习)报告图的基本操作一、实验目的1、熟悉图的存储结构2、掌握图的基本操作二、实验准备1、奔腾2计算机或以上机型2、Microsoft Visual C++ 6.0三、实验内容1、建立一张图2、实现深度优先搜索、广度优先搜索遍历四、实验代码#include<stdio.h>#include<conio.h>#include<stdlib.h>typedef struct ArcNode{int adjVex;struct ArcNode *nextArc;}ArcNode;typedef struct VNode{int data;ArcNode *firstArc;}VNode;//创建一张图void CreatGraphic();//深度优先搜索遍历void DFSTraverse(int searchNode);//广度优先搜索遍历void BFSTraverse(int searchNode);//访问标志置零void ClearVisited();void Bound(char ch, int num);//邻接表VNode *adjList;//访问标记数组short *visited;//循环队列, 用于广度优先搜索遍历函数中int *queue;//图的结点数int graphicNode;//用于判断是否创建了图bool creatGraphic;int main(void){char choice;int searchNode;creatGraphic = false;while (true){if (!creatGraphic){system("CLS");printf(" 图的操作\n");Bound('-', 15);printf(" 1. 创建一张图\n");printf(" 0. 退出程序\n");Bound('-', 15);printf(" 请选择: ");fflush(stdin);choice = getchar();switch (choice){case '1':CreatGraphic();break;case '0':printf("\n");system("PAUSE");return 0;default:printf("\n 输入错误, 按任意键后重新输入!");getch();break;}}else{system("CLS");printf(" 图的操作\n");Bound('-', 20);printf(" 1. 深度优先搜索遍历\n");printf(" 2. 广度优先搜索遍历\n");printf(" 0. 退出程序\n");Bound('-', 20);printf(" 请选择: ");fflush(stdin);choice = getchar();switch (choice){case '1':ClearVisited();Lable1:printf("\n 请输入起始搜索的结点序号: ");fflush(stdin);scanf("%d", &searchNode);if (searchNode>=1 && searchNode <=graphicNode){printf(" 深度优先搜索遍历为: ");DFSTraverse(searchNode);}else{printf(" 序号输入错误, 按任意键后重新输入! \n");getch();goto Lable1;}printf("\n\n");system("PAUSE");break;case '2':ClearVisited();Lable2:printf("\n 请输入起始搜索的结点序号: ");scanf("%d", &searchNode);if (searchNode>=1 && searchNode <=graphicNode){printf(" 广度优先搜索遍历为: ");BFSTraverse(searchNode);}else{printf(" 序号输入错误, 按任意键后重新输入! \n");getch();goto Lable2;}printf("\n\n");system("PAUSE");break;case '0':printf("\n");system("PAUSE");return 0;default:printf("\n 输入错误, 按任意键后重新输入!");getch();break;}}}}void CreatGraphic(){int number;int localNode, linkNode;ArcNode *tempNode;Flag:printf("\n 请输入图的顶点数: ");fflush(stdin);scanf("%d", &graphicNode);if (graphicNode <= 0){printf(" 输入错误, 按任意键后重新输入!\n");getch();goto Flag;}if ((adjList=(VNode *)malloc(sizeof(VNode)*graphicNode)) == NULL){printf(" 内存空间不足, 无法创建图!\n");system("PAUSE");exit(0);}if ((visited=(short *)malloc(sizeof(short)*graphicNode)) == NULL){printf(" 内存空间不足, 无法创建访问记录表!\n");system("PAUSE");exit(0);}if ((queue=(int *)malloc(sizeof(int)*graphicNode)) == NULL){printf(" 内存空间不足, 无法创建队列!\n");system("PAUSE");exit(0);}for (number=0; number<graphicNode; ++number){adjList[number].data = number + 1;adjList[number].firstArc = NULL;}printf("\n 请输入所要创建的图中所有相关联的顶点, 格式( 图中一顶点与此顶点相关联的顶点)\n");do{printf(" 请输入( 注意: 输入0 0 结束输入): ");fflush(stdin);scanf("%d %d", &localNode, &linkNode);if (localNode>=1 && localNode<=graphicNode && linkNode>=1 && linkNode<=graphicNode){if ((tempNode = (ArcNode *)malloc(sizeof(ArcNode))) == NULL){printf(" 内存不足, 无法创建图!\n");exit(0);}tempNode->adjVex = linkNode;tempNode->nextArc = adjList[localNode - 1].firstArc;adjList[localNode - 1].firstArc = tempNode;}else{creatGraphic = true;return;}}while(true);}void DFSTraverse(int searchNode){ArcNode *tempNode;visited[searchNode - 1] = 1;printf("%d ", searchNode);tempNode = adjList[searchNode - 1].firstArc;while (tempNode != NULL){if (visited[tempNode->adjVex - 1] == 0){DFSTraverse(tempNode->adjVex);}tempNode = tempNode->nextArc;}}void BFSTraverse(int searchNode){ArcNode *tempNode;int nodeNum;int front = 0, rear = 0;printf("%d ", searchNode);visited[searchNode - 1] = 1;rear = (rear + 1) % graphicNode;queue[rear] = searchNode;while (front != rear){front = (front + 1) % graphicNode;nodeNum = queue[front];tempNode = adjList[nodeNum - 1].firstArc;while (tempNode != NULL){if (visited[tempNode->adjVex - 1] == 0){visited[tempNode->adjVex - 1] = 1;printf("%d ", tempNode->adjVex);rear = (rear + 1) % graphicNode;queue[rear] = tempNode->adjVex;}tempNode = tempNode->nextArc;}}}void ClearVisited(){int cnt;for (cnt=0; cnt<graphicNode; ++cnt){visited[cnt] = 0;}}void Bound(char ch, int num){while (num--){putchar(ch);}putchar('\n');}(本次实验中所用图示意图)(图1:按格式创建图)1876 5 4 3 2(图2:深度优先搜索遍历)(图3:广度优先搜索遍历)五、实验总结…。

图的基本操作 实验报告

图的基本操作 实验报告

图的基本操作实验报告图的基本操作实验报告引言:图是一种常见的数据结构,广泛应用于计算机科学和其他领域。

本实验报告旨在介绍图的基本操作,包括创建图、添加节点和边、遍历图等,并通过实验验证这些操作的正确性和效率。

实验目的:1. 了解图的基本概念和术语;2. 掌握图的创建和修改操作;3. 熟悉图的遍历算法;4. 分析图的操作的时间复杂度。

实验过程:1. 创建图首先,我们需要创建一个图对象。

图可以用邻接矩阵或邻接表来表示。

在本实验中,我们选择使用邻接表来表示图。

通过遍历输入的节点和边信息,我们可以创建一个包含所有节点和边的图。

2. 添加节点和边在创建图对象后,我们可以通过添加节点和边来构建图的结构。

通过输入节点的标识符和边的起始和结束节点,我们可以在图中添加新的节点和边。

添加节点和边的操作可以通过修改邻接表来实现,将节点和边的信息存储在对应的链表中。

3. 遍历图遍历图是图操作中常用的操作之一。

通过遍历图,我们可以访问图中的所有节点和边。

在本实验中,我们选择使用深度优先搜索(DFS)算法来遍历图。

DFS算法通过递归的方式遍历图中的节点,先访问当前节点,然后再递归地访问与当前节点相邻的节点。

4. 分析时间复杂度在实验过程中,我们记录了图的操作所花费的时间,并分析了它们的时间复杂度。

通过对比不同规模的图的操作时间,我们可以评估图操作的效率和可扩展性。

实验结果:通过实验,我们成功创建了一个图对象,并添加了多个节点和边。

我们还通过DFS算法遍历了图,并记录了遍历的顺序。

实验结果表明,我们的图操作实现正确,并且在不同规模的图上都能够高效地工作。

讨论与结论:本实验报告介绍了图的基本操作,并通过实验验证了这些操作的正确性和效率。

通过实验,我们了解到图是一种重要的数据结构,可以用于解决许多实际问题。

同时,我们还深入分析了图操作的时间复杂度,为后续的图算法设计和优化提供了参考。

总结:通过本次实验,我们对图的基本操作有了更深入的了解。

(完整版)数据库技术与应用实验报告

(完整版)数据库技术与应用实验报告

(完整版)数据库技术与应用实验报告《数据库技术与应用》实验报告班级学号:姓名:实验日期:指导老师:实验名称一、实验一表的建立与维护实验目的与要求 1.初步掌握根据一个应用目标把现实问题抽象为关系数据模型的方法,从而为解决实际问题奠定数据基础。

2.掌握表的建立与维护的一般方法。

3.理解表的记录指针与当前记录的意义。

4.掌握表的打开、关闭、浏览、显示等操作方法。

5.掌握表结构的修改。

6.掌握记录的增加与删除等操作。

7.掌握数据复制方法。

8.二、实验准备 1、复习关系数据库的有关概念,深刻理解Virsual FoxPro中所采用的关系模型的实质及Virsual FoxPro所支持的数据模型。

2、复习表的建立、现实与维护等操作。

三、实验内容下表是某校学生花名册,根据该表完成以下操作,写出操作步骤。

学习成绩性学号姓名别学 009901 张小强男 98 85 否 20XX年获全数外语出生年月否少数民族受奖情况国数学奥林匹克竞赛二等奖。

009902 009903 009904 009905 陈斌李哲男男 88 56 75 88 75 82 72 81 否是否是20XX年获全国中学生田径运动会100米第三名009906 009907 009908 009909 张青松男封小莉女周晓钱倩女女 65 82 65 83 81 73 78 85 否否20XX年获广东省三好学生称号 009910 009911 孙力军男肖彬彬女 64 55 68 95 是否赵大明男冯珊女否否1.设计一个表的结构,使其能描述上表的信息,同时又符合关系模型的基本要求。

2.建立表,输入表中的数据,并将保存在自己盘中。

3.给全部女生的数学成绩加5分。

4.将记录指针定位到第5号记录。

5.将记录指针指向孙力军同学。

6.显示所有姓“张”学生的情况。

7.把表的姓名字段宽度修改为8。

8.浏览记录数据,且表头用汉字。

9.把少数民族学生的记录复制到中。

实验六 图的应用及其实现

实验六   图的应用及其实现

实验六图的应用及其实现一、实验目的1.进一步功固图常用的存储结构。

2.熟练掌握在图的邻接表实现图的基本操作。

3.理解掌握AOV网、AOE网在邻接表上的实现以及解决简单的应用问题。

二、实验内容从键盘上输入AOV网的顶点和有向边的信息,建立其邻接表存储结构,然后对该图拓扑排序,并输出拓扑序列. 试设计程序实现上述AOV网的类型定义和基本操作,完成上述功能。

相关常量及结构定义:typedef int InfoType;typedef char VertexType;typedef int SElemType;#define STACK_INIT_SIZE 100 //存储空间初始分配量#define STAXKINCREMENT 10 //存储空间分配增量#define MAX_VERTEX_NUM 20typedef struct ArcNode{int adjvex;struct ArcNode *nextarc;InfoType *info;}ArcNode;typedef struct VNode{VertexType data;struct ArcNode *firstarc;}VNode,AdjList[MAX_VERTEX_NUM];typedef struct ALGraph{AdjList vertices;int vexnum, arcnum;int kind;}ALGraph;typedef struct{SElemType *base;SElemType *top;int stacksize;}SqStack;设计相关函数声明:int CreateDG(ALGraph &G)int InitStack(SqStack &S)int Push(SqStack &S,SElemType e)int Pop(SqStack &S,SElemType &e)int StackEmpty(SqStack S)void FindInDegree(ALGraph G,int *indegree)int TopologicalSort(ALGraph G)三、数据结构与核心算法的设计描述1.创建AOV网int CreateDG(ALGraph &G){int i,j,k,v1,v2;cout<<"请输入该图的顶点数:"<<"请输入该图的边数:"<<endl;cin>>G.vexnum>>G.arcnum;for(i=0;i<G.vexnum;i++){G.vertices[i].data=i;G.vertices[i].firstarc=NULL;}cout<<"请输入一条边的始点和终点:"<<endl;for(k=0;k<G.arcnum;++k){cout<<"请输入第 "<<k+1<<"条边的始点和终点: ";cin>>v1>>v2;i=v1; j=v2;while(i<1||i>G.vexnum||j<1||j>G.vexnum){cout<<"请输入第 "<<k+1<<"条边的始点和终点: ";cin>>v1>>v2;i=v1; j=v2;}i--;j--;ArcNode *p;p=(ArcNode *)malloc(sizeof(ArcNode));if(!p) return -1;p->adjvex=j;p->nextarc=G.vertices[i].firstarc;p->info=NULL; G.vertices[i].firstarc=p;G.vertices[i];}return 0;}2.初始化栈int InitStack(SqStack &S){S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType ));if(!S.base) exit (-1);S.top=S.base;S.stacksize=STACK_INIT_SIZE;return 0;}3.入栈int Push(SqStack &S,SElemType e){if(S.top-S.base>=S.stacksize){S.base=(SElemType*)realloc(S.base,(S.stacksize+STAXKINCREMENT)*sizeof(SElemType));if(!S.base) exit (-1);S.top=S.base+S.stacksize;S.stacksize+=STAXKINCREMENT;}*S.top++=e;return 0;}4.出栈精选文库int Pop(SqStack &S,SElemType &e){if(S.top==S.base) return -1;e=*--S.top;return 0;}5.判断栈是否为空int StackEmpty(SqStack S){if(S.top==S.base) return -1;else return 0;}6.个顶点入度void FindInDegree(ALGraph G,int *indegree){int i;for(i=0;i<G.vexnum;i++)indegree[i]=0;for(i=0;i<G.vexnum;i++)while(G.vertices[i].firstarc){indegree[G.vertices[i].firstarc->adjvex]++;G.vertices[i].firstarc=G.vertices[i].firstarc->nextarc;}}7.拓扑排序int TopologicalSort(ALGraph G){int i,k,indegree[MAX_VERTEX_NUM];ArcNode *p;SqStack S;FindInDegree(G,indegree);InitStack(S);for(i=0;i<G.vexnum;i++)if(!indegree[i]) Push(S,i);int count=0;while(!StackEmpty(S)){Pop(S,i);cout<<i+1<<'\t'; ++count;for(p=G.vertices[i].firstarc; p; p=p->nextarc){k=p->adjvex;if(!(--indegree[k])) Push(S,k);}}if(count<G.vexnum) return -1;else return 0;}四、函数的调用主函数主要设计:int main(){ALGraph G;CreateDG(G);TopologicalSort(G);return 0;}五、实验总结本次试验通过对有向图进行拓扑排序,我了解了有向图邻接表的存储结构更重要的的是学会了对有向图的拓扑排序算法,其中也将之前学过的栈结合起来,巧妙的找到了一个拓扑序列,可不足的是,该算法只能找到这一条拓扑序列,但是我相信通过完成了这次试验后我会改进算法而能将图的所有的拓扑序列找出来。

实验九:图的基本操作

实验九:图的基本操作

cout<<q.table[i]<<" "; i=(i+1) % q.size; } cout<<endl; return out; } struct EdgeNode1 // 带权值的边 { int init; // 边的起点 int end; // 边的终点 int weight; // 边的权值 }; class Graph1 //邻接矩阵图类 { private: int visited[MaxSize]; // 访问标记数组 void unvisited(); // 设置未访问标记 void depthfs(int k); // 从结点 k 开始的深度优先遍历 void breadthfs(int k); // 从结点 k 开始的广度优先遍历 public: char vertex[MaxSize]; // 图的结点集,MaxSize 为最大结点数 int mat[MaxSize][MaxSize]; //图的邻接矩阵 int vertCount; // 图的结点数 int edgeCount; // 图的边数 Graph1(); //初始化图的结点集和邻接矩阵 ~Graph1(){} // 析构函数为空 void createGraph(int n,char vert[],int m,EdgeNode1 edge[]); friend ostream& operator<<(ostream& out,Graph1 &g1); void depthFirstSearch(); //图的深度优先遍历 void breadthFirstSearch(); //图的广度优先遍历 void insertVertex(char vert); // 插入结点 void insertEdge(EdgeNode1 e); // 插入边 void insertEdge(int init,int end,int w); void removeVertex(char vert); // 删除结点 void removeEdge(EdgeNode1 e); // 删除边 void removeEdge(int init,int end); //删除边 }; Graph1::Graph1() // 初始化图的结点集和邻接矩阵 { int i,j; for(i=0;i<MaxSize;i++) // 初始化图的结点集 vertex[i]=' '; for(i=0;i<MaxSize;i++) // 初始化图的邻接矩阵 for(j=0;j<MaxSize;j++) if(i==j) mat[i][j]=0; //数据元素权值为 0 else mat[i][j]=MaxWeight; //权值为无穷大 vertCount=0; // 当前结点数为 0 edgeCount=0; // 当前边数为 0 } void Graph1::createGraph(int n,char vert[],int m,EdgeNode1 edge[]) { // 以结点集和边集构造一个图 vertCount=n; // 图的结点个数 int i,j,k; for(i=0;i<n;i++) // 初始结点加入结点集 vertex[i]=vert[i]; edgeCount=m; // 图的边数

实验六图基本操作的编程实现

实验六图基本操作的编程实现

实验六图基本操作的编程实现【实验目的】图基本操作的编程实现要求:图基本操作的编程实现(2学时,验证型),掌握图的建立、遍历、插入、删除等基本操作的编程实现,存储结构可以在顺序结构、链接结构、联合使用多种结构等中任选,也可以全部实现。

也鼓励学生利用基本操作进行一些应用的程序设计。

【实验性质】验证性实验(学时数:2H)【实验内容】编程对图进行存储(邻接矩阵或邻接表都可以,由学生自由选择),之后可以询问任何两个结点之间是否有通路和路径数。

设计一个将图形转成邻接链表的程序。

设计一个深度优先搜索法来查找图形的程序。

设计一个广度优先搜索法来查找一个图形的程序。

鼓励开发出难度更高的程序。

【思考问题】1、图的定义和特性?2、图的主要存储结构是什么?是独立的某种还是多种数据结构的综合?3、图的主要遍历思路是哪些?4、举出图的应用范例?【参考代码】(一)将一个将图转成邻接矩阵的程序、/*程序构思:*//*用户输入结点与各个边,再将边转成邻接矩阵。

*/#include<stdio、h>#define Max6 /* 定义最大可输入的结点个数 */int Graph[Max][Max]; /*图形邻接数组*//*===============================================*//*输出邻接矩阵数据===============================*//*====================== =========================*/void print_M_Graph(){ int i,j; printf("Vertice"); for (i=0;i<Max;i++)printf("%3d",i); printf("\n"); for(i=0;i<Max;i++){ printf("%4d ",i); for (j=0;j<Max;j++)printf("%3d" );printf("\n"); }}/*======================================= ========*//*以邻接矩阵建立图形=============================*//*======================== =======================*/void Create_M_Graph(int Verticel,int Vertice2){ Graph[Verticel][Vertice2]=1; /* 将矩阵内容设为1*/ }/*===============================================*//*主程序=========================================*//*===============================================*/void main(){ int Source; /*起始顶点*/ int Destination; /*终止顶点*/ int i,j; for (i=0;i<Max;i++)for (j=0;j<Max;j++)Graph[i][i]=0; while(1){ printf("please input the Edge's source:");scanf("%d",&Source); if(Source ==-1)break; printf("Please input the Edge's Destination:"); scanf("%d",&Destination); if(Source==Destination) /* 出错:自身循环*/ printf("***Error***:Self Loop!! \n"); else if (Source >= Max || Destination >= Max)/* 出错:超出范围*/ printf ("***Error***:out of range!! \n"); else /*调用建立邻接数组 */ Create_M_Graph(Source,Destination); }printf("##Graph##\n"); ; /*调用输出邻接数组数据*/}/*希望的结果 *//*please input the Edge's source:0 *//*Please input the Edge's Destination:4 *//*please input the Edge's source:1 *//*Please input the Edge's Destination:0 *//*please input the Edge's source:1*//*Please input the Edge's Destination:4 *//*please input the Edge's source:2 *//*Please input the Edge'sDestination:1 *//*please input the Edge's source:3*//*Please input the Edge's Destination:2 *//*please input the Edge's source:4 *//*Please input the Edge's Destination:3 *//*please input the Edge's source:-1*//*##Graph## *//*Vertice 012345 *//* 0 0 0 0 01 0 *//*11 0 0 01 0 */ /*2 01 0 0 0 0 */ /*3 0 01 0 0 0 */ /*4 0 0 01 0 0 */ /*5 0 0 0 0 0 0 */(二)将一个将图转成邻接表的程序、/*程序构思:*//*用户输入结点与各个边,再将边转成邻接链表。

C语言实验学生版(最新版)

C语言实验学生版(最新版)

实验一:简单的C程序设计(2学时)一、实验方式:一人一机二、实验目的:1、了解C语言程序的编译环境和编写过程。

2、掌握C语言程序在Visual C++ 6.0环境下的调试过程。

3、初步了解C语言程序的特点。

4、掌握C语言的数据类型。

三、实验内容:1、计算两个数x和y的和。

(教材P5【例1-2】)2、从键盘输入华氏温度h,输出摄氏温度c(摄氏温度=5/9*(华氏温度-32))。

(实验教材P18)3、给定圆环,输入内圆环半径r1、外圆环半径r2,求出圆环的面积。

(实验教材P27)4、从键盘上输入两个整数x、y,实现两个数的交换,并求出最大值、最小值和两个数的平均值。

(实验教材P21)5、输入并运行以下程序,分析运行结果。

(实验教材P27)#include <stdio.h>void main( ){int i,j;i=8; j=10;printf(“%d,%d\n”,++i,++j);i=8; j=10;printf(“%d,%d\n”,i++,j++);i=8; j=10;printf(“%d,%d\n”,++i,i);i=8; j=10;printf(“%d,%d\n”,i++,i);}四、实验程序代码:五、实验运行结果(截图):实验二:顺序结构程序设计(2学时)一、实验方式:一人一机二、实验目的:1、掌握标识符、常量、变量的定义及使用。

2、掌握C语言的常用运算符及表达式。

3、掌握单分支if语句的使用方法。

4、掌握双分支if-else语句的使用方法。

三、实验内容:1、从键盘输入一个3位整数,请输出该数的逆序数。

(实验教材P27)2、输入3个字符型数据,将其转换成相应的整数后,求它们的平均值并输出。

(实验教材P27)3、判断箱子是正方体还是长方体。

(实验教材P33)4、有一函数: x (x<1)y= 2x-1 (1≤x<10)3x-11 (x≥10) 编写程序,输入x值,输出y值。

【学生版】实验六 图基本操作的编程实现

【学生版】实验六  图基本操作的编程实现

实验六图基本操作的编程实现【实验目的】图基本操作的编程实现要求:图基本操作的编程实现(2学时,验证型),掌握图的建立、遍历、插入、删除等基本操作的编程实现,存储结构可以在顺序结构、链接结构、联合使用多种结构等中任选,也可以全部实现。

也鼓励学生利用基本操作进行一些应用的程序设计。

【实验性质】验证性实验(学时数:2H)【实验内容】编程对图进行存储(邻接矩阵或邻接表都可以,由学生自由选择),之后可以询问任何两个结点之间是否有通路和路径数。

设计一个将图形转成邻接链表的程序。

设计一个深度优先搜索法来查找图形的程序。

设计一个广度优先搜索法来查找一个图形的程序。

鼓励开发出难度更高的程序。

【思考问题】1.图的定义和特性?2.图的主要存储结构是什么?是独立的某种还是多种数据结构的综合?3.图的主要遍历思路是哪些?4.举出图的应用范例?【参考代码】(一)基础篇//将一个图采用邻接表存储,并在该存储方法上进行深度优先遍历.//程序构思://用户键盘输入结点与各条边,再将边转成邻接链表。

//然后对采用邻接表表示的图进行深度优先遍历。

#include<stdio.h>#include <stdlib.h>#define vertexnum 100 //定义最大可输入的结点个数typedef struct node //定义图形的顶点结构{int vertex; //图中的顶点信息为数字struct node *next;}Graph;Graph head[vertexnum]; //邻接表的表头结点int Visited[vertexnum]; //遍历记录void Create_l_Graph(int Vertex1,int Vertex2,int no){ //以邻接链表建立图形Graph *searchP; //结点声明Graph *New; //新结点声明New=(Graph *)malloc(sizeof(struct node));if (New!= NULL ){New->vertex=Vertex2;New->next=NULL;searchP=&(head[Vertex1]);while(searchP->next!=NULL)searchP=searchP->next;searchP->next =New;if(no==0){New=(Graph *)malloc(sizeof(struct node));New->vertex=Vertex1;New->next=NULL;searchP=&(head[Vertex2]);while(searchP->next!=NULL)searchP=searchP->next;searchP->next =New;}}}void showmenu(){ //显示菜单printf(" 欢迎使用图的操作演示软件\n");printf("\t1、创建图的邻接表\n");printf("\t2、图的输出\n");printf("\t3、图的深度优先遍历\n");printf("\t4、退出程序\n");}void print_l_graph(Graph *head){ //输出邻接链表的数据Graph *searchP;searchP=head->next;while(searchP!=NULL){}printf("\n");}void DFS(int vertex){ //深度优先遍历Graph *SearchP; //结点声明//标记某个结点已遍历过printf("[%d]==>",vertex);SearchP=head[vertex].next;while(SearchP!=NULL){if( ) //判断结点未被遍历过//递归调用深度优先遍历函数 SearchP=SearchP->next; //下一个邻接点}}void main(){int source; //图中一条边的起始顶点int destination; //图中一条边的终止顶点int i,j;int vermax; //定义图中最大的顶点数int edgemax; //定义图中最大的边数int choice;int no;while(1){showmenu();printf(" 请输入你的选择:");scanf("%d",&choice);fflush(stdin);//清除键盘缓冲区switch(choice){case 1:printf("请输入图的类别(有向图-1,无向图-0):");scanf("%d",&no);printf("请输入图中的总顶点数和边数:");scanf("%d%d",&vermax,&edgemax);for(i=1;i<vermax;i++){head[i].vertex = i;head[i].next = NULL;}for(i=1;i<=edgemax;i++){printf("请输入第%d条边的起点:",i);scanf("%d",&source);printf("请输入第%d条边的终点:",i);scanf("%d",&destination);if(source==destination)printf("输入有误!\n");//出错:自身循环else //调用建立邻接链表 Create_l_Graph(source,destination,no);}printf("图创建成功,按任意键继续…\n");getch();system("cls");break;case 2:printf("图的邻接表如下:\n");for(i=1;i<=vermax;i++){printf("顶点[%d]:",i);print_l_graph(&head[i]);//调用输出邻接链表数据}printf("\n");system("pause");system("cls");break;case 3:for(i=1;i<=vermax;i++)Visited[i]=0;printf("请输入遍历的起点:");scanf("%d",&source);printf("图的深度优先遍历结果为:\n");DFS(source);printf("END\n");system("pause");system("cls");break;case 4:return;default:printf("你的输入有误,请从新输入!\n");system("pause");system("cls");}}}(二)提高篇//将一个图采用邻接表存储,并在该存储方法上进行深度优先遍历..//程序构思://用户键盘输入结点与各个边,再将边转成邻接链表。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验六图基本操作的编程实现【实验目的】图基本操作的编程实现要求:图基本操作的编程实现(2学时,验证型),掌握图的建立、遍历、插入、删除等基本操作的编程实现,存储结构可以在顺序结构、链接结构、联合使用多种结构等中任选,也可以全部实现。

也鼓励学生利用基本操作进行一些应用的程序设计。

【实验性质】验证性实验(学时数:2H)【实验内容】编程对图进行存储(邻接矩阵或邻接表都可以,由学生自由选择),之后可以询问任何两个结点之间是否有通路和路径数。

设计一个将图形转成邻接链表的程序。

设计一个深度优先搜索法来查找图形的程序。

设计一个广度优先搜索法来查找一个图形的程序。

鼓励开发出难度更高的程序。

【思考问题】1.图的定义和特性?2.图的主要存储结构是什么?是独立的某种还是多种数据结构的综合?3.图的主要遍历思路是哪些?4.举出图的应用范例?【参考代码】(一)基础篇//将一个图采用邻接表存储,并在该存储方法上进行深度优先遍历.//程序构思://用户键盘输入结点与各条边,再将边转成邻接链表。

//然后对采用邻接表表示的图进行深度优先遍历。

#include<stdio.h>#include <stdlib.h>#define vertexnum 100 //定义最大可输入的结点个数typedef struct node //定义图形的顶点结构{int vertex; //图中的顶点信息为数字struct node *next;}Graph;Graph head[vertexnum]; //邻接表的表头结点int Visited[vertexnum]; //遍历记录void Create_l_Graph(int Vertex1,int Vertex2,int no){ //以邻接链表建立图形Graph *searchP; //结点声明Graph *New; //新结点声明New=(Graph *)malloc(sizeof(struct node));if (New!= NULL ){New->vertex=Vertex2;New->next=NULL;searchP=&(head[Vertex1]);while(searchP->next!=NULL)searchP=searchP->next;searchP->next =New;if(no==0){New=(Graph *)malloc(sizeof(struct node));New->vertex=Vertex1;New->next=NULL;searchP=&(head[Vertex2]);while(searchP->next!=NULL)searchP=searchP->next;searchP->next =New;}}}void showmenu(){ //显示菜单printf(" 欢迎使用图的操作演示软件\n");printf("\t1、创建图的邻接表\n");printf("\t2、图的输出\n");printf("\t3、图的深度优先遍历\n");printf("\t4、退出程序\n");}void print_l_graph(Graph *head){ //输出邻接链表的数据Graph *searchP;searchP=head->next;while(searchP!=NULL){}printf("\n");}void DFS(int vertex){ //深度优先遍历Graph *SearchP; //结点声明//标记某个结点已遍历过printf("[%d]==>",vertex);SearchP=head[vertex].next;while(SearchP!=NULL){if( ) //判断结点未被遍历过//递归调用深度优先遍历函数 SearchP=SearchP->next; //下一个邻接点}}void main(){int source; //图中一条边的起始顶点int destination; //图中一条边的终止顶点int i,j;int vermax; //定义图中最大的顶点数int edgemax; //定义图中最大的边数int choice;int no;while(1){showmenu();printf(" 请输入你的选择:");scanf("%d",&choice);fflush(stdin);//清除键盘缓冲区switch(choice){case 1:printf("请输入图的类别(有向图-1,无向图-0):");scanf("%d",&no);printf("请输入图中的总顶点数和边数:");scanf("%d%d",&vermax,&edgemax);for(i=1;i<vermax;i++){head[i].vertex = i;head[i].next = NULL;}for(i=1;i<=edgemax;i++){printf("请输入第%d条边的起点:",i);scanf("%d",&source);printf("请输入第%d条边的终点:",i);scanf("%d",&destination);if(source==destination)printf("输入有误!\n");//出错:自身循环else //调用建立邻接链表 Create_l_Graph(source,destination,no);}printf("图创建成功,按任意键继续…\n");getch();system("cls");break;case 2:printf("图的邻接表如下:\n");for(i=1;i<=vermax;i++){printf("顶点[%d]:",i);print_l_graph(&head[i]);//调用输出邻接链表数据}printf("\n");system("pause");system("cls");break;case 3:for(i=1;i<=vermax;i++)Visited[i]=0;printf("请输入遍历的起点:");scanf("%d",&source);printf("图的深度优先遍历结果为:\n");DFS(source);printf("END\n");system("pause");system("cls");break;case 4:return;default:printf("你的输入有误,请从新输入!\n");system("pause");system("cls");}}}(二)提高篇//将一个图采用邻接表存储,并在该存储方法上进行深度优先遍历..//程序构思://用户键盘输入结点与各个边,再将边转成邻接链表。

//然后对采用邻接表表示的图进行广度优先遍历。

#include<stdio.h>#include <stdlib.h>#define vertexnum 100 //定义最大可输入的结点个数#define QueueMax 100typedef struct node //定义图形的顶点结构{int vertex; //图中的顶点信息为数字 struct node *next;}Graph;Graph head[vertexnum]; //邻接表的表头结点int Visited[vertexnum]; //遍历记录int Front=-1;int Rear=-1;int Queue[QueueMax];int Enqueue(int Vertex) //元素入队{if (Rear>=QueueMax) //队列已满return -1;else{Rear++; //队列尾端指针后移 Queue[Rear]=Vertex; //将值存入队列中return 1;}}int Dequeue() //元素出队{if (Front>=Rear) //队列已空return -1;else{Front++; //队头指针后移return Queue[Front];}}void BFS(int Vertex)//广度优先搜索{}void Create_l_Graph(int Vertex1,int Vertex2,int no) { //以邻接链表建立图形Graph *searchP; //结点声明Graph *New; //新结点声明New=(Graph *)malloc(sizeof(struct node));if (New!= NULL ){New->vertex=Vertex2;New->next=NULL;searchP=&(head[Vertex1]);while(searchP->next!=NULL)searchP=searchP->next;searchP->next =New;if(no==0){New=(Graph *)malloc(sizeof(struct node));New->vertex=Vertex1;New->next=NULL;searchP=&(head[Vertex2]);while(searchP->next!=NULL)searchP=searchP->next;searchP->next =New;}}}void showmenu(){ //显示菜单printf(" 欢迎使用图的操作演示软件\n");printf("\t1、创建图的邻接表\n");printf("\t2、图的输出\n");printf("\t3、图的广度优先遍历\n");printf("\t4、退出程序\n");}void print_l_graph(Graph *head){ //输出邻接链表的数据Graph *searchP;searchP=head->next;while(searchP!=NULL){printf("[%d]",searchP->vertex);searchP=searchP->next;}printf("\n");}void main(){int source; //图中一条边的起始顶点int destination; //图中一条边的终止顶点int i,j;int vermax; //定义图中最大的顶点数int edgemax; //定义图中最大的边数int choice;int no;while(1){showmenu();printf(" 请输入你的选择:");scanf("%d",&choice);fflush(stdin);//清除键盘缓冲区switch(choice){case 1:printf("请输入图的类别(有向图-1,无向图-0):");scanf("%d",&no);printf("请输入图中的总顶点数和边数:");scanf("%d%d",&vermax,&edgemax);for(i=1;i<vermax;i++){head[i].vertex = i;head[i].next = NULL;}for(i=1;i<=edgemax;i++){printf("请输入第%d条边的起点:",i);scanf("%d",&source);printf("请输入第%d条边的终点:",i);scanf("%d",&destination);if(source==destination)printf("输入有误!\n");//出错:自身循环else //调用建立邻接链表Create_l_Graph(source,destination,no);}printf("图创建成功,按任意键继续…\n");getch();system("cls");break;case 2:printf("图的邻接表如下:\n");for(i=1;i<=vermax;i++){printf("顶点[%d]:",i);print_l_graph(&head[i]);//调用输出邻接链表数据}printf("\n");system("pause");system("cls");break;case 3:for(i=1;i<=vermax;i++)Visited[i]=0;printf("请输入遍历的起点:");scanf("%d",&source);printf("图的广度优先遍历结果为:\n");BFS(source);printf("END\n");system("pause");system("cls");break;case 4:return;default:printf("你的输入有误,请从新输入!\n");system("pause");system("cls");}}}(三)挑战篇1、最短路径问题,利用迪杰思特拉算法求解一个带权图中某一结点到其它各个结点的最短路径。

相关文档
最新文档