第五章 图论 邻接表存图
2023-12-19 05:27:02
邻接表存图
存储结构
#define MaxSize 10
typedef char DataType;
typedef struct EdgeNode{ // 定义边表节点
int adjvex;
struct EdgeNode *next;
} EdgeNode;
typedef struct{ // 定义顶点表结点
DataType vertex;
EdgeNode *first;
} vertexNode;
typedef struct{
vertexNode adjlist[MaxSize]; // 存放顶点表的数组
int vertexNum, edgeNum; // 图的顶点数和边数
} ALGraph;
有向图邻接表的建立
void CreateGraph(ALGraph *G, DataType a[], int n, int m){
G->vertexNum=n, G->edgeNum=m;
for(int i=0; i<n; i++){
G->adjlist[i].vertex=a[i];
G->adjlist[i].first=NULL;
}
for(int i=0; i<m; i++){
int x, y;
scanf("%d%d", &x, &y);
EdgeNode *s=(EdgeNode*)malloc(sizeof(EdgeNode));
s->adjvex=y;
s->next=G->adjlist[x].first;
G->adjlist[x].first=s;
}
}
图的销毁
void DestroyGraph(ALGraph *G){
for(int i=0; i<G->vertexNum; i++){
EdgeNode *p, *q;
p=q=G->adjlist[i].first;
while(p != NULL){
p=p->next;
free(q);
q=p;
}
}
}
深度优先遍历
void dfs(ALGraph *G, int r){
printf("%c ", G->adjlist[r].vertex);
st[r]=1;
EdgeNode *p=G->adjlist[r].first;
while(p != NULL){
int u=p->adjvex;
if(st[u]==0) dfs(G, u);
p=p->next;
}
}
广度优先遍历
void bfs(ALGraph *G, int r){
int Q[MaxSize];
int front=-1, rear=-1;
printf("%c ", G->adjlist[r].vertex);
st[r]=1; Q[++rear]=r;
while(front != rear){
int u=Q[front ++];
EdgeNode *p=G->adjlist[u].first;
while(p != NULL){
int v=p->adjvex;
if(st[v]==0){
printf("%c ", G->adjlist[v].vertex);
st[v]=1; Q[++rear]=v;
}
p=p->next;
}
}
}
文章来源:https://blog.csdn.net/2301_78527293/article/details/135059654
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!