收藏 分享(赏)

数据结构---图的基本操作.doc

上传人:myw993772 文档编号:8742738 上传时间:2019-07-09 格式:DOC 页数:23 大小:53.50KB
下载 相关 举报
数据结构---图的基本操作.doc_第1页
第1页 / 共23页
数据结构---图的基本操作.doc_第2页
第2页 / 共23页
数据结构---图的基本操作.doc_第3页
第3页 / 共23页
数据结构---图的基本操作.doc_第4页
第4页 / 共23页
数据结构---图的基本操作.doc_第5页
第5页 / 共23页
点击查看更多>>
资源描述

1、数据结构-图的基本操作#include “stdio.h“#include “malloc.h“#define MAX_VERTEX_NUM 20#define OK 1#define error -1#define ERROR 0#define ErrorInput -2typedef int VertexType;typedef int Status;int CHIOCE;/用来接收用户的选择int VEXNUM,ARCNUM ; /用来接收用户输入的顶点和弧数目int i;typedef struct ArcNodeint adjvex; /该弧所指向的顶点的位置struct ArcNo

2、de *nextarc; /指向下一条弧的指针/InfoType *info; /相关信息ArcNode;typedef struct VNodeVertexType data; /顶点信息(可放权值)ArcNode *firstarc; /指向第一条依附该顶点的弧的指针VNode,AdjListMAX_VERTEX_NUM;typedef structAdjList vertices;int vexnum,arcnum;/vexcount; /图的当前顶点和弧数和顶点计数,count 记录真实结点个数int kind; /图的种类ALGraph;typedef int ElemType;#d

