邻接表对图常用的操作
来源:互联网 发布:红外光谱分析软件 编辑:程序博客网 时间:2024/06/06 01:17
#include<stdio.h>#include<stdlib.h>#define maxsize 20#define Add 10typedef struct Arcnode{ int adjvex; struct Arcnode *nextarc;}Arcnode,*ARC;typedef struct Vnode{ int data; Arcnode *firstarc;}Vnode,Adjlist[maxsize];typedef struct{ Adjlist vertices; int vexnum,arcnum;}ALgraph;typedef struct queue{ int front; int rear; ARC *base;}squeue;typedef struct stack{ int MAXSIZE; int top; ARC *base;}sqstack;void Initqueue(squeue &Q){ Q.base=(ARC*)malloc(maxsize*sizeof(ARC)); if (!Q.base) exit(1); Q.front=Q.rear=0;}void Pushqueue(squeue &Q,ARC e){ if ((Q.rear+1)%maxsize==Q.front) return; Q.base[Q.rear]=e; Q.rear=(Q.rear+1)%maxsize;}void Popqueue(squeue &Q,ARC &e){ if (Q.rear==Q.front) return; e=Q.base[Q.front]; Q.front=(Q.front+1)%maxsize;}int Emptyqueue(squeue Q){ if (Q.rear==Q.front) return 1; return 0;}void Initstack(sqstack &p){ p.base=(ARC*)malloc(maxsize*sizeof(ARC)); if (!p.base) exit(0); p.top=0; p.MAXSIZE=maxsize;}int Emptystack(sqstack p){ if (p.top==0) return 1; return 0;}int GetHeadstack(sqstack p,ARC &s){s=p.base[p.top-1];if (s)return 1;return 0;}void Pushstack(sqstack &p,ARC e){ if (p.top>=p.MAXSIZE) { p.base=(ARC*)realloc(p.base,(maxsize+Add)*sizeof(ARC)); if (!p.base) exit(0); p.top=maxsize; p.MAXSIZE+=Add; } p.base[p.top++]=e; }void Popstack(sqstack &p,ARC &e){ if (p.top==0) return; e=p.base[--p.top]; }int visit[maxsize];int locate(ALgraph g,int v){<span style="white-space:pre"></span>//如果传入的值是顶点信息,可利用这个定位函数来确定具体位置 int i; for (i=1;i<=g.vexnum;i++) if (v==g.vertices[i].data) return i; return 0;}void Dfs(ALgraph g,int v){Arcnode *p;visit[v]=1;printf("%d ",g.vertices[v].data);p=g.vertices[v].firstarc;for (;p;p=p->nextarc)if (!visit[p->adjvex])Dfs(g,p->adjvex);}void DfsTraverse(ALgraph g){ int i;for (i=1;i<=g.vexnum;i++)visit[i]=0;for (i=1;i<=g.vexnum;i++)if (!visit[i]) Dfs(g,i);}void Bfs(ALgraph g,int v){ squeue Q;Arcnode *p;Initqueue(Q);printf("%d",g.vertices[v].data);visit[v]=1;p=g.vertices[v].firstarc;while (!Emptyqueue(Q)||p){while (p){ if (visit[p->adjvex]==0) { printf(" %d",g.vertices[p->adjvex].data); visit[p->adjvex]=1; Pushqueue(Q,p); } p=p->nextarc;} if (!Emptyqueue(Q)) { Popqueue(Q,p);p=p->nextarc; }}printf("\n");}void BfsTraverse(ALgraph g){int i;for (i=1;i<=g.vexnum;i++)visit[i]=0;for (i=1;i<=g.vexnum;i++)if (!visit[i])Bfs(g,i);}void Creatgraph1(ALgraph &g){//头插法建立邻接表int i,v1,v2;Arcnode *s;printf("请输入图的顶点数与弧数:\n"); scanf("%d%d",&g.vexnum,&g.arcnum); for (i=1;i<=g.vexnum;i++){scanf("%d",&g.vertices[i].data); g.vertices[i].firstarc=NULL;}for (i=1;i<=g.arcnum;i++){printf("请输入起点位置与终点位置:\n");scanf("%d%d",&v1,&v2);s=(Arcnode*)malloc(sizeof(Arcnode));s->adjvex=v2;s->nextarc=g.vertices[v1].firstarc;g.vertices[v1].firstarc=s;s=(Arcnode*)malloc(sizeof(Arcnode));s->adjvex=v1;s->nextarc=g.vertices[v2].firstarc; g.vertices[v2].firstarc=s;} }void Creatgraph2(ALgraph &g){//尾插法建立邻接表int i,v1,v2;Arcnode *s,*p;printf("请输入图的顶点数与弧数:\n"); scanf("%d%d",&g.vexnum,&g.arcnum); for (i=1;i<=g.vexnum;i++){scanf("%d",&g.vertices[i].data); g.vertices[i].firstarc=NULL;}for (i=1;i<=g.arcnum;i++){printf("请输入起点位置与终点位置:\n");scanf("%d%d",&v1,&v2);s=(Arcnode*)malloc(sizeof(Arcnode));s->adjvex=v2;s->nextarc=NULL;p=g.vertices[v1].firstarc;if (!p)g.vertices[v1].firstarc=s;else{ while (p->nextarc) p=p->nextarc; p->nextarc=s;}s=(Arcnode*)malloc(sizeof(Arcnode));s->adjvex=v1;s->nextarc=NULL;p=g.vertices[v2].firstarc;if (!p)g.vertices[v2].firstarc=s;else{ while (p->nextarc) p=p->nextarc; p->nextarc=s;}} }void bianli(ALgraph g){<span style="white-space:pre"></span>//输出邻接表int i;Arcnode *p;for (i=1;i<=g.vexnum;i++){printf("%d:",g.vertices[i].data);p=g.vertices[i].firstarc;while (p){ printf("->:%d",p->adjvex); p=p->nextarc;}printf("\n");}}void DFS(ALgraph g,int v){sqstack s;Arcnode *p; Initstack(s); visit[v]=1; printf("%d ",g.vertices[v].data); p=g.vertices[v].firstarc; while (!Emptystack(s)||p) { while (p) { if (visit[p->adjvex]) p=p->nextarc; else { visit[p->adjvex]=1;printf("%d ",g.vertices[p->adjvex].data); Pushstack(s,p); p=g.vertices[p->adjvex].firstarc; } } if (!Emptystack(s)) { Popstack(s,p); p=p->nextarc; } }}void DFSTraverse(ALgraph g){int i; for (i=1;i<=g.vexnum;i++) visit[i]=0;;for (i=1;i<=g.vexnum;i++)if (!visit[i])DFS(g,i);}int main(){ALgraph g;Creatgraph1(g);bianli(g);printf("递归深度优先搜索结果为:\n");DfsTraverse(g);printf("\n");printf("非递归深度优先搜索:\n");DFSTraverse(g);printf("\n");printf("广度优先搜索结果为:\n");BfsTraverse(g);printf("\n"); return 0;}
//定位函数虽然在这个程序中没用到,但其实我也是取巧省事了,现实中经常会用到定位函数,会减少随机性
0 0
- 邻接表对图常用的操作
- 图的邻接表操作
- 图的常用存储结构----邻接表
- 图的常用存储结构----邻接表
- 图的邻接表的操作实现
- 【总结】邻接表 图的基本操作
- 图的邻接表基本操作
- 图的基本操作(基于邻接表
- C++邻接表图操作
- 图的邻接表的基本操作及显示实例
- 邻接表存储的图的基本操作c++
- 数据结构之图的邻接表的基本操作
- 图的基本操作之构造图(邻接表)
- 图的邻接表存储以及相关操作 C语言
- 图的邻接表存储和基本操作
- 图的邻接表存储及基本操作
- 图的邻接表
- 图的邻接表
- Android 屏幕方向监听
- ionic工程组织文件
- HTTP/2和WebSocket及HTML5资料整理--WebSocket/HTML5篇
- Caused by: java.sql.SQLException: Couldn't perform the operation commit
- Windows平板真机调试
- 邻接表对图常用的操作
- EJB学习(二)—在JBoss下开发、部署EJB
- maven的大致简介
- java 中遇到的一些异常
- Mysql安装问题
- 大学校园内使用桥接方式上网的虚拟机Linux无法ping通外网的原因
- linux:服务
- 数组
- leetcode | Search Insert Position