有向图连接链表
图的定义
#include <stdio.h>#include <malloc.h>#define MAXVEX 100typedef char VertexType[3];typedef struct edgenode{ int adjvex; /*邻接点序号*/ int value; /*边的权值*/ struct edgenode *next; /*下一条边的顶点*/} ArcNode; /*每个顶点建立的单链表中结点的类型*/typedef struct vexnode{ VertexType data; /*结点信息*/ ArcNode *firstarc; /*指向第一条边结点*/} VHeadNode; /*单链表的头结点类型*/typedef struct { int n,e; /*n为实际顶点数,e为实际边数*/ VHeadNode adjlist[MAXVEX]; /*单链表头结点数组*/} AdjList; /*图的邻接表类型*/
创建图
int CreateAdjList(AdjList *&G) /*建立有向图的邻接表*/{ int i,b,t,w; ArcNode *p; G=(AdjList *)malloc(sizeof(AdjList)); printf("顶点数(n),边数(e):"); scanf("%d%d",&G->n,&G->e); for (i=0;i<G->n;i++) { printf(" 序号为%d的顶点信息:", i); scanf("%s",G->adjlist[i].data); G->adjlist[i].firstarc=NULL; } for (i=0;i<G->e;i++) { printf(" 序号为边=>",i); printf(" 起点号 终点号 权值:"); scanf("%d%d%d",&b,&t,&w); if (b<G->n && t<G->n && w>0) { p=(ArcNode *)malloc(sizeof(ArcNode)); /*建立*p结点*/ p->value=w;p->adjvex=t; p->next=G->adjlist[b].firstarc; /**p插入到adjlist[b]的单链表之首*/ G->adjlist[b].firstarc=p; } else { printf("输入错误!\n"); return(0); } } return(1);}
列出图
void DispAdjList(AdjList *G){ int i; ArcNode *p; printf("图的邻接表表示如下:\n"); for (i=0;i<G->n;i++) { printf(" [%d,%3s]=>",i,G->adjlist[i].data); p=G->adjlist[i].firstarc; while (p!=NULL) { printf("(%d,%d)->",p->adjvex,p->value); p=p->next; } printf("∧\n"); }}
main
void main(){ AdjList *G; CreateAdjList(G); DispAdjList(G);}