C++で最初のLinkedListクラスを実装しようとしていますが、ポインタの削除に問題があります。LinkedListクラスのポインタを削除する
LinkedList.h:LinkedList.cppの
#pragma once
#ifndef LINKEDLIST_H
#define LINKEDLIST_H
#include <iostream>
#include "ListNode.h"
class LinkedList
{
private:
int theSize;
ListNode* head;
ListNode* tail;
public:
LinkedList();
~LinkedList();
LinkedList(const LinkedList&);
const LinkedList& operator=(const LinkedList&);
void push_front(const Line&);
void push_back(const Line&);
void pop_front();
void pop_back();
int const size();
bool const empty();
void insert(const Line&, int);
void remove(int);
void print();
void print(int);
};
#endif //!LINKEDLIST_H
部:
LinkedList::LinkedList() : theSize{ 0 }, head{ nullptr }, tail{ nullptr } {
}
//Destructor: Need to go through entire list and delete one by one
LinkedList::~LinkedList() {
if (!empty()) {
cout << "Destroying List" << endl;
ListNode* currPtr{ head };
ListNode* tempPtr{ nullptr };
while (currPtr != nullptr) {
tempPtr = currPtr;
currPtr = currPtr->next;
delete tempPtr;
}
}
}
//LinkedList::LinkedList(const LinkedList& ll) {
//
//}
//const LinkedList& LinkedList:: operator=(const LinkedList& ll) {
//
//}
void LinkedList::push_front(const Line& l) {
ListNode* ln = new ListNode(l);
if (empty())
head = tail = ln;
else {
ln->setNext(*head);
(*head).setPrev(*ln);
head = ln;
}
theSize++;
}
void LinkedList::push_back(const Line& l) {
ListNode* ln = new ListNode(l);
//If List is empty, head and tail will point to one node
if (empty())
head = tail = ln;
else {
(*tail).setNext(*ln);
(*ln).setPrev(*tail);
tail = ln;
}
theSize++;
}
void LinkedList::pop_front() {
if (empty())
return;
else {
ListNode* tempPtr = head;
if (head == tail) //If there is only one Node in the List
head = tail = nullptr;
else
head = head->next;
delete tempPtr;
}
//theSize--;
}
ListNode.h:
#pragma once
#ifndef LISTNODE_H
#define LISTNODE_H
#include<iostream>
#include"Line.h"
//using namespace::std;
class ListNode
{
friend class LinkedList;
private:
Line data;
ListNode* next;
ListNode* prev;
public:
ListNode();
~ListNode();
ListNode(const Line&);
ListNode(const Line&, ListNode*, ListNode*);
Line& getData();
ListNode& getNext();
ListNode& getPrev();
void setData(const Line&);
void setNext(ListNode&);
void setPrev(ListNode&);
friend ostream& operator<<(ostream&, const ListNode&);
friend istream& operator>>(istream& input, ListNode&);
};
pop_front()メソッドは、単純に最初のノードを削除リンクされたリスト:
void LinkedList::pop_front() {
if (empty())
return;
else {
ListNode* tempPtr = head;
if (head == tail) //If there is only one Node in the List
head = tail = nullptr;
else
head = &((*tempPtr).getNext()); //getNext() returns a Node&
//delete tempPtr;
}
}
私のメインでは、LinkedListを作成し、いくつかのノードを追加しています。これはうまくいきます。 pop_front()メソッドは、最後にdeleteステートメントを含めるまで正常に動作します。このとき、実行時エラーが発生します。なぜそれが動作していないのか分かりません。これは二重にリンクされたリストです。
それは混乱しています。二重リンクリストはどういう意味ですか?実行コード、初期化コードとは何ですか?そして、 'head =&((* tempPtr).getNext());'は一時インスタンスのポインタを返します.getNext()はNodeを返します。それがNode&を返すなら、問題はありません、それは動作します。 STLの 'std :: list'を使うべきでしょう。 –
GLCraft
はい、Node&sorryを返します。まだC++には新しく、私はJavaの背景から来ています。二重リンクリストでは、各ノードが次のノードと前のノードを指していることを意味します。 – lebman
@lebman何がうまくいかないかを知るためには、頭と尾の簿記を見ておく必要があります。そんなことを尋ねるときは、いつも[MCVE]をあなたの質問に入れてください。 –