Так что я должен создать связанный список для класса, и я застрял с моим 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;
}
Я пропустил некоторый код, потому что я не думал, что перечисление других функций, которые работали должным образом, было необходимо для понимания сути. Если бы вы хотели все, я мог бы опубликовать это.
Я думаю, что это решило мои проблемы.
Ваша проблема в том, что вы не устанавливаете итератор.
Лично я не включил бы это как часть класса и имел бы что-то вроде begin()
или же head()
который извлекает экземпляр класса итератора с указателем заголовка. Тогда current
и итерационные методы будут частью вашего итерационного класса.
Но для вашего текущего дизайна вы можете проверить push_front
чтобы увидеть, является ли итератор NULL, и если так, установите его равным head. Или вы могли бы иметь begin_iteration
метод, который устанавливает его в заголовок, который также позволит вам сделать более одной итерации по списку.
редактировать
Теперь, когда вы раскрыли всю свою реализацию, вам нужно установить iterator
в 2 местах. В конце push_front
и если нет головы в push_back
, Другими словами, где бы вы ни находились head
Вам нужно установить итератор.
Также как вы продвигаете итератор вперед? Можете ли вы перезапустить итерацию?
Других решений пока нет …