1、实验六 图基本操作的编程实现【实验目的】图基本操作的编程实现要求:图基本操作的编程实现(2学时,验证型),掌握图的建立、遍历、插入、删除等基本操作的编程实现,存储结构可以在顺序结构、链接结构、联合使用多种结构等中任选,也可以全部实现。也鼓励学生利用基本操作进行一些应用的程序设计。【实验性质】验证性实验(学时数:2H)【实验内容】编程对图进行存储(邻接矩阵或邻接表都可以,由学生自由选择),之后可以询问任何两个结点之间是否有通路和路径数。设计一个将图形转成邻接链表的程序。设计一个深度优先搜索法来查找图形的程序。设计一个广度优先搜索法来查找一个图形的程序。鼓励开发出难度更高的程序。【思考问题】1.
2、图的定义和特性?2. 图的主要存储结构是什么?是独立的某种还是多种数据结构的综合?3. 图的主要遍历思路是哪些?4. 举出图的应用范例?【参考代码】(一)将一个将图转成邻接矩阵的程序/*程序构思:*/*用户输入结点与各个边,再将边转成邻接矩阵。*/#include#define Max 6 /* 定义最大可输入的结点个数 */int GraphMaxMax; /*图形邻接数组 */*=*/*输出邻接矩阵数据=*/*=*/void print_M_Graph()int i,j;printf(“Vertice“);for (i=0;i= Max | Destination = Max) /* 出错
3、:超出范围*/printf (“*Error*: out of range! n“);else /*调用建立邻接数组 */Create_M_Graph(Source,Destination);printf(“#Graph#n“); ; /*调用输出邻接数组数据*/*希望的结果 */*please input the Edges source:0 */*Please input the Edges Destination:4 */*please input the Edges source:1 */*Please input the Edges Destination:0 */*please i
4、nput the Edges source:1 */*Please input the Edges Destination:4 */*please input the Edges source:2 */*Please input the Edges Destination:1 */*please input the Edges source:3 */*Please input the Edges Destination:2 */*please input the Edges source:4 */*Please input the Edges Destination:3 */*please i
5、nput the Edges source:-1 */*#Graph# */*Vertice 0 1 2 3 4 5 */* 0 0 0 0 0 1 0 */ /* 1 1 0 0 0 1 0 */ /* 2 0 1 0 0 0 0 */ /* 3 0 0 1 0 0 0 */ /* 4 0 0 0 1 0 0 */ /* 5 0 0 0 0 0 0 */(二) 将一个将图转成邻接表的程序/*程序构思:*/*用户输入结点与各个边,再将边转成邻接链表。*/#include#include #define vertexnum 6 /* 定义最大可输入的结点个数 */typedef struct n
6、ode /*定义图形的顶点结构 */int vertex;struct node *next;Graph;Graph headvertexnum;/*=*/*以邻接链表建立图形=*/*=*/void Create_l_Graph(int Vertex1,int Vertex2)Graph *searchP; /* 结点声明 */Graph *New; /* 新结点声明 */New = (Graph *) malloc(sizeof(struct node);if (New!= NULL )New -vertex = ;New -next = NULL;searchP = while ( sea
7、rchP-next != NULL);searchP-next = New;/*=*/*输出邻接链表的数据=*/*=*/void print_l_graph(struct node *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;
8、for (i=0;i= vertexnum | Destination = vertexnum) /* 出错:超出范围*/printf (“*Error*: out of range! n“);else /*调用建立邻接链表 */Create_l_Graph(Source,Destination);printf(“#Graph#n“); for (i=0;i#define VertexNum 9 /*定义顶点数 */struct Node /*声明图形顶点结构*/int Vertex; /*邻接顶点数据*/struct Node *Next; /*下一个邻接顶点*/;typedef struc
9、t Node *Graph; /*定义图形结构*/struct Node HeadVertexNum; /*顶点数组*/int VisitedVertexNum; /*查找记录*/*=*/*深度优先搜索=*/*=*/void DFS(int Vertex)Graph SearchP; /*结点声明*/VisitedVertex=1; /*已查找*/printf(“%d=“,Vertex);SearchP=HeadVertex.Next;while (SearchP!=NULL)if (VisitedSearchP-Vertex=0); /*递归调用*/SearchP=SearchP-Next;
10、 /*下一个邻接点*/*=*/*建立邻接顶点至邻接列表内=*/*=*/void Create_L_Graph(int Vertex1, int Vertex2)Graph SearchP; /*结点声明*/Graph New; /*新顶点声明*/New=(Graph) malloc (sizeof(struct Node); /*配置内存*/if (New!=NULL) /*配置成功*/New-Vertex=Vertex2; /*邻近顶点*/New-Next=NULL; /*下一个邻接顶点指针*/*SearchP 指针设为顶点数组之首结点*/SearchP=while (SearchP-Nex
11、t!=NULL)SearchP=SearchP-Next; /*往下一个结点*/SearchP-Next=New; /*串连在链接尾端*/*=*/*输出邻接列表内数据=*/*=*/void Print_L_Graph(struct Node *Head)Graph SearchP; /*结点声明*/SearchP=Head-Next; /*SearchP 指针设为首结点*/ while (SearchP!=NULL) /*当结点为 NULL 结束循环*/printf(“%d“,SearchP-Vertex);SearchP=SearchP-Next; /*往下一个结点*/printf(“n“)
12、;/*=*/*主程序=*/*=*/void main()int i;int Node202=1,2,2,1,1,3,3,1,2,4,4,2,2,5,5,2,3,6,6,3,3,7,7,3,4,8,8,4,5,8,8,5,6,8,8,6,7,8,8,7;for (i=0;i“);DFS(1);printf(“ENDn“);/*希望的结果 */*#Graph# */*Vertex1:23 */*Vertex2:145 */*Vertex3:167 */*Vertex4:28 */*Vertex5:28 */*Vertex6:38 */*Vertex7:38 */*Vertex8:4567 */*D
13、etph-First-Search: */*BEGIN=1=2=4=8=5=6=3=7=END*/(四)图的广度优先遍历(搜索)。/*程序构思: */*查找顶点时,先将该顶点的邻接顶点皆存入队列中。 */*(关于队列的运用,之前的章节已有介绍,在此不再重复)*/*如果邻接顶点已存在放队列中或已查找,则不存入队列中,直到队列为空才结束查找工作。*/#include #define VertexNum 9 /*定义顶点数 */#define QueueMax 10struct Node /*声明图形顶点结构*/int Vertex; /*邻接顶点数据*/struct Node *Next; /*下
14、一个邻接顶点*/;typedef struct Node *Graph; /*定义图形结构*/struct Node HeadVertexNum; /*顶点数组*/int QueueQueueMax;int Front=-1;int Rear=-1;int VisitedVertexNum; /*查找记录*/*=*/*队列的存入=*/*=*/int Enqueue(int Vertex)if (Rear=QueueMax) /*队列已满*/return -1;elseRear+; /*队列尾端指针后移*/QueueRear=Vertex; /*将值存入队列中 */return 1;/*=*/*
15、队列的取出=*/*=*/int Dequeue()if (Front=Rear) /*队列已空*/return -1;elseFront+; /*队头指针后移*/return QueueFront;/*=*/*广度优先搜索=*/*=*/void BFS(int Vertex)Graph SearchP; /*结点声明*/Enqueue(Vertex); /*存入队列中*/VisitedVertex= ; /*已查找*/printf(“%d=“,Vertex);while (Front!=Rear) /*队列为空时,结束循环*/Vertex=Dequeue();SearchP=HeadVerte
16、x.Next;while (SearchP!=NULL) /*读入邻接列表所有顶点*/if (VisitedSearchP-Vertex=0)Enqueue(SearchP-Vertex); /*存入队列中*/VisitedSearchP-Vertex=1; /*已查找过的顶点*/printf(“%d=“,SearchP-Vertex);SearchP=SearchP-Next; /*下一个邻接点*/*=*/*建立邻接顶点至邻接列表内=*/*=*/void Create_L_Graph(int Vertex1, int Vertex2)Graph SearchP; /*结点声明*/Graph
17、New; /*新顶点声明*/New=(Graph) malloc (sizeof(struct Node); /*配置内存*/if (New!=NULL) /*配置成功*/New-Vertex=Vertex2; /*邻近顶点*/New-Next=NULL; /*下一个邻接顶点指针*/*SearchP 指针设为顶点数组之首结点*/SearchP=while (SearchP-Next!=NULL); /*往下一个结点*/SearchP-Next=New; /*串连在链接尾端*/*=*/*输出邻接列表内数据=*/*=*/void Print_L_Graph(struct Node *Head)Gr
18、aph SearchP; /*结点声明*/SearchP=Head-Next; /*SearchP 指针设为首结点*/ while (SearchP!=NULL) /*当结点为 NULL 结束循环*/printf(“%d“,SearchP-Vertex);SearchP=SearchP-Next; /*往下一个结点*/printf(“n“);/*=*/*主程序=*/*=*/void main()int i;int Node202=1,2,2,1,1,3,3,1,2,4,4,2,2,5,5,2,3,6,6,3,3,7,7,3,4,8,8,4,5,8,8,5,6,8,8,6,7,8,8,7;for (i=0;i“);BFS(4);printf(“ENDn“);/*希望的结果 */*#Graph# */*Vertex1:23 */*Vertex2:145 */*Vertex3:167 */*Vertex4:28 */*Vertex5:28 */*Vertex6:38 */*Vertex7:38 */*Vertex8:4567 */*Bradph-First-Search: */*BEGIN=4=2=8=1=5=6=7=3=END*/【实验小结】 (总结本次实验的重难点及心得、体会、收获)得 分_评阅日期_教师签名_ _