#include #include #include int numEdges,numVertices,nextVertexNumber=0; int *tailHeader,*headTab; struct edge { int tail,head; }; typedef struct edge edgeType; edgeType *edgeTab; char **stringNameTable; int name2number(char *x) { ENTRY e,*ep; < Returns vertex number if name was previously inserted > < Assigns next vertex number if name was not previously inserted > } void readInput() { int i; char tailString[21],headString[21]; scanf("%d %d",&numVertices,&numEdges); stringNameTable=(char**) malloc(numVertices*sizeof(char*)); if (!stringNameTable) { printf("error 0\n"); exit(0); } tailHeader=(int*) malloc((numVertices+1)*sizeof(int)); if (!tailHeader) { printf("error 1\n"); exit(0); } edgeTab=(edgeType*) malloc(numEdges*sizeof(edgeType)); headTab=(int*) malloc(numEdges*sizeof(int)); if (!edgeTab || !headTab) { printf("error 2\n"); exit(0); } if (!hcreate(numVertices)) { printf("error 3\n"); exit(0); } for (i=0;itail - y->tail; if (result!=0) return result; else return x->head - y->head; } void buildAdjacencies() { /* Builds compact adjacency structure */ int duplicates=0,i,j,k; qsort(edgeTab,numEdges,sizeof(edgeType),tailThenHead); < Use edgeTab to build compact adjacency structure > if (duplicates>0) { printf("%d duplicates found & removed\n",duplicates); numEdges-=duplicates; } } void dump() { int i,j; printf(" i stringNameTable[i]\n"); for (i=0;i } void testReflexive() { int i; < Loops through vertices and checks for self-loop > } void testSymmetric() { int i,j; < Navigates tailHeader[] & headTab. Each edge is then checked for a reverse > } main() { readInput(); printf("buildAdjacencies()\n"); buildAdjacencies(); dump(); printf("testReflexive()\n"); testReflexive(); printf("testSymmetric()\n"); testSymmetric(); }