php生成数据结构图 php生成数据结构图( 三 )


{ s=(slink *)malloc(sizeof(slink));
s-num=x-'A';
if(G-ve[y-'A'].first==NULL)
{ G-ve[y-'A'].first=s;s-next=NULL;}
else
{ p=G-ve[y-'A'].first;q=p-next;
while(q!=NULLs-numq-num) { p=q;q=q-next;}
p-next=s;s-next=q;
}
}
scanf("%c%c",x,y);
}
G-edge=e;
}
/* 输出用邻接表存储表示的图 */
void list(adjlist *G)/* 输出邻接表 */
{ int i; slink *p;
for(i=0;iG-vex;i++)
{ printf("%d:%c---",i,G-ve[i].vertex);
p=G-ve[i].first;
while(p)
{ printf("%3d",p-num);
p=p-next;
}
printf("\n");
}
}
/* 对邻接表存储的图进行深度优先搜索算法 */
int visited[MAXVER+1];/* 顶点的访问标记数组 */
dfs(adjlist *G,int v)/* v是访问的起始点的下标 */
{ slink *p;
visited[v]=1;
printf("%3c",G-ve[v].vertex);
p=G-ve[v].first;
while(p)
{ if(visited[p-num]==0)/* 从V的未访问过的邻接点出发 */
dfs(G,p-num);
p=p-next;/* 找V的下一个邻接点 */
}
}
void dfsgraph(adjlist *G)
{ int i;
for(i=0;iG-vex;i++) if(!visited[i]) dfs(G,i);
}
main()
{ adjlist g;
int n=8;
cregraph(g,n,0);
dfsgraph(g);
}
对一个采用邻接表作存储结构的图进行广度优先遍历:
/*邻接表结构*/
#include "stdio.h"
#define MAXVER 10/* 最多顶点数 */
typedef char ElemType;/* 顶点元素类型 */
typedef struct node
{ int num;
struct node *next;
}slink;/* 边或弧的结点类型 */
typedef struct
{ struct
{ ElemType vertex;
slink *first;
}ve[MAXVER];/* 顶点信息结构 */
int vex,edge,tag;/* 存放顶点数、边数和图的类型 */
}adjlist;/* 邻接表存储结构类型名 */
/*建立邻接表*/
void cregraph(adjlist *G,int n,int m) /* n为顶点数,m为图的类型 */
{ int i,e=0;slink *p,*q,*s;char x,y;
G-vex=n; G-tag=m;
for(i=0;in;i++)
{ G-ve[i].vertex=i+'A'; G-ve[i].first=NULL;}/* 初始化邻接表 */
printf("Input edges(x--y):");/* 用大写字母表示顶点 */
scanf("%c%c",x,y);
while(x!=' 'y!=' ')/* 输入边或弧,遇空格符结束 */
{ e++;/* 统计边或弧和数目 */
s=(slink *)malloc(sizeof(slink));
s-num=y-'A';/* 生成结点插入 */
if(G-ve[x-'A'].first==NULL)
{ G-ve[x-'A'].first=s;
s-next=NULL;
}
else
{ p=G-ve[x-'A'].first;q=p-next;
while(q!=NULLs-numq-num) {p=q;q=q-next;}
p-next=s;s-next=q;
}
if(!G-tag)/* m=0表示建立无向图的邻接表 */
{ s=(slink *)malloc(sizeof(slink));
s-num=x-'A';
if(G-ve[y-'A'].first==NULL)
{ G-ve[y-'A'].first=s;s-next=NULL;}
else
{ p=G-ve[y-'A'].first;q=p-next;
while(q!=NULLs-numq-num) { p=q;q=q-next;}
p-next=s;s-next=q;
}
}
scanf("%c%c",x,y);
}
G-edge=e;
}
/* 输出邻接表 */
void list(adjlist *G)/* 输出用邻接表表示的图 */
{ int i; slink *p;
for(i=0;iG-vex;i++)
{ printf("%d:%c---",i,G-ve[i].vertex);
p=G-ve[i].first;
while(p)
{ printf("%3d",p-num);
p=p-next;
}
printf("\n");
}
}
/* 对一个采用邻接表作存储结构的图进行广度优先遍历 */
int visited[MAXVER];
void bfs(adjlist *G,int v)
{ int queue[MAXVER],front,rear,i;/* 定义一个分离队列 */
slink *p;
front=rear=0;/* 队列初始化为空 */
queue[rear++]=v;/* 初始顶点入队列 */
while(front!=rear)/* 队列不空 */
{ v=queue[front++];/* 出队列访问 */
printf("%c-",G-ve[v].vertex);
visited[v]=1;/* 入访问表 */
p=G-ve[v].first;
while(p!=NULL)
{ for(i=0;irear;i++)
if(p-num==queue[i]) break;

推荐阅读