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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.12.2018, 16:08   #1
1i10
 
Регистрация: 31.10.2018
Сообщений: 9
По умолчанию Двусвязный линейный список C++

Задание:
Задать последовательность из неповторяющихся целых чисел а1, а2,...аn, где n>4. Получить последовательность,
содержащую элементы исходной последовательности с удаленными двумя наименьшими и двумя наибольшими элементами.
И нужно это представить в виде двусвязного списка. Дополнительно программа должна осуществлять операции добавления/удаления элемента (с клавиатуры), вывод исходного и результирующего списков на экран.

А проблема вот в чем: я не понимаю как реализовать этот список, не понимаю как должны совершаться операции через указатели.
Сначала я решила написать обычный код не в виде линейного списка. Собственно вот он:
Код:
#include "pch.h"
#include <iostream>
#include <conio.h>
#include <random>
#include <time.h>
using namespace std;
 
 
int main()
{
    int n;
    cout <<"Введите размерность массива: ";
    cin >> n;
    int* a = new int [n];//создаем динамический массив
    if (n > 4) 
    {
        for (int i = 0; i < n; i++) 
        {
            a[i] = rand() % 99;
            cout << a[i] << "|";
        }
        cout << endl;
        
    }
    else
    {
        return 0;
    }
    //сортируем по возрастанию
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            if (a[i] <= a[j])
            {
                swap(a[i], a[j]);
            }
        }
    }
    
    for (int i = 0; i < n; i++)
    {
        cout << a[i] << "|";
    }
    cout << endl;
 
    int* a_without_max = new int[n - 2];
    //убираем два последних максимальных элемента
    for (int i=0; i < n - 2; i++) 
    {
        a_without_max[i] = a[i];
    }
    //выводим результат
    for (int i=0; i < n - 2; i++) 
    {
        cout << a_without_max[i] << "|";
    }
    cout << endl;
 
    //сортируем по убыванию
    for (int i = 0; i < n - 2; i++)
    {
        for (int j = i + 1; j < n - 2; j++)
        {
            if (a_without_max[i] <= a_without_max[j])
            {
                swap(a_without_max[i], a_without_max[j]);
            }
        }
    }
 
    for (int i = 0; i < n - 2; i++)
    {
        cout << a_without_max[i] << "|";
    }
    cout << endl;
    
    int* a_without_min = new int[n - 4];
    //убираем два последних минимальных элемента
    for (int i = 0; i < n - 4; i++)
    {
        a_without_min[i] = a_without_max[i];
    }
    //выводим результат
    for (int i = 0; i < n - 4; i++)
    {
        cout << a_without_min[i] << "|";
    }
    cout << endl;
    //снова сортируем по возрастанию
    for (int i = 0; i < n - 4; i++)
    {
        for (int j = 0; j < n - 4; j++)
        {
            if (a_without_min[i] <= a_without_min[j])
            {
                swap(a_without_min[i], a_without_min[j]);
            }
        }
    }
    //Выводим окончательный результат
    for (int i = 0; i < n - 4; i++)
    {
        cout << a_without_min[i] << "|";
    }
    cout << endl;
    
    //очищаем память
    delete[] a;
    delete[] a_without_max;
    delete[] a_without_min;
    _getch();
    return 0;
    
}
Единственное, что можно из всего этого выделить это алгоритм.

Типо, ввод значений ---> их сортировка ---> удаление двух последних элементов ---> удаление двух первых элементов

Начало возможно такое (поправьте, если это не так)
Код:
struct DlinkedList
{
  int a;
  DlinkedList *next;//указатель на следующий элемент
  DlinkedList *prev;//указатель на предыдущий
};
Далее должны идти функции (поправьте, если это не так)
Допустим, примерно
Код:
void addElem (???)
     ....
void sortElem (???)
    ....
void delFirstElem (???)
   ....
void delLastElem (???)
  ....
В общем-то, я не понимаю как работать с указателями. Допустим, как там будет проверяться условие n>4?и т.д.
1i10 вне форума Ответить с цитированием
Старый 17.12.2018, 16:17   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Цитата:
Сообщение от 1i10 Посмотреть сообщение
Единственное, что можно из всего этого выделить это алгоритм.
У вас серьезно пропускают такой код? Или обучают так писать?

Цитата:
Сообщение от 1i10 Посмотреть сообщение
Начало возможно такое (поправьте, если это не так)
Только лучше в класс, чтобы поля сразу спрятать.

Цитата:
Сообщение от 1i10 Посмотреть сообщение
Далее должны идти функции (поправьте, если это не так)
Допустим, примерно
Или методы... По хорошему у контейнеров есть набор "стандартных" методов.

Цитата:
Сообщение от 1i10 Посмотреть сообщение
В общем-то, я не понимаю как работать с указателями.
Что с ними не ясно?

Цитата:
Сообщение от 1i10 Посмотреть сообщение
Допустим, как там будет проверяться условие n>4?и т.д.
Пройти с начала до конца и посчитать. Можно для оптимизации размер хранить и учитывать.
p51x вне форума Ответить с цитированием
Старый 17.12.2018, 16:51   #3
1i10
 
Регистрация: 31.10.2018
Сообщений: 9
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
У вас серьезно пропускают такой код? Или обучают так писать?
не знаю...Я в принципе только месяц изучаю С++
Цитата:
Сообщение от p51x Посмотреть сообщение
Только лучше в класс, чтобы поля сразу спрятать.
А если все же не через класс?

Цитата:
Сообщение от p51x Посмотреть сообщение
Что с ними не ясно?
как операции писать с ними
Цитата:
Сообщение от p51x Посмотреть сообщение
Пройти с начала до конца и посчитать. Можно для оптимизации размер хранить и учитывать.
Поясните, если можно
1i10 вне форума Ответить с цитированием
Старый 17.12.2018, 16:56   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Цитата:
Сообщение от 1i10 Посмотреть сообщение
А если все же не через класс?
Ну можно сделать их приватными. В принципе структуры от классов мало чем отличаются.

Цитата:
Сообщение от 1i10 Посмотреть сообщение
как операции писать с ними
? Как и с другими типами *p, p->, p = ...

Цитата:
Сообщение от 1i10 Посмотреть сообщение
Поясните, если можно
Что пояснить? Вы представляете, что такое связный список? Не скопиппасченная структра, а в виде картинки?
p51x вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Линейный двусвязный список Шерлок Помощь студентам 0 25.12.2012 17:28
Разработайте класс, реализующий линейный двусвязный список Аким Ба Паскаль, Turbo Pascal, PascalABC.NET 11 24.08.2011 23:08