Проблема с вашим вопросом заключается в том, что список хранится в обратном направлении, и у вас есть указатель на предыдущий , вместо следующий .Это должно было быть частью вопроса (мне потребовалось некоторое время, чтобы понять это).
На самом деле, вы используете head , когда, вероятно, tail было бы лучше.Вам следует рассмотреть возможность хранения указателя на фактическую head и избегать копирования таким способом.В этом случае вам нужно будет только настроить указатели.Если ротация будет обычной задачей, то сохранение и обновление дополнительного указателя, возможно, в структуре list , окупит усилие (может изменить задачу с O (n) на O (1)).
struct _list {
node * tail;
node * head;
};
typedef struct _list list;
В любом случае, проблема с вашей функцией поворота заключается в том, что вы начинаете с ходьбы и преды в том же узле, head.
void rotate(node** head){
node* walk= (*head);
node* prev=(*head)->p;
char temp= walk->digit;
while(prev!=NULL){
walk->digit=prev->digit;
walk= prev;
prev = prev->p;
}
walk->digit=temp;
}