邻接矩阵关于图的常用操作
来源:互联网 发布:新手淘宝店课程免费 编辑:程序博客网 时间:2024/05/13 19:14
#include<stdio.h>#include<stdlib.h>#define maxsize 21typedef int adjmatrix[maxsize][maxsize];typedef struct{ int vex[maxsize]; //顶点向量 adjmatrix arcs; //邻接矩阵 int vexnum,arcnum;}Mgraph;typedef struct elem{int start,end;}elem;typedef struct stack{elem *base;int max;int top;}sqstack;typedef struct node{int data; //队列里面存放元素的位置struct node *next;}Qnode,*Queuenode;typedef struct{Queuenode front;Queuenode rear;}sqQueue;void Initstack(sqstack &s){s.base=(elem*)malloc(maxsize*sizeof(elem)); if (!s.base)exit(0);s.top=0;s.max=maxsize;}int Emptystack(sqstack s){ if (s.top==0)return 1; return 0;;}void Pushstack(sqstack &s,elem e){ if (s.top<=s.max){ s.base=(elem*)malloc(maxsize*2*(sizeof(elem))); if (!s.base) exit(0); s.max=maxsize*2; s.top=s.max;}s.base[s.top++]=e;}void Popstack(sqstack &s,elem &e){if (s.top==0)return; e=s.base[--s.top];}int GetHead(sqstack s,elem &e){if (s.top==0)return 0;e=s.base[s.top-1];return 1;}void Initqueue(sqQueue &s){s.front=s.rear=(Queuenode)malloc(sizeof(Qnode));if (!s.front||!s.rear)exit(0);s.front->next=NULL;}int Empty(sqQueue s){ if (s.front==s.rear)return 1;return 0;}void Push(sqQueue &s,int e){ Queuenode p; p=(Queuenode)malloc(sizeof(Qnode)); if (!p) exit(0); p->data=e; p->next=NULL; s.rear->next=p; s.rear=p;}void Pop(sqQueue &s,int &e){Queuenode p;p=(Queuenode)malloc(sizeof(Qnode)); if (s.front==s.rear)return;p=s.front->next;e=p->data; s.front->next=p->next;if (s.rear==p)//防止链队列中只有一个头结点,相当于是个空队列s.rear=s.front;free(p);}void Creatgraph(Mgraph &g){int i,j,v1,v2;printf("请输入图的顶点数与弧数:\n"); scanf("%d%d",&g.vexnum,&g.arcnum); for (i=1;i<=g.vexnum;i++) scanf("%d",&g.vex[i]);for (i=1;i<=g.vexnum;i++)for (j=1;j<=g.vexnum;j++)g.arcs[i][j]=0;for (i=1;i<=g.arcnum;i++){printf("请输入弧的起点位置与终点位置:\n"); scanf("%d%d",&v1,&v2); g.arcs[v1][v2]=1;g.arcs[v2][v1]=1;}for (i=1;i<=g.vexnum;i++){for (j=1;j<=g.vexnum;j++)printf("%d ",g.arcs[i][j]);printf("\n");}}int visit[maxsize]={0};int Firstarc(Mgraph g,int v){int i;for (i=1;i<=g.vexnum;i++)if (g.arcs[v][i]&&!visit[i])return i;return 0;}int Nextarc(Mgraph g,int v,int w){int i;for (i=w+1;i<=g.vexnum;i++)if (g.arcs[v][i]&&!visit[i])return i;return 0;}void Dfs(Mgraph g,int v){int k; visit[v]=1; printf("%d ",g.vex[v]); for (k=1;k<=g.vexnum;k++)if (g.arcs[v][k]&&!visit[k])Dfs(g,k);}void DfsTraverse(Mgraph 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 BfsTraverse(Mgraph g){ int i,e,j;sqQueue Q;for (i=1;i<=g.vexnum;i++)visit[i]=0;Initqueue(Q);for (i=1;i<=g.vexnum;i++){ if(!visit[i]) { visit[i]=1; printf("%d ",g.vex[i]); Push(Q,i);while (!Empty(Q)){ Pop(Q,e); for (j=e+1;j<=g.vexnum;j++) if (g.arcs[e][j]&&!visit[j]) { visit[j]=1; printf("%d ",g.vex[j]); Push(Q,j); }//if的}//while的 }//if的}//for循环的}void DFS(Mgraph g,int v){ elem e; sqstack s; int w; Initstack(s); visit[v]=1; printf("%d",g.vex[v]); w=Firstarc(g,v);while (!Emptystack(s)||w){if (w==0)return; //w也就只能用一次,目的就是进入循环,如果以后w还为0,就说明以此点不能遍历完整的图 while (w) { if (visit[w]) w=Nextarc(g,v,w); else { visit[w]=1; printf(" %d",g.vex[w]); e.start=v; e.end=w; Pushstack(s,e); v=w; w=Firstarc(g,v); } } if (!Emptystack(s)) { Popstack(s,e); v=e.start; w=e.end; w=Nextarc(g,v,w); }}printf("\n");}void DFSTraverse(Mgraph 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(){Mgraph g; Creatgraph(g); printf("递归深度优先搜索遍历结果为:\n");DfsTraverse(g);printf("\n");printf("广度优先搜索遍历结果为:\n");BfsTraverse(g);printf("\n");printf("非递归深度优先搜索结果为:\n");DFSTraverse(g);printf("\n");return 0;}
0 0
- 邻接矩阵关于图的常用操作
- 图的邻接矩阵的操作
- 图的邻接矩阵存储操作
- 图的常用存储结构----邻接矩阵
- 数据结构之图的邻接矩阵的操作
- 【总结】邻接矩阵 图的基本操作
- 图的操作和l邻接矩阵存储
- 无向图的邻接矩阵基本操作
- 图的基本操作(基于邻接矩阵
- 邻接矩阵的基本操作
- 关于邻接矩阵下的破圈法
- 关于邻接矩阵的拓扑排序
- 邻接矩阵存储的图的基本操作c++
- 图的邻接矩阵的建立以及遍历操作
- 图的邻接矩阵存储结构基本操作的实现
- 网图的邻接矩阵存储以及相关操作 C语言
- 图的数组(邻接矩阵)存储结构和基本操作
- c语言实现图的基本操作--邻接矩阵存储
- LeetCode Valid Anagram 字符串
- scala与java的性能对比
- js中匿名函数的几种写法
- Eclipse将项目共享至新的SVN资源库
- C++中push_back的注意事项
- 邻接矩阵关于图的常用操作
- Java程序中避免使用字符串拼装SQL语句的之解决方案⑴-properties属性文件的使用
- C语言-指针-函数
- Hadoop — 使用Eclipse编译运行MapReduce程序(Hadoop2.6.0)
- iOS View如何实现背景黑透
- java入门程序100例学习笔记(007车牌号计算)
- tar命令解压.zip文件出错:gzip: stdin has more than one entry--rest ignored
- Reorder List
- 【C++】primer plus 练习8.1