邻接矩阵关于图的常用操作

来源:互联网 发布:新手淘宝店课程免费 编辑:程序博客网 时间: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