第6章 图(补全邻接表和遍历代码)(求图的邻接表)

graph.h

#ifndef __GRAPH_H__
#define __GRAPH_H__

typedef char Vertex[20]; /* 顶点的数据类型,字符串 */

typedef struct AdjLinkedNode {
	int adjvex;
	struct AdjLinkedNode *next;
}AdjLinkedNode;

typedef struct Graph {
	Vertex *vertex;
	int c;	/* capacity */
	int n_v; /* number of vertex */
	AdjLinkedNode *adjHeaders;
}Graph;

/* 创建最多n个顶点的图 */
int createGraph(Graph *g, int n);

/* 图g插入顶点v */
int insertVertex(Graph *g, Vertex v);

/* 图g插入边(u,v) */
int insertEdge(Graph *g, Vertex u, Vertex v);

/* 遍历图g */
void traverseGraph(Graph *g, int (*func)(Vertex v));

#endif

graph.c

#include  /* strcpy(), strcmp() */
#include 
#include  /* malloc() */
#include "graph.h"


/* 创建最多n个顶点的图 */
int createGraph(Graph *g, int n)
{
	int i;
	g->vertex = (Vertex *)malloc(sizeof(Vertex) * n);
	g->c = n;
	g->n_v = 0;
	g->adjHeaders = (AdjLinkedNode *)malloc(sizeof(AdjLinkedNode) * n);
	for(i=0; iadjHeaders[i].next = NULL;
	}

	return 0;
}


/* 图g插入顶点v */
int insertVertex(Graph *g, Vertex v)
{
	/* g->vertex[g->n_v] = v */
	strcpy(g->vertex[g->n_v], v);

	g->n_v ++;

	return g->n_v;
}

/* 获取顶点v的索引(下标) */
int locateVertex(Graph *g, Vertex v)
{
	int i;
	for(i=0; in_v; i++) {
		if (strcmp(g->vertex[i], v) == 0) {
			return i;
		}
	}
	return -1;
}

void insertAdjLinked(Graph *g, int iu, int iv)
{
	AdjLinkedNode *p;
	p = (AdjLinkedNode *)malloc(sizeof(AdjLinkedNode));
	p->adjvex = iv;
	p->next = g->adjHeaders[iu].next;
	g->adjHeaders[iu].next = p;
}

/* 图g插入边(u,v) */
int insertEdge(Graph *g, Vertex u, Vertex v)
{
	int iu, iv;

	iu = locateVertex(g, u);
	iv = locateVertex(g, v);

	insertAdjLinked(g, iu, iv);
	insertAdjLinked(g, iv, iu);

	return 0;
}

/* 遍历图的内部函数 */
void traverseGraphInner(Graph *g, int u, int flags[], int (*func)(Vertex v))
{
	AdjLinkedNode *p;

	if (flags[u] == 1) {
		return;
	}

	/* visit u */
	flags[u] = 1;
/*	printf("%d: %s\n", u, g->vertex[u]); */
	func(g->vertex[u]);

	for(p=g->adjHeaders[u].next; p!=NULL; p=p->next) {
		traverseGraphInner(g, p->adjvex, flags, func);
	}

}


/* 遍历图g */
void traverseGraph(Graph *g, int (*func)(Vertex v))
{
	int i, *flags; /* 到此一游数组 */

	flags = (int *)malloc(sizeof(int) * g->n_v);
	for(i=0; in_v; i++) {
		flags[i] = 0;
	}

	/* 解决非连通图问题 */
	for(i=0; in_v; i++) {
		traverseGraphInner(g, i, flags, func);
	}
	
}

main.c

#include 
#include "graph.h"


int visitVertex(Vertex v)
{
	printf("%s\n", v);
	return 0;
}


int visitVertex2(Vertex v)
{
	printf("\t%s\n", v);
	return 0;
}


int main()
{
	Graph map;

	createGraph(&map, 100);

	insertVertex(&map, "SanJiao");
	insertVertex(&map, "SiJiao");
	insertVertex(&map, "ShiTang");

	insertEdge(&map, "SanJiao", "SiJiao");
	insertEdge(&map, "ShiTang", "SiJiao");

	traverseGraph(&map, visitVertex);
	traverseGraph(&map, visitVertex2);

	return 0;
}
原文链接:,转发请注明来源!