#include<stdio.h>
#include<stdlib.h>
#define maxsize 21
typedef 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;
}
邻接矩阵关于图的常用操作
最新推荐文章于 2024-05-17 18:42:13 发布