参考:算法:C语言实现 一书
实现:
#ifndef GRAPH #define GRAPH #include<stdio.h> #include<stdlib.h> struct edge{ int v; int w; }; struct node{ int v; node* next; }; struct graph{ int v; int e; node** adj; }; node* NEW(int v,node* next) { node* x = (node*)malloc(sizeof(node)); x->v = v; x->next = next; return x; } graph* graphInit(int v) { graph* g = (graph*)malloc(sizeof(graph)); g->v = v; g->e = 0; g->adj = (node**)malloc(v*sizeof(node*)); for (int v = 0; v < g->v; ++v) g->adj[v] = NULL; return g; } void graphInsert(graph* g, edge e) { int v = e.v, w = e.w; g->adj[v] = NEW(w, g->adj[v]); g->adj[w] = NEW(v, g->adj[w]); ++g->e; } void graphShow(graph* g) { for (int v = 0; v < g->v; ++v){ printf("%d: ", v); node* p = g->adj[v]; while (p){ printf("%d ", p->v); p = p->next; } printf(" "); } } #endif
测试:
#include"graph.h" #include<time.h> #include<queue> using namespace std; int main() { printf(" graph of list test: "); graph* g = graphInit(10); edge e[10]; for (int i = 0; i < 10; ++i){ srand(i); //使得每次运行产生的数据是一样的,便于分析 e[i].v = rand() % 10; e[i].w = rand() % 10; graphInsert(g, e[i]); } graphShow(g); printf(" "); for (int i = 0; i < 10; ++i) printf("%d %d ", e[i].v, e[i].w); printf(" "); }