Mathematically, a graph is a set of vertices and edges, thus a graph `G`

is usually written as `G(V,E)`

. Besides linking vertices in the graph, edges can also carry a specific value which may be interpreted as cost, weight, distance etc.

In computer science, we’re interested in the (abstract) data structure used to implement the graph mathematical concept. Let’s first discuss the basic elements in a graph - vertices and edges:

```
typedef struct vertex
{
unsigned long id;
int status;
double x,y;
void* data;
} vertex;
```

Vertices should be able to hold any kind of data, so we’ll just throw in a void pointer for that. Other than that we have an id, status (marked or unmarked - more on that later) and 2D coordinates so we can draw the vertices somewhere.

```
typedef struct edge
{
vertex* from, *to;
int cost;
} edge;
```

Edges consist of just pointers to the vertices they link and an optional value used as weight, distance, cost etc. Strictly speaking we could use a void pointer for that value as well, as long as we also defined a comparison function. But let’s save the hassle and just use an integer instead - most algorithms will be fine with that.