Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.09.2011, 21:52   #1
maxim43k
Новичок
Джуниор
 
Регистрация: 07.09.2011
Сообщений: 7
Вопрос Как реализовать ручной ввод данных?

Как реализовать ручной ввод данных в этой программе? (Задание: вставить заданный пользователем элемент Е до и после элемента с минимальным ключом в заданном пользователем односвязном списке.)

Код:
#include <iostream.h>
#include <time.h>
#include <stdlib.h>
#include <conio.h>
 
typedef int Tp;

 struct NodeBase
{
 NodeBase() : next(this) {}
 NodeBase(NodeBase *next_node) : next(next_node) {}
 NodeBase *next;
};

 struct Node : NodeBase
{
 Tp value;
 Node(NodeBase *after, Tp node_value)
 : NodeBase(after->next), value(node_value)
    {
     after->next = this;
    }
};

 class SpecialList
{public:
    typedef Node NodeType;
    SpecialList() : first_(), least_(&first_) {}
    ~SpecialList()
      {
       clear();
      }

    void insertBeforeAndAfterLeast(Tp value)
       {
    NodeType *node = new NodeType(least_, value);
    if ((least_ == &first_) || (((NodeType*)least_)->value >= value))
    least_ = node;
    node = new NodeType(previousTo(least_), value);
       }

    void pushBack(Tp value)
       {
    NodeType *node = new NodeType(lastNode(), value);
    if ((least_ == &first_) || (((NodeType*)least_)->value >= value))
    least_ = node;
       }

    void clear()
       {
    NodeBase *node = first_.next;
    while (node != &first_)
      {
       first_.next = node->next;
       delete node;
       node = first_.next;
      }
    least_ = &first_;
       }

    friend ostream &operator<<(ostream &stream, const SpecialList &list)
       {
    NodeBase *node = list.first_.next;
    while (node != &(list.first_))
      {
       stream << ((NodeType*)node)->value << " ";
       node = node->next;
      }
    return stream;
       }

 private:
    NodeBase *previousTo(NodeBase *sourceNode)
       {
    NodeBase *previous = &first_;
    NodeBase *current = first_.next;
    while (current != sourceNode)
      {
       previous = current;
       current = current->next;
      }
    return previous;
       }

    NodeBase *lastNode()
       {
    NodeBase *node = first_.next;
    while (node->next != &first_)
      {
       node = node->next;
      }
    return node;
       }
    NodeBase first_;
    NodeBase *least_;
};

 void main()
{
 clrscr();
 srand(time(NULL));
 SpecialList list;
 for (int i = 0; i < 10; ++i)
   {
    int value = rand() % 10;
    cout << value << " ";
    list.pushBack(value);
   }
 cout << endl << list << endl;

 int value = 100 + rand() % 100;
 list.insertBeforeAndAfterLeast(value);
 cout << endl << list << endl;
}
maxim43k вне форума Ответить с цитированием
Старый 07.09.2011, 22:12   #2
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,814
По умолчанию

допустим, у Вас есть массив a[i]; все элементы вручную можно задать так. в цикле:
Код:
for(i=1;i=10;i++)
 {
  cout<<'a['<<i<<]=';
  cin>>a;
 }
и пока цикл не кончится, придётся вводить данные...
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace вне форума Ответить с цитированием
Старый 07.09.2011, 22:19   #3
maxim43k
Новичок
Джуниор
 
Регистрация: 07.09.2011
Сообщений: 7
По умолчанию

А как ввести элемент Е в список?
maxim43k вне форума Ответить с цитированием
Старый 07.09.2011, 22:21   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

в Вашем случае примерно так:
Код:
 clrscr();
 SpecialList list;
 int value;
 cout << "Input 10 values: ";
 for (int i = 0; i < 10; ++i)
   {
    cin >> value;
    list.pushBack(value);
   }
 cout << endl << list << endl;

 cout << "Input values for insert : ";
 cin >> value;
 list.insertBeforeAndAfterLeast(value);
 cout << endl << list << endl;
}
Serge_Bliznykov вне форума Ответить с цитированием
Старый 07.09.2011, 22:35   #5
maxim43k
Новичок
Джуниор
 
Регистрация: 07.09.2011
Сообщений: 7
По умолчанию

Хм, а как сделать ввод списка без цикла? Мне нельзя цикл использовать, если можно применять указатели, это же список.
maxim43k вне форума Ответить с цитированием
Старый 07.09.2011, 22:49   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Мне нельзя цикл использовать, если можно применять указатели, это же список.
Что за бред?!
При чём здесь цикл и указатели?

Мне нельзя есть мороженное, у меня в Киеве дядька?!...
так что ли?

не хотите использовать цикл. Не используйте.
Пишите последовательно N раз:
Код:
 cout << "Input 1-st value: ";
 cin >> value;
 list.pushBack(value);
 cout << "Input 2-nd value: ";
 cin >> value;
 list.pushBack(value);
...
 cout << "Input 10th value: ";
 cin >> value;
 list.pushBack(value);
и т.д.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Синхронизация работы Tthread и данных в ListView как реализовать? Человек_Борща Общие вопросы Delphi 4 20.12.2010 01:00
Ручной выбор диапазона данных J_i_m_m_y Microsoft Office Excel 6 02.06.2010 18:32
Как заблокировать ввод данных в ячейки? parsn Microsoft Office Excel 7 11.01.2010 17:43
Как в C++ организовать ввод данных в одну строчку? amdbodia Общие вопросы C/C++ 10 16.05.2009 18:03
как узнать с какого устройства идет ввод данных keg Win Api 5 20.07.2007 10:50