数据结构实验 图的操作实现

一、实验目的

1、 理解图的存储结构与基本操作;

2、 掌握图的创建过程

二、实验内容

1.根据下图,采用邻接矩阵的存储结构保存此图,并打印出邻接矩阵。

图的创建代码参考教材.

提示:首先根据给出的图结构得出该图的顶点集和边集,调用相应的函数生成图的邻接矩阵,并打印出邻接矩阵

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct{char list[100];int size;}SequenceList;int ListInitiate(SequenceList *L){L->size = 0;}int ListInsert(SequenceList *L,int i, char x){int j;if(L->size >= 100){printf("顺序表已满\n");return 0;}else if (i<0 || i>L->size){printf("不合法");return 0;}else{for(j=L->size;j>i;j--)L->list[j]=L->list[j-1];L->list[i]=x;L->size ++;return 1;}}int ListLength(SequenceList L){return L.size;}typedef struct{SequenceList Vertices;int edge[100][100];int numOfEdges;int numVertexes; }MatrixGraph;void Initiate(MatrixGraph *G,int n){int i,j;for(i=0;i<n;i++){for(j=0;j<n;j++){G->edge[i][j]=0;}}G->numOfEdges=0;ListInitiate(&G->Vertices) ;}void InsertVertex(MatrixGraph *G,int vertex){ListInsert(&G->Vertices,G->Vertices.size,vertex);G->numVertexes++;}void InsertEdge(MatrixGraph *G,int v1,int v2){if(v1<0||v1>=G->Vertices.size||v2<0||v2>=G->Vertices.size){printf("参数错误");exit(1);}G->edge[v1][v2]=1;G->edge[v2][v1]=1;G->numOfEdges++;}typedef struct{int row;int col;} rowcol;void CreatGraph(MatrixGraph *G,char V[],int n,rowcol E[],int e){int i,k;Initiate(G,n);for(i=0;i<n;i++) InsertVertex(G,V[i]);for(k=0;k<e;k++) InsertEdge(G,E[k].row,E[k].col);}int main(void)
{MatrixGraph g1;char a[]={'1','2','3','4','5'};rowcol rc[]={{0,1},{0,2},{0,3},{0,4},{2,4},{1,3}};int n=5,e=6;int i,j;CreatGraph(&g1,a,n,rc,e);for(i=0;i<g1.Vertices.size;i++)printf("%c ",g1.Vertices.list[i]);printf("\n");printf("juzhengwei\n");for(i=0;i<g1.Vertices.size;i++){for(j=0;j<g1.Vertices.size;j++)printf("%5d ",g1.edge[i][j]);printf("\n");}return 0;
} 

