Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++]Простейший дек


Автор: dLEX 11.4.2008, 12:12
Помогите мне сделать простейший дек. Простейший значит без классов и т. п.
За рание спасибо.

Автор: baldina 11.4.2008, 12:37
поможем. что уже сделано, каке есть соображения по реализации?

Автор: JackYF 11.4.2008, 14:15
Цитата(dLEX @  11.4.2008,  11:12 Найти цитируемый пост)
Простейший значит без классов и т. п.

и чем должен быть дек, если не классом? smile

Автор: archimed7592 11.4.2008, 14:26
Цитата(JackYF @  11.4.2008,  14:15 Найти цитируемый пост)

и чем должен быть дек, если не классом? smile 

Ты не поверишь, но в С, где классов нет в принципе, тоже используют деки smile.

Автор: dLEX 11.4.2008, 14:40
Соображений в целом нет, так только немного разобрался с push

Автор: archimed7592 11.4.2008, 14:44
Ок, для дека понадобится
1. Структура в которой будешь хранить узлы.
2. Ф-ции
  - create
  - pushBack
  - popBack
  - pushFront
  - popFront
  - destroy

С чем конкретно из этого проблемы в реализации или понимании?

Автор: JackYF 11.4.2008, 16:41
Цитата(archimed7592 @  11.4.2008,  13:26 Найти цитируемый пост)
Ты не поверишь, но в С, где классов нет в принципе, тоже используют деки

Поверю. Но, исходя из названия темы, у нас С++ smile

Автор: baldina 11.4.2008, 17:00
dLEX, в качестве базовой структуры проще всего использовать список. Т.к. вставка/удаление ведется с обоих концов, то - двунаправленный.

Автор: archimed7592 11.4.2008, 17:02
Проще всего воспользоваться std::deque... Ну это так, к слову... smile

Автор: dLEX 12.4.2008, 10:15
У меня проблемы с пониманием программирования вообще, пытался по книге разобраться, но пока не очень получается, а программа нужна сейчас.

Автор: archimed7592 12.4.2008, 13:22
Цитата(dLEX @  12.4.2008,  10:15 Найти цитируемый пост)
а программа нужна сейчас

Ок, здесь помогут.

Автор: baldina 12.4.2008, 15:27
это ну очень простой дек целых чисел. при попытке чтения из пустого дека возвращается 0.
попробуй разобраться. 
кстати тут уже и до классов недалеко

Код

#include "iostream"

struct Node {
  Node *prev; 
  Node *next; 
  int data;   
};

struct Deque {
  Node *first; 
  Node *last;  
};

void init (Deque& deque)
{
  deque.first = deque.last = 0;
}

void destroy (Deque& deque)
{
  Node *p = deque.first; 
  while (p != 0)
  {
    Node *temp = p;
    p = p->next;
    delete temp;
  }
  init (deque);
}

void push_back (Deque& deque, int value)
{
  Node *p = new Node;
  p->data = value;
  p->prev = deque.last;
  p->next = 0;

  deque.last = p;
  if (deque.first == 0)
    deque.first = deque.last;
  else
    deque.last->prev->next = deque.last;
}

int pop_back (Deque& deque)
{
  int value = 0;
  if (deque.last != 0)
  {
    value = deque.last->data;
    Node *temp = deque.last;
    deque.last = temp->prev;
    delete temp;
    if (deque.last == 0)
      deque.first = 0;
    else
      deque.last->next = 0;
  }

  return value;
}

void push_front (Deque& deque, int value)
{
  Node *p = new Node;
  p->data = value;
  p->prev = 0;
  p->next = deque.first;

  deque.first = p;
  if (deque.last == 0)
    deque.last = deque.first;
  else
    deque.first->next->prev = deque.first;
}

int pop_front (Deque& deque)
{
  int value = 0;
  if (deque.first != 0)
  {
    value = deque.first->data;
    Node *temp = deque.first;
    deque.first = temp->next;
    delete temp;
    if (deque.first == 0)
      deque.last = 0;
    else
      deque.first->prev = 0;
  }

  return value;
}

bool is_empty (const Deque& deque)
{
  return deque.first == 0;
}

int main ()
{
  Deque d;
  init (d);
  push_front(d, 2);
  push_front(d, 1);
  push_back(d, 3);
  push_back(d, 4);

  while (!is_empty(d))
    std::cout << pop_front (d) << std::endl;


  std::cout << std::endl;

  push_front(d, 2);
  push_back(d, 3);
  push_front(d, 1);
  push_back(d, 4);

  while (!is_empty(d))
    std::cout << pop_back (d) << std::endl;

  destroy (d);

  return 0;
}

Автор: Steven 22.5.2008, 19:29
Цитата(baldina @ 12.4.2008,  15:27)
это ну очень простой дек целых чисел. при попытке чтения из пустого дека возвращается 0.
попробуй разобраться. 
кстати тут уже и до классов недалеко

Код

#include "iostream"

struct Node {
  Node *prev; 
  Node *next; 
  int data;   
};

struct Deque {
  Node *first; 
  Node *last;  
};

void init (Deque& deque)
{
  deque.first = deque.last = 0;
}

void destroy (Deque& deque)
{
  Node *p = deque.first; 
  while (p != 0)
  {
    Node *temp = p;
    p = p->next;
    delete temp;
  }
  init (deque);
}

void push_back (Deque& deque, int value)
{
  Node *p = new Node;
  p->data = value;
  p->prev = deque.last;
  p->next = 0;

  deque.last = p;
  if (deque.first == 0)
    deque.first = deque.last;
  else
    deque.last->prev->next = deque.last;
}

int pop_back (Deque& deque)
{
  int value = 0;
  if (deque.last != 0)
  {
    value = deque.last->data;
    Node *temp = deque.last;
    deque.last = temp->prev;
    delete temp;
    if (deque.last == 0)
      deque.first = 0;
    else
      deque.last->next = 0;
  }

  return value;
}

void push_front (Deque& deque, int value)
{
  Node *p = new Node;
  p->data = value;
  p->prev = 0;
  p->next = deque.first;

  deque.first = p;
  if (deque.last == 0)
    deque.last = deque.first;
  else
    deque.first->next->prev = deque.first;
}

int pop_front (Deque& deque)
{
  int value = 0;
  if (deque.first != 0)
  {
    value = deque.first->data;
    Node *temp = deque.first;
    deque.first = temp->next;
    delete temp;
    if (deque.first == 0)
      deque.last = 0;
    else
      deque.first->prev = 0;
  }

  return value;
}

bool is_empty (const Deque& deque)
{
  return deque.first == 0;
}

int main ()
{
  Deque d;
  init (d);
  push_front(d, 2);
  push_front(d, 1);
  push_back(d, 3);
  push_back(d, 4);

  while (!is_empty(d))
    std::cout << pop_front (d) << std::endl;


  std::cout << std::endl;

  push_front(d, 2);
  push_back(d, 3);
  push_front(d, 1);
  push_back(d, 4);

  while (!is_empty(d))
    std::cout << pop_back (d) << std::endl;

  destroy (d);

  return 0;
}

Помогите пожалуйста изменить выше написанную программу и сделать в ней так, чтобы использовалась только одна структура:
Код

struct Node {
  Node *prev; 
  Node *next; 
  int data;   
};

struct Deque {
  Node *first; 
  Node *last;  
};

вот это заменить на одну структуру и чуть-чуть переписать программу с учетом изменений!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)