双向链接列表无法添加或删除有效条目

问题描述 投票:0回答:1

我已经运行了很多次。我尝试修复我的deleteNode()和addNode(),但没有成功。输出显示我无法在列表中添加一些有效条目,从而导致无法删除这些有效条目。有人请帮助我找到错误...我认为我的isEmpty()错误或addNode搞砸了。

// Add nodes and makes it work in any cases: backward/forward
bool LinkedList::addNode(int id, string str) {
    bool result = false;
    if (id >= 0 && !(idExists(id))) {
        Node *current = head;
        Node *temp = new Node;
        temp->data.data = str;
        temp->data.id = id;
        temp->forward = NULL;
        temp->back = NULL;

        // Kinds of adding cases
        if(head == NULL) {          // Check if list is empty
            addHead(temp, current);
            result = true;
        } else {
            while(temp->data.id > current->data.id && current->forward != NULL) {
                current = current->forward;
            }
            // Backward
            if(current->back == NULL) {
                if(temp->data.id > current->data.id) {
                    if(current->forward == NULL) {
                        addTail(temp, current);
                    } else {
                        addMiddle(temp, current);
                    }
                } else {
                    addHead(temp, current);
                }
                result = true;
            // Forward
            }else if(current->forward == NULL) {
                if (temp->data.id > current->data.id) {
                    addTail(temp, current);
                } else {
                    addMiddle(temp, current);
                }
                result = true;
            }else {
                if(temp->data.id > current->data.id) {
                    addMiddle(temp, current);
                    result = true;
                }
            }
        }
    }
    return result;
}

void LinkedList::addHead(Node *temp, Node *current) {
    if (head != NULL){
        temp->forward = current;
        current->back = temp;
        head = temp;
    } else {
        head = temp;
    }
}

void LinkedList::addMiddle(Node *temp, Node *current) {
    temp->forward = current;
    temp->back = current->back;
    current->back->forward = temp;
    current->back = temp;
}

void LinkedList::addTail(Node *temp, Node *current) {
    current->forward = temp;
    temp->back = current;
}

// Delete list
bool LinkedList::deleteNode(int id){
    bool result = false;
    if (idExists(id)) {
        Node *current = head;
        while (current->forward != NULL && current->data.id != id) {
            current = current->forward;
        }
        if (current->data.id == id && current->forward == NULL) {
            if (current->back == NULL) {        // Delete head
                delete current;
                head = NULL;
            } else {        // delete tail
                deleteTail(current);
            }
            result = true;
        } else if (current->data.id == id) {
            if (current->back == NULL)
                deleteHead(current);
            else            // delete middle
                deleteMiddle(current);
            result = true;
        }
    }
    return result;
}


// Helper delete functions
void LinkedList::deleteHead(Node *current) {
    head = current->forward;
    head->back = NULL;
    delete current;
}

void LinkedList::deleteMiddle(Node *current) {
        current->back->forward = current->forward;
        current->forward->back = current->back;
        delete current;
}

void LinkedList::deleteTail(Node *current) {
        current->back->forward = NULL;
        delete current;
}

bool LinkedList::getNode(int id, Data *data) {
    bool didGetNode = false;

    if (idExists(id)) {
        Node *current = head;
        while (current->forward != NULL && current->data.id != id) {
            current = current->forward;
        }
        data->id = current->data.id;
        data->data = current->data.data;
        didGetNode = true;
    }

    return didGetNode;
}

// Check whether or not the id exists
bool LinkedList::idExists(int id){
    bool exists = false;
    if (head != NULL){
        Node *current = head;
        while (current->forward != NULL && current->data.id != id) {
            current = current->forward;
        }
        if (current->data.id == id) {
            exists = true;
        }
    }
    return exists;
}

c++ data-structures linked-list doubly-linked-list
1个回答
0
投票

好像您想在addTail和其他函数中传递指向指针(**)的指针或指向引用(*&)的指针。

© www.soinside.com 2019 - 2024. All rights reserved.