You have three cs there:
line 51
line 55
line 59
Your loop will never terminate because every c is always == first (so no matter which of the three the compiler chooses to use you've got an infinite loop).
Make sure to use just one c.
Also, watch how many times you change first. You want to bump it just once (if I understand you right).
void print() {
listitem *c=first;
if (c) {
printf("%d\n", *c);
c=first=first->next;
do{
printf("%d\n", *c);
c=c->next;
}while (c != first);
}
}
Hope this helps.
[edit] BTW. What if your circular list has just one item? (It will get printed twice.)