我在“媒体播放器”中工作我需要使用循环双向链表来存储所有歌曲,但是我需要一个函数来删除给定位置的节点,我的函数似乎在那里运行良好超过 1 个节点,但如果只有一个节点,它将继续显示已删除的节点,直到我将另一首歌曲添加到列表中。
我的头文件。
typedef struct node Node;
typedef struct smediaplaylist Smediaplaylist;
struct node {
char name[26];
char artist[26];
int date;
Node *prev;
Node *next;
};
struct smediaplaylist {
Node *head;
Node *tail;
};
删除函数:
void delete_song(Node** head,int position){
// IF LIST IS EMPTY
if ((*head) == NULL || position <= 0){
printf(RED"\nNo existe la cancion en la lista de reproducción\n"R3SET);
}
if((*head)!=NULL || position>0){
Node* new_node = (*head);
// SEARCH NODE POSITION
for (int i = 1; new_node != NULL && i < position; i++){
new_node = new_node->next;
}
// IF GIVEN POSITION IS > THAN AMOUNT OF NODES
if (new_node == NULL){
printf(RED"\nLa cancion no esta dentro de la lista de reprodución\n"R3SET);
}else{
// WE SEND THE NODE TO DELETE TO DELETE NODE FUNCTION
deleteNode(head,new_node);
}
}
}
void deleteNode(Node** head, Node* tobedelete){
char choice;
printf(YELLOW"\nDatos de la canción a eliminar:"R3SET);
printf(CYAN"\nNombre de la cancíon:%s",tobedelete->name);
printf("\nNombre del artista:%s",tobedelete->artist);
printf("\nAño de lanzamiento:%d"R3SET,tobedelete->date);
printf(YELLOW"\nDesea eliminar[S/N]:"R3SET);
getchar();
scanf("%c",&choice);
if(choice=='S'){
if ((*head)== NULL || tobedelete == NULL){
return;
}
// IF NODE IS THE HEAD OF OUR LIST
if ((*head) == tobedelete){
(*head) = tobedelete->prev;
}
// RE LINK NODE ONLY IF NEXT NODE ISN'T NULL
if (tobedelete->next != NULL){
tobedelete->next->prev = tobedelete->prev;
}
// RE LINK PREVIUS NODE ONLY IF IS'NT FIRST NODE
if (tobedelete->prev != NULL){
tobedelete->prev->next = tobedelete->next;
}
// FREE NODE
free(tobedelete);
printf(GREEN"\nCanción eliminada correctamente...\n\n"R3SET);
}if(choice=='N'){
printf(GREEN"\n Operación abortada\n\n"R3SET);
}
fflush(stdin);
if(choice!='S' && choice!='N'){
printf(RED"\n Operacion cancelada no se ingreso una opcion valida\n"R3SET);
}
}
示例: 我的清单是:
删除歌曲 2 后我的列表是:
删除歌曲 1 后,我的列表应该是空的,但它会一直显示已删除的节点,直到我添加新节点。