找到错误或内存泄漏

时间:2017-09-06 05:46:28

标签: c++11 linked-list

我在C ++中编写LinkedList程序 这是守则。找到错误和内存泄漏或其他任何东西。 我想写一个完美的代码。

#ifndef LEARN_REVERSELINKLIST_H
#define LEARN_REVERSELINKLIST_H

#include <string>
#include <utility>
#include <iostream>
#include <boost/assert.hpp>

class ReverseLinkList {
private:
    struct Node {
        std::string string;
        Node *Previous{};
        Node *Next{};
    };

    Node *head;
    Node *tail;

    int count;

public:
    ReverseLinkList();
    ~ReverseLinkList();

    void insert(std::string string);
    void insertAt(std::string string, int position);
    void iterator() const;
    void reverseIterator() const;
    void remove(const std::string &string);
    void removeAt(int position);
    int size() const;
    Node *getHead() const;
    Node *getTail() const;
};

#endif //LEARN_REVERSELINKLIST_H

这是CC文件

#include "ReverseLinkList.h"

    ReverseLinkList::~ReverseLinkList() {
    if (count != 0) {
        Node *temp = head;
        while (temp != tail->Next) {
            delete temp->Previous;
            temp = temp->Next;
        }
        tail = nullptr;
        head = nullptr;
    }
}

ReverseLinkList::ReverseLinkList()
        : head(nullptr), tail(nullptr), count(0) {
}

void ReverseLinkList::iterator() const {
    BOOST_ASSERT_MSG(count != 0, "List is empty");
    Node *temp;
    temp = head;

    while (temp != tail->Next) {
        std::cout << temp->string << std::endl;
        temp = temp->Next;
    }
}

void ReverseLinkList::reverseIterator() const {
    BOOST_ASSERT_MSG(count != 0, "List is empty");
    Node *temp;
    temp = tail;
    while (temp != head->Previous) {
        std::cout << temp->string << std::endl;
        temp = temp->Previous;
    }
}

void ReverseLinkList::insert(std::string string) {
    auto *newNode = new Node;
    newNode->string = std::move(string);
    count++;
    if (head == nullptr && tail == nullptr) {
        newNode->Previous = nullptr;
        newNode->Next = nullptr;
        head = newNode;
        tail = newNode;
    } else {
        tail->Next = newNode;
        newNode->Next = nullptr;
        newNode->Previous = tail;
        tail = newNode;
    }
}

int ReverseLinkList::size() const {
    return count;
}

void ReverseLinkList::remove(const std::string &string) {
    BOOST_ASSERT_MSG(count != 0, "List is empty");
    if (count == 1) {
        if (head->string == string) {
            delete head;
            head = nullptr;
            tail = nullptr;
        }
        count--;
        return;
    }

    if (head->string == string) {
        Node *temp;
        temp = head->Next;
        delete head;
        head = temp;
        head->Previous = nullptr;
        count--;
        return;
    }
    if (tail->string == string) {
        Node *temp;
        temp = tail->Previous;
        delete tail;
        tail = temp;
        temp->Next = nullptr;
        count--;
        return;
    }
    Node *temp;
    temp = head;
    bool verbose = true;
    while (temp != tail->Next) {
        if (temp->string == string) {
            verbose = false;
            break;
        }
        temp = temp->Next;
    }

    if (verbose) {
        std::cerr << "Node not present" << std::endl;
        return;
    }

    Node *previous, *next;
    previous = temp->Previous;
    next = temp->Next;

    delete temp;
    previous->Next = next;
    next->Previous = previous;
    count--;
}

void ReverseLinkList::insertAt(std::string string, int position) {
    if (position > count)
        return;

    if (position == 0) {
        if (head == nullptr) {
            insert(string);
            return;
        }
        auto *newNode = new Node;
        newNode->string = string;
        newNode->Previous = nullptr;
        head->Previous = newNode;
        newNode->Next = head;
        head = newNode;
        count++;
        return;
    }

    if (position == count - 1) {
        insert(string);
        return;
    }

    Node *temp;
    temp = head;
    while (position != 0) {
        temp = temp->Next;
        position--;
    }

    Node *next;
    next = temp->Next;

    auto *newNode = new Node;
    newNode->string = string;

    temp->Next = newNode;
    newNode->Previous = temp;
    newNode->Next = next;
    next->Previous = newNode;

    count++;
}

ReverseLinkList::Node *ReverseLinkList::getHead() const {
    return head;
}

ReverseLinkList::Node *ReverseLinkList::getTail() const {
    return tail;
}

void ReverseLinkList::removeAt(int position) {
    BOOST_ASSERT_MSG(count != 0, "List is empty");
    if (position > count)
        return;
    Node *temp;
    if (count == 1) {
        delete head;
        head = nullptr;
        tail = nullptr;
        count--;
        return;
    }

    if (position == 0) {
        temp = head->Next;
        delete head;
        head = temp;
        head->Previous = nullptr;
        count--;
        return;
    }
    if (position == count) {
        temp = tail->Previous;
        delete tail;
        tail = temp;
        tail->Next = nullptr;
        count--;
        return;
    }
    temp = head;
    while (position != 0) {
        temp = temp->Next;
        position--;
    }
    Node *previous;
    Node *next;

    previous = temp->Previous;
    next = temp->Next;
    delete temp;
    previous->Next = next;
    next->Previous = previous;
    count--;
}

我想有一些建议如何编写更好的代码并实现它。如果你想添加一些功能,请发帖。 我的下一步是使用模板

制作此代码

0 个答案:

没有答案