Usually, in a race game you have to be at the checkpoint for it to be validated : you just check that the car is close enough from the checkpoint. So, I think the following pseudo-code would be valid:
if( car is_near current_checkpoint )
current_checkpoint = current_checkpoint->next_checkpoint;
is_near: return distance(car, current_checkpoint) < some value
The for distance test, you can either use a simple circle shape (as shown in the pseudo-code), or you can test whether the car hits the bounding box of the checkpoint (or a box that is place inside the checkpoint), it depends on how your checkpoints are made.
Or else, you can have a curve made by all the lines from checkpoints to their followers, and then find the closest line on where it is on it, from which you can find the next checkpoint. Example:
o--o
/ \
o-----------------o \
/ \ <-- your track: S = start
/ o E = end
/ o---o X / o = checkpoint
S / \ . / X = car
/ o------.----o
/ ^
E--o |
closest road from the car
Inconvenient: results may vary depending of the curvature of the roads.
I advise you to use the first method I described.