Справка по списку ссылок, проблемы с итераторами

Так что я должен создать связанный список для класса, и я застрял с моим List::Current() функция. По какой-то причине я получаю ошибку обработки, когда пытаюсь вызвать функцию.

list.h

class List {
private:
struct Node {
int data;
Node* next;

Node() : next(NULL){} //define our own default constructor
Node(int data) : next(NULL), data(data){}
};

typedef struct Node* NodeRef;

NodeRef head;
NodeRef tail;
NodeRef iterator; //points to one node at a time
int size;

public:
int current();

List.cpp

// initialize the values when they are instantiated
List::List() : head(NULL), tail(NULL), iterator(NULL), size(0)
{}

int List::current() {
return iterator->data;
}

void List::push_front(int data)             //Inserting a new node in     the front of the list
{
if (size == 0)                          //If there is no nodes in the        list, execute the if statement
{
head = new Node(data);              //create a new node, and have head point to it
iterator = tail = head;                     //have tail point to the new node also.

}
else                                    //If there are nodes in the list, execute the else statement
{
NodeRef newNode = new Node(data);   //create a new node
newNode->next = head;               //have the next pointer point to the head of the next node.
head = newNode;                     //have the head pointer point to the new node inserted at the beginning of the list
}
size++;                                 //Increment the size counter

}

void List::push_back(int data)              //Inserting a node at the end of a list
{
if (size == 0)                          //If there are no nodes in the list, execute the if statement
{
tail = new Node(data);              //Create a new node and have the tail pointer point to it.
iterator = head = tail;                     //Have the head pointer point to the new node also.
}
else                                    //If there is atleast 1 node in the list, execute the else statement
{
NodeRef newNode = new Node(data);   //Create a new node
tail->next = newNode;               //Have the tail
tail = newNode;                     //Have the tail pointer point to the new node.
newNode->next = NULL;
}
size++;

}
void List::begin() //Set the iterator to the head of the list
{
iterator = head;
}

void List::scroll() //Allows us to scroll through the list
{
if (iterator == NULL)
cout << "Iterator is pointing to null" << endl;
else
iterator = iterator->next;
}

LinkedList.cpp

#include "stdafx.h"#include "List.h"#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[]) {
List B; //Create a new list

B.push_front(5);
B.push_front(4);
B.push_front(3);
B.push_back(10);

cout << B.current() << endl;

system("PAUSE");
return 0;
}

Я пропустил некоторый код, потому что я не думал, что перечисление других функций, которые работали должным образом, было необходимо для понимания сути. Если бы вы хотели все, я мог бы опубликовать это.

Я думаю, что это решило мои проблемы.

0

Решение

Ваша проблема в том, что вы не устанавливаете итератор.

Лично я не включил бы это как часть класса и имел бы что-то вроде begin() или же head() который извлекает экземпляр класса итератора с указателем заголовка. Тогда current и итерационные методы будут частью вашего итерационного класса.

Но для вашего текущего дизайна вы можете проверить push_front чтобы увидеть, является ли итератор NULL, и если так, установите его равным head. Или вы могли бы иметь begin_iteration метод, который устанавливает его в заголовок, который также позволит вам сделать более одной итерации по списку.

редактировать

Теперь, когда вы раскрыли всю свою реализацию, вам нужно установить iterator в 2 местах. В конце push_frontи если нет головы в push_back, Другими словами, где бы вы ни находились headВам нужно установить итератор.

Также как вы продвигаете итератор вперед? Можете ли вы перезапустить итерацию?

1

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

Других решений пока нет …

По вопросам рекламы [email protected]