Связанный список и разочарование в динамическом размещении Stack Overflow

Вот код ссылки:

#include <iostream>
using namespace std;

class linkedList {

struct listNode{ //a node of a list
int value;
struct listNode *next;
};

listNode *head;

public:
linkedList(){
cout << "hello1\n";
head = NULL;
};

linkedList(listNode* a){
cout << "hello2\n";
head = a;
};

~linkedList();
listNode* getHead() {return head;}

void appendNode(int);

//inline Search function due to unable to function outside of class definition
listNode* rangeSearch(int a, int b){
//listNode to search
listNode *search = head;
//listNode* toReturn = new listNode;
//listNode to return list of values that are found within range
linkedList *found = new linkedList;

while(search){
//if the current value is within range, then add to list
if(search->value >= a && search->value <= b){
//append searched value onto found
found->appendNode(search->value);
//after appending, go to next value
}
search = search->next;
}

return found->getHead();
}

void display();
};int main()
{
cout << "Programmer  : n\n";
cout << "Description : \n";
linkedList* list = new linkedList;
int x = 12;
//values to search
int s1 = 10, s2 = 14;

// adds 2 to each number on list for 5 times
for(int i = 0; i < 5; i++){
list->appendNode(x);
x += 2;
}

//create something to hold pointer of found to be deleted when done using

//print list
cout << "Original set of numbers in linked list: ";
list->display();
cout << "\nThe following are the values withing ranges: " << s1 << " and " << s2 << ":\n";

//EDITED:
//list->rangeSearch(s1,s2);
linkedList foundList(list->rangeSearch(s1,s2));
foundList.display();
//End of edit 6:40PM 7/18/13

cout << "\nHere are the original set of numbers in linked list (again): ";
list->display();
delete list;
return 0;
}void linkedList::appendNode(int newValue)
{
listNode *newNode = new listNode();  // To point to a new node
listNode *nodePtr;  // To move through the list

// Allocate a new node and store newValue there.
newNode->value = newValue;
newNode->next = 0;

// If there are no nodes in the list
// make newNode the first node.
if (!head)
head = newNode;
else  // Otherwise, insert newNode at end.
{
// Initialize nodePtr to head of list.
nodePtr = head;

// Find the last node in the list.
while (nodePtr->next)
nodePtr = nodePtr->next;

// Insert newNode as the last node.
nodePtr->next = newNode;
}
}

void linkedList::display() {
for(listNode* p = head; p != NULL; p = p->next)
cout << p->value << ' ';
}

linkedList::~linkedList()
{
cout << "\ndestructor called";
listNode *nodePtr;   // To traverse the list
listNode *nextNode;  // To point to the next node

// Position nodePtr at the head of the list.
nodePtr = head;

// While nodePtr is not at the end of the list...
while (nodePtr != NULL)
{
// Save a pointer to the next node.
nextNode = nodePtr->next;

// Delete the current node.
delete nodePtr;

// Position nodePtr at the next node.
nodePtr = nextNode;
}
}

Итак, пара вопросов здесь. Во-первых, почему, когда я пытаюсь поместить функцию-член rangeSearch вне определения класса, компилятор выдает ошибку, говоря, что тип listNode * не распознан?

Во-вторых, это связано с деструкторами. В этой программе 2 экземпляра (список & найден список), но был вызван только 1 деструктор. Может кто-нибудь объяснить почему? Моя интуиция говорит мне, что динамически размещенный указатель на объект LinkList не был уничтожен. Однако я не знаю почему. Причина, по которой мне пришлось использовать динамически распределенную память, заключается в том, что я хочу передать указатель на основную функцию. Если я не сделаю этого, при выходе из RangeSearch указатель будет передан обратно в main, но любой список, в котором был указан указатель, будет деконструирован после
вернуть ptr; (предположим, что ptr — указатель на связанный список, объявленный в rangeSearch)
что приведет к сбою моей программы, потому что теперь в адресе ничего нет, и я пытаюсь вызвать … ничего.

Ну, как обычно, я был бы признателен любому великому самаритянину, который был бы более чем готов рассказать мне больше об этом.

2

Решение

Во-первых, у вас возникла проблема со сферой. В C ++ фигурные скобки определяют новую область видимости, поэтому вы определяете listNode внутри связанного класса класса. Если вы хотите получить к нему доступ, вам придется использовать оператор области видимости в качестве связанного списка :: listNode

Я не совсем понимаю ваш второй вопрос. Я вижу только один вызов для удаления, так как вы думаете, почему будут вызваны два деструктора? Деструкторы вызываются только когда вы вызываете delete, поэтому, если вы не укажете, что хотите уничтожить его, он все равно будет там.

Хотя я не совсем понимаю ваш вопрос, я вижу, что вы вернули указатель на голову в rangeSearch, но вы никому его не назначаете. Это означает, что у вас будет утечка памяти; Вы выделили память для найденного, но ничего с этим не сделали. На самом деле, поскольку вы возвращаете только заголовок, вы все равно не сможете удалить его, если назначите ему что-то, потому что у вас не будет доступа к самому связанному списку.

1

Другие решения

Ссылочный узел вложен в связанный список. Переместите listNode за пределы класса connectedList, и вы не получите первую ошибку. Или вы можете использовать его полное объявление, connectedList :: listNode. Кроме того, если вы оставите linkNode вложенным, вам придется сделать его публичным.

В основном можно просто сказать

linkedList list;

вместо

linkedList* list = new linkedList;

rangeSearch () возвращает значение, но это значение никогда не присваивается чему-либо в main (). rangeSearch () выделяет связанный список, но он никогда не удаляется.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector