Member 14065791 Ответов: 1

Как сделать круговой двусвязный список?


Я попытался составить круговой двусвязный список.Вот мой код.Он ничего не печатает. Я думаю, что оператор "If, Else", который находится в функции insertAfterLast, имеет некоторую проблему. В течение двух часов я ничего не соображаю. должен ли я использовать цикл "while" для поиска последнего узла?

Что я уже пробовал:

#ifndef CIRCULARDLL_H
#define CIRCULARDLL_H
#include <iostream>
#include "Node.h"
class CircularDLL
{
private:
    NodePtr  top;

public:
    void insertDataFromFile();
    void print();
    void insertAfterLast(int id, string name, string email, int age);
};


-----------------------------------------------
(circularDLL.cpp)
 #include "CircularDLL.h"

 void Circular::insertAfterLast(int id, string name, string email, int age)
{
    NodePtr *newNode= new Node;
    newNode->stId = id;
    newNode->stName = name;
    newNode->stEmail = email;
    newNode->stAge = age;

        if (top == NULL)
        {
            top = newNode;
            return;
        }


        if (top->before == top) // Only one node in the list
        {
            top->next = newNode;
            top->before = newNode;
            newNode->next = top;
            newNode->before = top;
        }
        else
        {
            newNode->before= top->before;
                     top->before->next = before;
                    top->before= before;
                    before->next = top;
        }
}

-----------------------------------------------
#ifndef NODE_H
#define NODE_H

typedef Node* NodePtr;

class Node
{
    friend class CircularDLL;

private:
    int stId;
    string stName;
    string stEmail;
    int stAge;
    NodePtr next;
    NodePtr before;

};

1 Ответов

Рейтинг:
12

CPallini

Ты пропустил кое-что из инициализации. Более того, ваш код для вставки узлов выглядит не совсем корректным, на мой взгляд. Попробуй

// (circ.hpp)
#ifndef CIRCULARDLL_H
#define CIRCULARDLL_H
#include <string>

class Node
{
  friend class CircularDLL;

private:

  void print();
  int stId;
  std::string stName;
  std::string stEmail;
  int stAge;
  Node * next;
  Node * prev;
};

typedef Node* NodePtr;

class CircularDLL
{
private:
  NodePtr  top;

public:
  CircularDLL():top(nullptr){}
//  void insertDataFromFile();
  void print();
  void printBackward();
  void insertAfterLast(int id, const std::string & name, const std::string & email, int age);
};
#endif // CIRCULARDLL_H

// (circ.cpp)
#include "circ.hpp"
#include <iostream>

void Node::print()
{
  std::cout << "{" << stId << ", " << stName << ", " << stEmail << ", " << stAge << "}\n";
}

void CircularDLL::insertAfterLast(int id, const std::string & name, const std::string & email, int age)
{
  NodePtr newNode = new Node;
  newNode->stId = id;
  newNode->stName = name;
  newNode->stEmail = email;
  newNode->stAge = age;

  if ( ! top )
  {
    top = newNode;
    top->next = top;
    top->prev = top;
  }
  else
  {
    NodePtr np = top;
    while ( np->next != top)
    {
      np = np->next;
    }
    np->next = newNode;
    newNode->prev = np;
    newNode->next = top;
    top->prev = newNode;
  }
}

void CircularDLL::print()
{
  if ( ! top )
  {
    std::cout << "(empty)\n";
    return;
  }

  NodePtr np = top;
  do
  {
    np->print();
    np = np->next;
  } while (np != top);
}

void CircularDLL::printBackward()
{
  if ( ! top )
  {
    std::cout << "(empty)\n";
    return;
  }
  NodePtr np = top->prev;
  do
  {
    np->print();
    np = np->next;
  } while ( np != top->prev);
}

int main()
{
  CircularDLL cd;
  cd.insertAfterLast( 1, "foo", "foo@foo.com", 42 );
  cd.insertAfterLast( 3, "bar", "bar@bar.com", 24 );
  cd.insertAfterLast( 11, "goo", "goo@goo.com", 2448 );

  std::cout << "printing with forward iteration\n";
  cd.print();
  std::cout << "printing with backward iteration\n";
  cd.printBackward();
  std::cout << std::endl;
}