Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++] Навигация в двунаправленном списке 
:(
    Опции темы
johnybravo
Дата 16.5.2012, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 16.5.2012

Репутация: нет
Всего: нет



Здравствуйте!

Помогите пожалуйста реализовать работу с двунаправленным списком таким образом:
например 
при нажатии 1 - выводит текущий элемент(выбранный)
при нажатии 2 - переходит на  следующий элемент по указателю и отображает его
при нажатии 3 - переходит на предыдущий элемент по указателю и отображает его

 таким образом чтобы наглядно показать что в данном списке можно двигаться в обе стороны, что он двунаправленный.  Пытался сам разобраться но не получилось запутался с указателями(я так понимаю тут они приватные и к ним нету доступа).

Желательно на основе данного класса либо изменить его.


Код

#include <iostream>
using namespace std;
 
class Node        //один узел, представленный в виде структуры
{
friend class List;//объявляем класс Список дружественным, чтобы он имел доступ к закрытым полям
private:
   int key;       //номер узла в списке
   int data;      //данные, содержащиеся в узле
   Node *next;    //указатель на следующую структуру
   Node *last;    //указатель на предыдущую структуру
   
public:
   Node(int data, Node *next, Node *last)
   {
      this->data = data;
      this->next = next;
      this->last = last;
   }
   
   Node(int data)
   {
      this->data = data;
   }
};
 
class List        //класс, описывающий объект "список"
{
private:
   Node *head;   //голова списка (указатель на первый узел в списке)
   Node *temp;   //указатель на последний узел в списке
   
public:
   List() : head(NULL), temp(NULL) //в первом созданном объекта указатель равен нулю, т.к. следующего объекта еще нет и указывать не на что
   {
   }
   
   void addNodeEnd(int data)     //метод, добавляющий узел в конец списка
   {
      Node *nd = new Node(data, NULL, temp); //создаем новый узел, добавляем в него данные и делаем его последним, присваивая NULL
      temp = nd;
      
      if(head)
      {
         Node *current = head;  //указывает на начало списка, на первый узел; и используется в цикле для нахождения предыдущего узла
         while(current->next)   //прокручиваем в цикле наш список, пока не дойдем до последнего узла, остановившись на предыдущем
            current = current->next; //переходим на следующий узел
            
            current->next = nd;    //предыдущий указывает на следующий узел
      }
      else                       //если список был пуст и создается первый узел, то голова указывает на него
         head = nd;             //у головы бывает два состояния: она либо NULL, либо указывает на первый узел в списке
         
      numNode(); //нумеруем узлы списка
   }
void deleteNodeEnd() //удаление узла в конце списка
   {
      if(temp)
      {
         Node *current = temp;
         current = current->last;
         delete current->next;
         current->next = NULL;
      }
      else
         cout << "The list is empty!" << endl;
   }
int find(int k) //поиск по ключу в списке
   {
      Node *counter = head;
      while(counter)
      {
      if(counter->key == k)
         return counter->data;
         
      counter = counter->next;
      }
   }
void printListForward() const //выводим на печать наш список в прямом порядке
   {
      Node *current = head;
      while(current)             //пока не дойдем до последнего узла
      {
         cout << current->key << " - " << current->data << endl;   //выводим данные на экран
         current = current->next;         //переходим к следующему узлу
      }
   }
void numNode() //внутренняя функция-утилита, нумерует узлы списка
   {
      Node *counter = head;
      int i = 0;
      while(counter)
      {
         counter->key = ++i;
         counter = counter->next;
      }
   }
};



Спасибо!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0373 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.