#include <stdio.h>
#include <stdlib.h>
#include "GRAPH.h"
typedef struct node *link;
struct node { int v; link next; };
struct graph { int V; int E; link *adj; Point *pos; };
link NEW(int v, link next)
  { link x = malloc(sizeof *x);
    x->v = v; x->next = next;     
    return x;                         
  }
Graph GRAPHinit(int Vmax)
  { int i;
    Graph G = malloc(sizeof *G);
    G->adj = malloc(Vmax*sizeof(link));
    G->pos = malloc(Vmax*sizeof(Point));
    G->V = 0; G->E = 0;
    for (i = 0; i < Vmax; i++) G->adj[i] = NULL;
    return G;
  }
int GRAPHcntE(Graph G)
  { return G->E; }
int GRAPHcntV(Graph G)
  { return G->V; }
void GRAPHinsertE(Graph G, Edge e)
  { link t; 
    int i = e.v1, j = e.v2;
    if (i == j) return;
    if (i+1 > G->V) G->V = i+1;
    if (j+1 > G->V) G->V = j+1;
    G->adj[i] = NEW(j, G->adj[i]);
    G->adj[j] = NEW(i, G->adj[j]);
    G->E++;
  }
void GRAPHinitV(Graph G, int i, Point p)
  { G->pos[i] = p; }
void GRAPHshow(Graph G)
  { int i, dx, dy; link t;
    printf("%%!\n");
    printf("36 36 translate .5 setlinewidth\n");
    printf("/pt { 2 copy gsave newpath 1 0 360 arc fill grestore } def\n");
    printf("/pt { } def\n");
    printf("/MM { 14 div exch 18 div exch pt moveto } def\n");
    printf("/LL { 14 div exch 18 div exch pt lineto stroke } def\n");
    for (i = 0; i < G->V; i++)
      {
        for (t = G->adj[i]; t != NULL; t = t->next)
          {
            dx = G->pos[i].x - G->pos[t->v].x;
            dy = G->pos[i].y - G->pos[t->v].y;
            if (dx*dx + dy*dy > 0) 
              printf("%6d %6d MM %6d %6d LL\n", 
                G->pos[i].x, G->pos[i].y,
                G->pos[t->v].x, G->pos[t->v].y);
          }
      }
    printf("showpage\n");
  }