2.根据上一题的邻接矩阵,编程实现该图的深度与广度优先遍历算法,从顶点1开始遍历,分别输出深度与广度优先遍历序列。

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct{char list[100];int size;}SequenceList;int ListInitiate(SequenceList *L){L->size = 0;}int ListInsert(SequenceList *L,int i, char x){int j;if(L->size >= 100){printf("顺序表已满\n");return 0;}else if (i<0 || i>L->size){printf("不合法");return 0;}else{for(j=L->size;j>i;j--)L->list[j]=L->list[j-1];L->list[i]=x;L->size ++;return 1;}}int ListLength(SequenceList L){return L.size;}typedef struct{SequenceList Vertices;int edge[100][100];int numOfEdges;int numVertexes; }MatrixGraph;void Initiate(MatrixGraph *G,int n){int i,j;for(i=0;i<n;i++){for(j=0;j<n;j++){G->edge[i][j]=0;}}G->numOfEdges=0;G->numVertexes=0; ListInitiate(&G->Vertices) ;}void InsertVertex(MatrixGraph *G,int vertex){ListInsert(&G->Vertices,G->Vertices.size,vertex);G->numVertexes++;}void InsertEdge(MatrixGraph *G,int v1,int v2){if(v1<0||v1>=G->Vertices.size||v2<0||v2>=G->Vertices.size){printf("参数错误");exit(1);}G->edge[v1][v2]=1;G->edge[v2][v1]=1;G->numOfEdges++;}typedef struct{int row;int col;} rowcol;void CreatGraph(MatrixGraph *G,char V[],int n,rowcol E[],int e){int i,k;Initiate(G,n);for(i=0;i<n;i++) InsertVertex(G,V[i]);for(k=0;k<e;k++) InsertEdge(G,E[k].row,E[k].col);}typedef struct QNode //结点结构
{int  data;struct QNode *next;
}QNode,*QueuePtr;typedef struct //队列的链表结构
{QueuePtr front,rear;//队头、队尾指针
}LinkQueue;//初始化队列:
int initQueue(LinkQueue *q)
{q->front = q->rear = (QueuePtr)malloc(sizeof(QNode));if(!q->front)return 0;q->front->next = NULL;return 1;
}//入队:插入元素e为q的新的队尾元素
int EnQueue(LinkQueue *q,int e)
{QueuePtr s = (QueuePtr)malloc(sizeof(QNode));if(!s)//存储分配失败return 0;s->data = e;s->next = NULL;q->rear->next = s;q->rear = s;return 1;
}//出队
//若队列不为空,删除q的队头元素,用e返回其值,并返回OK,否则返回ERROR
int DeQueue(LinkQueue *q,int *e)
{QueuePtr p;if(q->front==q->rear)return 0;p = q->front->next;*e = p->data;q->front->next = p->next;if(q->rear==p)//若队头是队尾,则删除后将rear指向头结点q->rear = q->front;free(p);return 1;
}//判断是否为空队列,若为空队列则返回1,否则返回0
int QueueEmpty(LinkQueue q)
{if(q.front == q.rear)return 1;return 0;
}int visited[100];//判断访问 void DFS(MatrixGraph G,int i)
{int j;visited[i] = 1;printf("%c ",G.Vertices.list[i]);for(j=0;j<G.numVertexes;j++)if(G.edge[i][j]==1 && !visited[j])DFS(G,j);//对未访问的邻接顶点递归调用
}//邻接矩阵的深度遍历算法
void DFSTraverse(MatrixGraph G)
{int i;for(i=0;i<G.numVertexes;i++)visited[i]=0;//初始所有顶点状态都是未被访问过for(i=0;i<G.numVertexes;i++)if(!visited[i])DFS(G,i);}//邻接矩阵的广度遍历算法
void BFSTraverse(MatrixGraph G)
{int i,j;LinkQueue Q;for(i=0;i<G.numVertexes;i++){visited[i] = 0;}initQueue(&Q);             for(i=0;i<G.numVertexes;i++){if(!visited[i])          {visited[i] = 1;   printf("%c ",G.Vertices.list[i]);EnQueue(&Q,i);       while(!QueueEmpty(Q))//若当前顶点不为空{DeQueue(&Q,&i);  //将队中元素出队列,赋值给ifor(j=0;j<G.numVertexes;j++){if(G.edge[i][j] ==1 && !visited[j]){visited[j] = 1;//将找到的此顶点标记为已访问printf("%c ",G.Vertices.list[j]);EnQueue(&Q,j);//将找到的此顶点入队列}}}}}
}int main(void)
{MatrixGraph g1;char a[]={'1','2','3','4','5'};rowcol rc[]={{0,1},{0,2},{0,3},{0,4},{2,4},{1,3}};int n=5,e=6;int i,j;CreatGraph(&g1,a,n,rc,e);for(i=0;i<g1.Vertices.size;i++)printf("%c ",g1.Vertices.list[i]);printf("\n");printf("DFS:");DFSTraverse(g1);printf("BFS:");BFSTraverse(g1);return 0;
} 

数据结构实验六 图的操作实现相关推荐

  1. 数据结构实验三 图的操作与实现

    系列文章: 数据结构实验一 线性表.堆栈和队列的操作与实现 数据结构实验二 二叉树的操作与实现 数据结构实验三 图的操作与实现 数据结构实验四 查找和排序算法实现 一.实验目的: 1.领会图的两种主要 ...

  2. 数据结构实验六 图的综合应用

    实验六  图的综合应用 一.实验目的 1.掌握图的基本操作-遍历: 2. 掌握图的应用. 二.实验内容 对给定的输入内容,完成实验任务 输入顶点集:1 2 3 4 5 6 7 8 输入边的集合: 1  ...

  3. 数据结构 实验六 图基本操作的编程实现

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

  4. 数据结构实验二 :二叉树的操作与实现

    数据结构实验一:线性表,堆栈和队列实现 数据结构实验二 :二叉树的操作与实现 数据结构实验三: 图的操作与实现 数据结构实验四 : 查找和排序算法实现 文章目录 一.实验目的: 二.使用仪器.器材 三 ...

  5. 实验六 图的遍历操作及应用

    实验六 图的遍历操作及应用 一.实验实习目的及要求 掌握有向图和无向图的概念:掌握邻接矩阵和邻接链表建立图的存储结构:掌握DFS及BFS对图的遍历操作:了解图结构在人工智能.工程等领域的广泛应用. 二 ...

  6. 建立计算机系学生视图,实验六 视图的操作.doc

    实验六 视图的操作 实验六 视图的操作 一.实验目的 1.理解的概念. .掌握.SQL语句创建视图,掌握查询分析器的使用 1.语句格式 CREATE VIEW [( [,]-)] AS [WITH C ...

  7. 实验三 图的操作与实现

    前言 记录实验,同时也是记录常见数据结构算法的实现. 广州大学学生实验报告 开课实验室:计算机科学与工程实验(电子楼416A) 学院 计算机科学与网络工程学院 实验课程 数据结构实验 实验项目 实验三 ...

  8. matlab 实验6 高层绘图操作,实验六 高层绘图操作答案

    实验六 高层绘图操作答案 实验六 高层绘图操作 实验目的: 1. 掌握绘制二维图形的常用函数 2. 掌握绘制三维图形的常用函数 3. 掌握绘制图形的辅助操作 实验内容: 1. 1. 设,在区间取101 ...

  9. 数据结构实验八 图及其应用

    数据结构实验八 图及其应用 实验内容 1.编写一个程序,完成如下功能: (1) 建立如下有向图G1的邻接矩阵输出,并由邻接矩阵产生邻接表输出之: (2) 输出图G1从顶点0开始的深度优先遍历序列: ( ...

最新文章

  1. 有关nginx location规则
  2. case....when ...多重判断
  3. exsi主机之间使用scp拷贝文件超时问题
  4. Python之tkinter:动态演示调用python库的tkinter带你进入GUI世界(Button展示图片事件)
  5. windows下的文本文件在linux下查看,中文显示乱码
  6. biginteger判断相等_java biginteger怎么比较大小
  7. android list contain的使用
  8. iOS 开发者必不可少的 75 个工具
  9. Codeforces Round #628 (Div. 2) F. Ehab‘s Last Theorem dfs树
  10. 开发VUE使用第三库,发现有bug怎么办?
  11. java liunx 日期格式化_java关于windows环境下显示日期格式正常,linux环境上异常的问题...
  12. 固定 顶部_抗拉固定球铰支座优点与施工步骤
  13. Julia: find 和其它
  14. jetbrains mono字体安装方法(LInux Windows MacOS系统)
  15. 【环境配置】Ubuntu18.04配置高通骁龙神经处理引擎(SNPE)
  16. AWS 云计算 SQS SNS
  17. 阿里巴巴JAVA代码规范三【考题】
  18. obs多推流地址_OBS如何进行多路推流
  19. 贪心算法(4.加工生产调度(做题思路分析))
  20. 多维多重背包问题_多重背包问题

热门文章

  1. windows运行程序命令
  2. 设备唯一代码获取相关
  3. crontab定时任务自动不能执行,手动可以执行的解决办法-亲测解决
  4. 内推 | 商汤科技计算机视觉岗(全职/实习),可直通面试
  5. nginx容器配置https后访问有时显示连接被重置
  6. Android3d结构光,3D结构光首功+Find+X成首款刷脸支付安卓机
  7. [CVE-2021-1732] win32k内核提权漏洞分析
  8. STL——空间配置器剖析(一级空间配置器、二级空间配置器的本质及运用场合,是如何用内存池去管理的)
  9. unity中使物体无缝连接的方法
  10. 三、GNSS两种基本定位原理(1)