删除循环双向链表中给定位置的节点

时间:2021-06-05 06:36:38

标签: c

我在“媒体播放器”中工作我需要使用循环双向链表来存储所有歌曲,但是我需要一个函数来删除给定位置的节点,我的函数似乎在那里运行良好超过 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);
    }
}

示例: 我的清单是:

  1. 加利福尼亚酒店 - 老鹰队 - 1996
  2. Creep - Radiohead - 1993

删除歌曲 2 后我的列表是:

  1. 加利福尼亚酒店 - 老鹰队 - 1996

删除歌曲 1 后,我的列表应该是空的,但它会一直显示已删除的节点,直到我添加新节点。

  1. 加利福尼亚酒店 - 老鹰队 - 1996

0 个答案:

没有答案