Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Создать двунаправленный список

71K
01 июня 2013 года
shilovec5377
10 / / 13.04.2012
Всем привет! помогите пж сохдать двунаправленный список с числами в диапазоне -50 +50.
У меня есть простой пример однонаправленной очереди, но не знаю как сделать двунаправленную.
Помогите пж.

Код:
#include <iostream>
#include <queue>
#include <cstdlib>
 
int main() {
   
    std::queue<int> q;
    const int N = 10;
   
    for( int i=0; i<N; ++i )
    {
        q.push( rand() % 100 - 50 );
    }
   
    while( !q.empty() )
    {
        std::cout << q.front() << " ";
        q.pop();
    }
   
   return 0;
}
414
01 июня 2013 года
CassandraDied
763 / / 24.05.2012
Ставлю три мармеладных конфеты на то, что твой код не подходит для сдачи лабораторной и, как следствие, из твоей очереди сделать список, который ты мог бы сдать, не получится.
Алсо, список и очереднь — штуки разные: двунаправленный список есть, а двунаправленная очередь — нет.
И если я не ошибся насчёт лабораторной, то писать надо было в раздел Студентам, дабы не вызвать своим желанием халявы гнев местных ментальных сущностей. :)
71K
01 июня 2013 года
shilovec5377
10 / / 13.04.2012
а может есть хоть какой-нибудь пример?
341
01 июня 2013 года
Der Meister
874 / / 21.12.2007
Код:
#include <list>
#include <iostream>
#include <cstdlib>

using namespace std;

int main() {
    list<int> values;
   
    const int N = 10;
    for (int i = 0; i < N; i++) {
        values.push_back(rand()%100 - 50);
    }
   
    for (list<int>::const_iterator i = values.begin(); i != values.end(); i++) {
        cout << *i << " ";
    }
}
71K
03 июня 2013 года
shilovec5377
10 / / 13.04.2012
этот код создает двунаправленный список???
71K
03 июня 2013 года
shilovec5377
10 / / 13.04.2012
вот сделал как можно запонить рандомно:

Код:
#include <stdlib.h>
#include <iostream>
using namespace std;
 
struct Node       //Структура являющаяся звеном списка
 {
     int x;     //Значение x будет передаваться в список
     Node *Next,*Prev; //Указатели на адреса следующего и предыдущего элементов списка
 };
 
 class List   //Создаем тип данных Список
 {
     Node *Head,*Tail; //Указатели на адреса начала списка и его конца
 public:
     List():Head(NULL),Tail(NULL){}; //Инициализируем адреса как пустые
     ~List(); //Деструктор
     void Show(); //Функция отображения списка на экране
     void Add(int x); //Функция добавления элементов в список
 };
 
List::~List() //Деструктор
 {  
     while (Head) //Пока по адресу на начало списка что-то есть
     {
         Tail=Head->Next; //Резервная копия адреса следующего звена списка
         delete Head; //Очистка памяти от первого звена
         Head=Tail; //Смена адреса начала на адрес следующего элемента
     }
 }
 
 void List::Add(int x)
 {
   Node *temp=new Node; //Выделение памяти под новый элемент структуры
   temp->Next=NULL;  //Указываем, что изначально по следующему адресу пусто
   temp->x=x;//Записываем значение в структуру
 
   if (Head!=NULL) //Если список не пуст
   {
       temp->Prev=Tail; //Указываем адрес на предыдущий элемент в соотв. поле
       Tail->Next=temp; //Указываем адрес следующего за хвостом элемента
       Tail=temp; //Меняем адрес хвоста
   }
   else //Если список пустой
   {
       temp->Prev=NULL; //Предыдущий элемент указывает в пустоту
       Head=Tail=temp; //Голова=Хвост=тот элемент, что сейчас добавили
   }
 }
 
 void List::Show()
 {
//ВЫВОДИМ СПИСОК С КОНЦА
     Node *temp=Tail;
      //Временный указатель на адрес последнего элемента
     while (temp!=NULL) //Пока не встретится пустое значение
     {
     cout<<temp->x<<" "; //Выводить значение на экран
     temp=temp->Prev; //Указываем, что нужен адрес предыдущего элемента
     }
     cout<<"\n";
 
 //ВЫВОДИМ СПИСОК С НАЧАЛА
     temp=Head; //Временно указываем на адрес первого элемента
      while (temp!=NULL) //Пока не встретим пустое значение
     {
     cout<<temp->x<<" "; //Выводим каждое считанное значение на экран
     temp=temp->Next; //Смена адреса на адрес следующего элемента
     }
     cout<<"\n";
 }
 
