邻接表对图常用的操作
2015-11-05 23:27
162 查看
#include<stdio.h> #include<stdlib.h> #define maxsize 20 #define Add 10 typedef 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; }
//定位函数虽然在这个程序中没用到,但其实我也是取巧省事了,现实中经常会用到定位函数,会减少随机性
相关文章推荐
- EJB学习(二)—在JBoss下开发、部署EJB
- Mac OS X下设置android NDK的环境(详细实测有图)
- ionic工程组织文件
- javaEE和javaSE的区别和联系
- js基础知识温习:Javascript中如何模拟私有方法
- Caused by: org.hibernate.TransactionException: unable to commit against JDBC connection
- nmap.org的21世纪的netcat(ncat)
- 多线程下载断点下载
- MySQL非root用户执行增加用户及用户权限的操作
- HDU 2072 单词数【STL】
- HDU 2072 单词数【STL】
- Android USB转串口编程
- java serialization/deserialization (序列化对象自描述)
- leetcode-Valid Anagram
- NOIP 考前注意
- org.hibernate.TransactionException: commit failed
- solr配置文件solrconfig.xml解析
- 对底层软硬件的一些胡思乱想
- SVM入门(九)松弛变量(续)
- jquery 图片比例不变,全屏居中