0

私は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;

}
4

2 に答える 2

1

ヘッドを設定する必要があります。

  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;
    }
于 2016-09-29T04:20:11.977 に答える
0

ほんの少しのコメント。まず、適切なインデントを使用します。初心者にとっては、簡単な 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;
}

ディレクトリ内の両方のファイルで、次のように入力します

作る

バイナリ ファイルのダブルリンクがディレクトリに表示されます。
名前を入力して、このプログラムを実行します。

$ ダブルリンク 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. それをステップスルーして、問題がどこにあるかを把握できます。最初の問題は、セグメンテーション違反です。元のプログラムを実行して、どこで終了するかを確認してください。

于 2016-09-29T05:39:13.163 に答える