распечатать двусвязный список — без результата

Я новичок в C ++ и программировании в целом. Я пытаюсь реализовать двусвязный список. Я думаю, что список создан успешно, но у меня возникают проблемы с его полной распечаткой. Можете ли вы сообщить мне, что не так с моим методом printListForward ниже? Мой код еще не завершен. Буду очень признателен за любые советы и предложения.

#include "MagicSquare.hpp"#include <iostream>

class MagicSquaresList{

private:

struct MagicSquaresNode{

int nodeIndex;
MagicSquaresNode *pleft;
MagicSquaresNode *pright;
MagicSquaresNode *pup;
MagicSquaresNode *pdown;
};

MagicSquaresNode *head;
MagicSquaresNode *tail;

public:
MagicSquaresList (){
head = NULL;
tail = NULL;
}

int getListLength(){
int length = 1;
MagicSquaresNode *temp = new MagicSquaresNode;
temp = head;

if(isEmpty()){
return 0;
}else{
while(temp != tail){
length++;
temp = temp->pright;
}
}
return length;
}

bool isEmpty(){
return head == NULL;
}

void appendToEnd(int val){
MagicSquaresNode *newNode = new MagicSquaresNode;
newNode->nodeIndex = val;

if(isEmpty()){
tail = newNode;
} else {
tail->pright = newNode;
newNode->pleft = tail;
}

tail = newNode;
}

void printListForward() {
MagicSquaresNode *ptr = head;

while(ptr != tail){
std::cout << ptr->nodeIndex << " ";
ptr = ptr->pright;
}

std::cout << std::endl;
}

};int main(){

/*********** temporary *****************/
int matrixSize, listSize;
matrixSize = 3;
listSize = matrixSize * matrixSize;
/****************************************/

MagicSquaresList list1;

for (int i = 1; i <= listSize; i++){
list1.appendToEnd(i);
}

list1.printListForward();
std::cout << list1.getListLength() << std::endl;
return 0;

}

0

Решение

Вам нужно установить голову.

  void appendToEnd(int val){
MagicSquaresNode *newNode = new MagicSquaresNode;
newNode->nodeIndex = val;

if(isEmpty()){
tail = newNode;
head = newNode;
} else {
tail->pright = newNode;
newNode->pleft = tail;
}

tail = newNode;
}
1

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

Всего несколько комментариев. Сначала вы хотите использовать правильные отступы. Для новичка важно научиться писать простой Makefile. В вашем случае я написал один для вас.

  1 bin_PROGRAMS=doublelink
2 GCCLIBDIR= /usr/local/lib64
3 CXXFLAGS=-g -std=c++11
4 CC=g++
5 LDFLAGS=-L$(GCCLIBDIR)
6
7 all : $(bin_PROGRAMS)
8
9 doublelink : doublelink.o
10    $(CC) $(CXXFLAGS) -o $@ $^ $(LDFLAGS)

Для вашего исходного кода я сделал простое редактирование и назвал ваш файл: doublelink.cpp:

//#include "MagicSquare.hpp"#include <iostream>

using namespace std;

class MagicSquaresList{
private:
struct MagicSquaresNode {
MagicSquaresNode(int ni) : nodeIndex(ni), pleft(0), pright(0), pup(0), pdown(0) { }
int nodeIndex;
MagicSquaresNode *pleft;
MagicSquaresNode *pright;
MagicSquaresNode *pup;
MagicSquaresNode *pdown;
};

MagicSquaresNode *head;
MagicSquaresNode *tail;

public:
MagicSquaresList () {
head = 0;
tail = 0;
}

int getListLength(){
MagicSquaresNode *temp = head;
if (temp == 0) {
return 0;
}
int length = 0;
while (temp != 0) {
++length;
temp = temp->pright;
}
return length;
}

bool isEmpty(){
return head == 0;
}

void appendToEnd(int val){
MagicSquaresNode *newNode = new MagicSquaresNode(val);
if (tail == 0) {
head = newNode;
}
else {
tail->pright = newNode;
newNode->pleft = tail;
}
tail = newNode;
}

void printListForward() {
MagicSquaresNode *ptr = head;
while (ptr != 0) {
//cout << ptr << endl;
std::cout << ptr->nodeIndex << " ";
ptr = ptr->pright;
}
std::cout << std::endl;
}

};int main(){
/*********** temporary *****************/
int matrixSize, listSize;
matrixSize = 3;
listSize = matrixSize * matrixSize;
/****************************************/

MagicSquaresList list1;

for (int i = 1; i <= listSize; i++){
list1.appendToEnd(i);
}

list1.printListForward();
std::cout << list1.getListLength() << std::endl;
return 0;
}

Когда оба файла в каталоге, вы набираете

делать

двойная ссылка на двоичный файл появится в вашем каталоге.
Вы запускаете эту программу, набрав ее имя:

$ doublelink
1 2 3 4 5 6 7 8 9
9

Но со всеми этими усилиями. Вы никогда не должны реализовывать двойной связанный список. Вы должны использовать стандартную библиотеку C ++ и настроить тип данных для ваших целей. Std :: list реализован как двойной связанный список. Пожалуйста, прочитайте документ на http://www.cplusplus.com/reference/list/list/. Вы должны создать свою структуру интересов

list<MagicSquare> myfancySquareList;

myfancySquareList.push_back(MagicSquare(somevalue));

В вашем двойном связанном списке также отсутствует деструктор, и у вас утечка памяти. Есть много других недостающих вещей из вашей реализации, которые обычно покрыты учебником из нескольких сотен страниц. Надеюсь, это поможет вам начать. Если у вас возникли проблемы, вы можете запустить вашу программу в режиме отладки: gdb doublelink. Вы можете пройти через это и выяснить, где ваша проблема. Ваша начальная проблема — ошибка сегментации. Попробуйте запустить исходную программу и посмотреть, где она заканчивается.

0

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