邻接表对图常用的操作

来源:互联网 发布:红外光谱分析软件 编辑:程序博客网 时间:2024/06/06 01:17
#include<stdio.h>#include<stdlib.h>#define maxsize 20#define Add 10typedef 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;}
//定位函数虽然在这个程序中没用到,但其实我也是取巧省事了,现实中经常会用到定位函数,会减少随机性
0 0