swap_files
слишком сложно. Вполне достаточно просто поменять местами данные:
void swap_files(t_file *file, t_file *next)
{
char *tmp = file->name;
file->name = next->name;
next->name = tmp;
}
И угадайте что? Это решило проблему.
В комментариях ниже было упомянуто два вопроса с этим решением, и я хотел бы их решить. Во-первых, этот код может быть менее эффективным, если имеется много полей данных, а во-вторых, есть вероятность, что вы забудете поле.
Маловероятно, что это будет узким местом, и, если это так, займитесь этим тогда, а не раньше. И когда есть только одно поле, этот код гораздо эффективнее. Утверждение против определенного метода, потому что было бы медленнее, если бы обстоятельства были другими, не является хорошим аргументом.
Забыть поле - веский аргумент против этого. У меня нет возражений там.
Решение обоих вышеперечисленных вопросов заключается в создании второй структуры данных, например:
struct data {
char * name;
int age;
char * address;
/* More fields */
}
struct s_file {
struct data *data;
struct s_file *next;
struct s_file *previous;
}
Вы можете спорить за или против этого. В некотором смысле это не «похоже на C», но, с другой стороны, вы получаете хорошее разделение обязанностей.