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

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值