Этот код используется для поворота односвязного списка на один правый узел.
Давайте рассмотрим это утверждение
c = b->next;
указатель b
после этого объявления
struct node* b = list
указывает на элемент со значением 66
b = 66, 9, 14, 52, 87, 14, 17
То есть c указывает на следующий элемент со значением 9` (b-> next).
Затем после этого оператора
b -> next = NULL;
мы имеем
66, NULL, 9, 14, 52, 87, 14, 17
^
|
c
Но после предыдущего фрагмента кода
while(a->next != NULL) // run until a points to the last element (17)
a = a->next;
a->next = b
последний режим со значением 17 указывает на предыдущий первый узел со значением 66.
В результате вы получите
c = 9, 14, 52, 87, 14, 17, 66, NULL