邻接表对图常用的操作

#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;
}
//定位函数虽然在这个程序中没用到,但其实我也是取巧省事了,现实中经常会用到定位函数,会减少随机性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值