Я новичок в 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;
}
Вам нужно установить голову.
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;
}
Всего несколько комментариев. Сначала вы хотите использовать правильные отступы. Для новичка важно научиться писать простой 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. Вы можете пройти через это и выяснить, где ваша проблема. Ваша начальная проблема — ошибка сегментации. Попробуйте запустить исходную программу и посмотреть, где она заканчивается.