从双向链表中删除特定节点(在c中) - 不能删除尾部

时间:2018-05-27 04:48:32

标签: c linked-list doubly-linked-list

我试图从双向链表中删除一个节点。当我删除的节点是列表头时,我的功能工作,但如果它是另一个节点则不行。当我使用列表尾部测试时,程序永远不会结束。

我认为它与我的循环有关,并且它没有到达正确的节点或没有正确地重新连接列表。

如果您有任何想法或需要更多信息,请与我们联系。感谢您提供任何帮助。

标题中的相关信息:

    #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;
    }

0 个答案:

没有答案