Ошибка лежит в swapSong
.Существует два возможных способа обмена элементами в списке:
- либо вы меняете данные и не касаетесь
next
указателей - , либо не касаетесь данных, добавляете указатели изменений
Первый вариант проще для односвязного списка с небольшим количеством внутренних данных (это ваш вариант использования), второй больше для двусвязных списков.
Здесь просто измените swapSong
на:
void swapSong(Song* head,Song* Source, int id) {
Song* tempSong = (Song*)malloc(sizeof(Song));
Song* currentSong = head;
while(currentSong && currentSong->id != id){
currentSong = currentSong->next;
}
if (currentSong) {
tempSong->id = currentSong->id;
tempSong->name = currentSong->name;
tempSong->artist = currentSong->artist;
//tempSong->next = currentSong->next;
currentSong->id = Source->id;
currentSong->name = Source->name;
currentSong->artist = Source->artist;
//currentSong->next = Source->next;
Source->id = tempSong->id;
Source->name = tempSong->name;
Source->artist = tempSong->artist;
//Source->next = tempSong->next;
free(tempSong);
}
else {
printf("The list is empty.");
}
}
Кстати, в Song
struct, id
объявляется как int *
, а используется как int
.Измените следующее, чтобы удалить некоторые предупреждения:
typedef struct Song {
int id;
char* name;
char* artist;
struct Song* next;
}Song;
И, как заметил @ 500-InternalServerError, вам не нужно выделять что-либо в swapSong
: просто используйте локальную структуру:
void swapSong(Song* head,Song* Source, int id) {
Song* currentSong = head;
while(currentSong && currentSong->id != id){
currentSong = currentSong->next;
}
if (currentSong) {
Song tempSong = *currentSong;
currentSong->id = Source->id;
currentSong->name = Source->name;
currentSong->artist = Source->artist;
Source->id = tempSong.id;
Source->name = tempSong.name;
Source->artist = tempSong.artist;
}
else {
printf("The list is empty.");
}
}