int main ()
{
 
 List lst; //Объявляем переменную, тип которой есть список
for (int i = 0, n = rand()%11 + 10; i < n; ++i) {
  lst.Add(rand()%101-50);
}
 
 
 lst.Show(); //Отображаем список на экране
 
}
помогите с условием: ( поменять местами элементы с максимальныи и минимальным значениями, при этом элементы не должны перемещаться в памяти )
414
03 июня 2013 года
CassandraDied
763 / / 24.05.2012
Это сделал не ты.
71K
04 июня 2013 года
shilovec5377
10 / / 13.04.2012
вот код, но что-то выводит только исходный список (заполненный рандомно), а (поменяный min с max) не хочет, может я не так вывожу?

функция для замены min с max: void List::Swap() //меняем min с max


Код:
#include <stdlib.h>
#include <iostream>
using namespace std;
 
struct Node       //Структура являющаяся звеном списка
 {
     int x;     //Значение x будет передаваться в список
     Node *Next,*Prev; //Указатели на адреса следующего и предыдущего элементов списка
 };
 
 class List   //Создаем тип данных Список
 {
     Node *Head,*Tail; //Указатели на адреса начала списка и его конца
 public:
     List():Head(NULL),Tail(NULL){}; //Инициализируем адреса как пустые
     ~List(); //Деструктор
     void Show(); //Функция отображения списка на экране
     void Add(int x); //Функция добавления элементов в список
     void Swap();//sortirovka
 };
 
List::~List() //Деструктор
 {  
     while (Head) //Пока по адресу на начало списка что-то есть
     {
         Tail=Head->Next; //Резервная копия адреса следующего звена списка
         delete Head; //Очистка памяти от первого звена
         Head=Tail; //Смена адреса начала на адрес следующего элемента
     }
 }
 
 void List::Add(int x)
 {
   Node *temp=new Node; //Выделение памяти под новый элемент структуры
   temp->Next=NULL;  //Указываем, что изначально по следующему адресу пусто
   temp->x=x;//Записываем значение в структуру
 
   if (Head!=NULL) //Если список не пуст
   {
       temp->Prev=Tail; //Указываем адрес на предыдущий элемент в соотв. поле
       Tail->Next=temp; //Указываем адрес следующего за хвостом элемента
       Tail=temp; //Меняем адрес хвоста
   }
   else //Если список пустой
   {
       temp->Prev=NULL; //Предыдущий элемент указывает в пустоту
       Head=Tail=temp; //Голова=Хвост=тот элемент, что сейчас добавили
   }
 }
 
 void List::Show()
 {
//ВЫВОДИМ СПИСОК С КОНЦА
     Node *temp=Tail;
      //Временный указатель на адрес последнего элемента
     while (temp!=NULL) //Пока не встретится пустое значение
     {
     cout<<temp->x<<" "; //Выводить значение на экран
     temp=temp->Prev; //Указываем, что нужен адрес предыдущего элемента
     }
     cout<<"\n";
  }
 
 
 
 void List::Swap()  //меняем min с max
{
    Node *min = Head, *max = Head, *cur = Head;        //head element
 
//Поиск минимального и максимального узла
    while(cur != Tail)
    {
        cur = cur->Next;
        if(cur->x < min->x)
        {
            min = cur;
        }
        if(cur->x > max->x)
        {
            max = cur;
        }
    }
   
    Node *beforeMin = min->Prev;
    Node *afterMin = min->Next;
   
    Node *beforeMax = min->Prev;
    Node *afterMax = max->Next;
   
    //выбор адресов элементов
    beforeMin->Next = max;
    afterMin->Prev = max;
   
    beforeMax->Next = min;
    afterMax->Prev = min;
   
    min->Prev = beforeMax;
    min->Next = afterMax;
   
    max->Prev = beforeMin;
    max->Next = afterMin;
   
//Проверка головы и хвоста
    if(min == Head) Head = max;
    if(min == Tail) Tail = max;
   
    if(max == Head) Head = min;
    if(max == Tail) Tail = min;
}
 
 
 
int main ()
{
 
 List lst; //Объявляем переменную, тип которой есть список
for (int i = 0, n = rand()%11 + 10; i < n; ++i)
{
  lst.Add(rand()%101-50);
}
 
 
 lst.Show(); //Отображаем список на экране
 
 lst.Swap(); //Отображаем поменяный список на экране
 return 0;
}
332
05 июня 2013 года
Valiant
416 / / 27.09.2004
Не пойму в чём проблема?
У вас есть структура:

 
Код:
struct node{
    int x;
    node *prev;
    node *next;
}
Ну вот с ней и работайте, адреса элементов есть.
Сначала заполняем, а потом выводим в зависимости от условий (в прямом или обратном порядке).
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог