您的位置:首页 > 其它

邻接表对图常用的操作

2015-11-05 23:27 162 查看
#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;
}
//定位函数虽然在这个程序中没用到,但其实我也是取巧省事了,现实中经常会用到定位函数,会减少随机性
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: