@sddvxd

Объясните пожалуйста смысл строк(указатели)?

Здравствуйте! Делаю класс очереди по примеру

//head.h

//Any classes....
class Queue{
private:
  struct Node
  {
    String str; //Мой класс
    Node *next;
  };
  enum{
    Q_SIZE = 10
  };
  int items;
  const int qsize;
  Node *front,*rear;
public:
  Queue(int);
  bool isfull()const;
  bool isempty()const;
  bool enqueue(const String&);
};


Объект может добавлять в очередь, проверять на заполненность и пустоту

//func.cpp

//Any methods...
Queue::Queue(int qs = Q_SIZE):qsize(qs),front(nullptr),rear(nullptr),items(0){}
bool Queue::isfull()const{
  if(items==qsize)return true;
  else return false;
}
bool Queue::isempty()const{
  if(items==0)return true;
  else return false;
}
bool Queue::enqueue(const String &st){
  if(isfull())return false;
  Node *add = new Node;
  add->str = st;
  add->next = nullptr;
  items++;
  if(front==nullptr)front = add;
  else rear->next = add;
  rear = add;
  cout<<st<<" posted in "<<add<<" end has "<<items<<" position\n";
  return true;
}


Мне не совсем понятно, зачем сначала в поле структуры записывать адрес следующей структуры, а затем присваивать адрес новой структуры в конец очереди

if(front==nullptr)front = add;
  else rear->next = add;
  rear = add;


Таких "ужасных" отступов в книге нет. Я по своему писал
  • Вопрос задан
  • 155 просмотров
Решения вопроса 2
JaxxDexx
@JaxxDexx
Очень просто! Когда вы добавляете новый элемент в свою очередь, rear указывает на ваш последний элемент в очереди. Его next установлен в nullptr, поэтому чтобы не потерять связь между последним элементом в очереди и тем, который вы добавляете, вы устанавливаете указатель rear->next на адрес нового элемента. А после этого всей своей очереди говорите, что теперь новый элемент имеет адрес add (rear = add).
Ответ написан
@Mercury13
Программист на «си с крестами» и не только
Перед нами структура данных под названием «односвязный список». У каждого элемента ссылка на следующий, у всей очереди ссылка на голову (front) и иногда на хвост (rear).

Для чего нужна проверка на заполненность — непонятно, ведь ёмкость списка не ограничена и единственный способ убедиться, что очередь полна — завести память под новый элемент. Выпадает авария std::bad_alloc — значит, памяти не хватило. Если только для каких-то прикладных нужд: так, в StarCraft очередь на строительство пять юнитов, и точка. (Есть другой тип очереди, т.н. циклическая очередь — вон там ограничено.)

Как работает enqueue: создаём новый элемент, следующий за ним — nullptr. Если очередь пуста, направляем на него front и rear. В противном случае пристраиваем его за тем, на который «смотрит» rear, и перенаправляем rear. Таким образом, «направляем rear» можно вынести за скобки, а остальные два исполнить в зависимости от пустоты очереди.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы