удалить конкретный узел из двусвязного списка (в c) - не могу удалить хвост - PullRequest
0 голосов
/ 27 мая 2018

Я пытаюсь удалить только один узел из двусвязного списка.Моя функция работает, когда удаляемый узел является заголовком списка, но не если это другой узел.Когда я тестирую, используя хвост списка, программа никогда не заканчивается.

Я думаю, что это как-то связано с моим циклом, и что он не достигает нужного узла или неправильно соединяет список.

Пожалуйста, дайте мне знать, если у вас есть идея или вам нужна дополнительная информация,Спасибо за любую помощь, которую вы можете оказать.

Соответствующая информация из заголовка:

    #include <stdio.h>
    #include <stdlib.h>

    typedef struct listNode{
        void *data;
        struct listNode *previous;
        struct listNode *next;
    } Node;

    typedef struct listHead{
        Node *head;
        Node *tail;
        void (*deleteData)(void *toBeDeleted);
        int (*compare)(const void *first,const void *second);
        void (*printData)(void *toBePrinted);
    } List;

    int deleteDataFromList(List *list, void *toBeDeleted);

Моя функция:

    #include <stdio.h>
    #include <stdlib.h>
    #include "LinkedListAPI.h"

    int deleteDataFromList(List *list, void *toBeDeleted){
        Node *temp = NULL;

        if(list == NULL || list->head == NULL || toBeDeleted == NULL) {
           return EXIT_FAILURE;
        }

        temp = list->head;

        while(temp != NULL){
            if(temp->data == toBeDeleted) {
              if(temp == list->head){
                 list->head = temp->next;
                 if(list->head != NULL){
                    list->head->previous = NULL;
                 }
              }
              else if(temp == list->tail){
                 if(temp->previous){
                    list->tail->previous->next = NULL;
                    list->tail = list->tail->previous;
                 }
              }
              else {
                 temp->previous->next = temp->next;
                 temp->next->previous = temp->previous;
              }

              list->deleteData(temp->data); 
              free(temp);
              temp = NULL;
              return EXIT_SUCCESS;
           }
        }
        return -1;
    }
...