3、efine NULL 0typedef int ElemType;typedef struct QNodeElemType data;struct QNode *next;QNode, *QueuePtr;typedef struct QueuePtr front;QueuePtr rear;LinkQueue;bool InitQueue(LinkQueue if(!Q.front) return false;Q.front-next=NULL;return true;bool DestroyQueue(LinkQueue free(Q.front);Q.front=Q.rear;retur

4、n true; bool EnQueue(LinkQueue p=(QueuePtr)malloc(sizeof(QNode);if(!p) return false;p-data=data;p-next=NULL;Q.rear-next=p;Q.rear=p;return true; bool DeQueue(LinkQueue if(Q.front=Q.rear) return false;p=Q.front-next;data=p-data;Q.front-next=p-next;if(Q.rear=p) Q.rear=Q.front;free(p);return true;bool G

5、etQueueTop(LinkQueue Q,ElemType data=(Q.front-next)-data;return true;bool QueueEmpty(LinkQueue return false; void InitiateGraph(ALGraph *G)int i;G-vexnum=0;G-arcnum=0;for(i=0;iverticesi.firstarc=NULL;/*在图 G中第 i个位置增添新顶点 v */void InsertVex(ALGraph *G,int i,VertexType v)if(i=0/存储顶点数据元素 vextexG-vexnum+;

6、 /个数加 1elseprintf(“顶点越界n“);/*在图 G中删除v*/Status DeleteVex(ALGraph ArcNode *p,*q;for(i=0;iadjvex=v)/如果 v为该节点的第一个临界弧所指向的顶点位置p=G.verticesi.firstarc;G.verticesi.firstarc=p-nextarc;free(p);G.arcnum-;else /q用来记录前一个弧,p 为当前弧for(p=G.verticesi.firstarc;p!=NULL;q=p,p=p-nextarc)if(p-adjvex=v)q-nextarc=p-nextarc;f

7、ree(p);G.arcnum-;break;/弧只有一条所以用 break跳出/*删除以 v为弧尾的边*if(G.verticesv.firstarc!=NULL) p=G.verticesv.firstarc;/p记录前一个弧q=p-nextarc;/q为当前弧/G.verticesv.firstarc=NULL;while(1) free(p);G.arcnum-;if(q=NULL)break;elsep=q;q=q-nextarc;/*从数组中删除 v节点*/for(i=v;iadjvex=w;p-nextarc=NULL;G.verticesv.firstarc=p;else/如果

8、不是 NULL则进行遍历到最后一个弧for(p=G.verticesv.firstarc;p!=NULL;q=p,p=p-nextarc);p=(ArcNode *)malloc(sizeof(ArcNode);p-adjvex=w;p-nextarc=NULL;q-nextarc=p;/*在 G中增添弧,若 G是无向的,则还增添对称弧*/int InsertArc(ALGraph return 0;elseConnect(G,v,w);G.arcnum+;if(G.kind=1)/如果是无向图则反向插入一个弧Connect(G,w,v);G.arcnum+; printf(“添加弧成功n“)

9、;return 1;/*删除节点 v和 w间的弧*/Status Delete(ALGraph if(G.verticesv.firstarc-adjvex=(w)/该弧是第一条依附顶点 v的弧p=G.verticesv.firstarc;G.verticesv.firstarc=p-nextarc;free(p);G.arcnum-;return OK;else/否则遍历找到这条弧for(p=G.verticesv.firstarc;(p-adjvex!=w)q=p,p=p-nextarc);if(p-adjvex=w)q-nextarc=p-nextarc;free(p);G.arcnum

10、-;return ERROR;elseprintf(“该弧不存在“);return OK; /*在 G中删除弧,若 G是无向的,则还删除对称弧*/Status DeleteArc(ALGraph return ERROR;elseDelete(G,v,w);if(G.kind=1)Delete(G,w,v);return OK;/*若 G中存在顶点 u,则返回该顶点在图中位置;否/则返回其它信息*/int LocateVex(ALGraph G,int u)int i=0;while(G.verticesi.data!=u)return ERROR;elsereturn G.verticesv

11、.data;/*对 v赋值 value*Status SetVex(ALGraph return ERROR;elseG.verticesv.data=val;return OK; /*返回 v的第一个邻接点。若该顶点在 G中没有邻/接点,/则返回-1*int FirstAdjVex(ALGraph G,int v)if(vG.arcnum)printf(“参数错误“);return ERROR;elseif(G.verticesv.firstarc!=NULL)return G.verticesv.firstarc-adjvex;else/ printf(“来自 FirstAdjVex函数:

12、顶点:%d 没有邻接顶点n“,v);return error;/返回 v的(相对于 w的)下一个邻接点。若 w是 v的最后一个邻接点,则返回“空“。*int NextAdjVex(ALGraph if(vG.vexnum| wG.vexnum )return ErrorInput;/输入值不正确返回-2p=G.verticesv.firstarc;while(p!=NULL)if(p-adjvex!=w)p=p-nextarc;continue;elsebreak;if(p=NULL)/printf(“w不是 v的邻接顶点“);return error;elseif(p-nextarc!=NU

13、LL)return (p-nextarc-adjvex);else/ printf(“v邻接顶点 w的下一个邻接顶点不存在“);return error; /*创建图函数*Status CreateALG(ALGraph int i=0;int out,in;printf(“请输入顶点(Vex)个数:“);scanf(“%d“,/G.vexcount=G.vexnum;printf(“请输入弧(Arc)数:“);scanf(“%d“,printf(“请输入图的类型(0-有向图,1-无向图):“);scanf(“%d“,InitiateGraph(Gpointer);/int *intarray

14、=new intG.vexnum;for(i=0;i=0;w=NextAdjVex(G,v,w)if(!visitedw) DFS(G,w);/对 v的为访问的邻接顶点 w递归调用 DFS void DFSTraverse(ALGraph G)for(i=0;i=0;w=NextAdjVex(G,i,w)if(!visitedw)visitedw=true;printf(“%dt%dn“,w,G.verticesw.data);EnQueue(Q,w);DestroyQueue(Q);Status DestroyGraph(ALGraph for(v=0;vnextarc)printf(“%d

15、t“,p-adjvex);printf(“n“);return OK;void main()int v,w,next;ALGraph G;ALGraph *Gpointer=puts(“-建立图-“);CreateALG(G);PrintGraph(G);printf(“执行退出操作请输入 0 n“);printf(“执行插入顶点操作请输入 1 n“);printf(“执行删除顶点操作请输入 2 n“);printf(“执行插入弧操作请输入 3 n“);printf(“执行删除弧操作请输入 4 n“);printf(“执行查找顶点位置操作请输入 5 n“);printf(“执行查找某位置顶点的

16、值操作请输入 6 n“);printf(“执行对某顶点赋值操作请输入 7 n“);printf(“执行返回 v的第一个邻接点操作请输入 8 n“);printf(“执行返回 v的(相对于 w的)下一个邻接点,请输入零度摆渡 KingEasternSun9 n“);printf(“执行从顶点 v起深度优先遍历图操作请输入 10 n“);printf(“执行从顶点 v起广度优先遍历图操作请输入 11 n“);printf(“请输入命令:“);scanf(“%d“,while(CHIOCE!=0)switch(CHIOCE)case 1:/插入顶点printf(“请输入要插入顶点的值n“);scan

17、f(“%d“,InsertVex(Gpointer,G.vexnum,v);PrintGraph(G);printf(“+n“);break;case 2:/删除顶点printf(“请输入要删除顶点的位置n“);scanf(“%d“,DeleteVex(G,v);PrintGraph(G);printf(“+n“);break;case 3:printf(“请输入要插入弧的两端顶点顶点n“);printf(“请输入弧 out int):“);scanf(“%d %d“,if(!InsertArc(G, v, w)printf(“ “);PrintGraph(G);printf(“+n“);br

18、eak;case 4:printf(“请输入要删除弧的两端顶点顶点n“);printf(“请输入弧 out int):“);scanf(“%d %d“,if(!DeleteArc(G, v, w)printf(“ “);PrintGraph(G);printf(“+n“);break;case 5:printf(“执行查找顶点位置操作*请输入顶点的值n“);scanf(“%d“,w=LocateVex(G,v);printf(“结果是:“);printf(“%dn“,w);printf(“+n“);break;case 6:printf(“执行查找某位置顶点的值操作*请输入顶点的位置n“);s

19、canf(“%d“,w=GetVex(G, v);printf(“结果是:“);printf(“%dn“,w);printf(“+n“);break;case 7:printf(“执行对某顶点赋值操作*请输入顶点的位置n“);scanf(“%d“,printf(“请输入顶点的值n“);scanf(“%d“,if(SetVex(G, v, w)printf(“赋值成功n“); PrintGraph(G);printf(“+n“);break;case 8:printf(“执行返回 v的第一个邻接点操作*请输入顶点的位置n“);scanf(“%d“,w=FirstAdjVex(G,v);if(w=

20、-1)printf(“顶点:%d 没有邻接顶点n“,v);elseprintf(“结果是:“);printf(“%dn“,w); printf(“+n“);break;case 9:printf(“执行返回 v的(相对于 w的)下一个邻接点操作*请顶点和邻接顶 v w “);scanf(“%d %d“,next=NextAdjVex(G,v,w);if(next=-1) printf(“v邻接顶点 w的下一个邻接顶点不存在“);elseprintf(“结果是:“);printf(“%dn“,next);printf(“+n“);break;case 10:printf(“深度遍历结果是:n“);DFSTraverse(G);printf(“+n“);break;case 11:printf(“广度遍历结果是:n“);BFSTraverse(G);printf(“+n“);break;default:printf(“输入数字错误n“);printf(“请您输入n“);scanf(“%d“,printf(“您选择了离开n“);

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报