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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.04.2016, 01:49   #1
luibrain
Пользователь
 
Регистрация: 17.02.2016
Сообщений: 27
По умолчанию линейный двунаправленный список c++

Имеются сведения о больницах:название, количество мест, количество больных.

1. Создать линейный двунаправленный список.
2. Распечатать список слева направо.
3. Распечатать список справа налево 3 раза подряд таким образом, чтобы отображались только больницы с количеством мест больше заданного.
4. Добавить сведения о новых больницах, поместив их в конец списка (количество больниц произвольно).
5. Удалить сведения о больнице, находящейся в списке после заданной.
6. Уничтожить список, освободив выделенную под него память.
7. Создать меню, позволяющее многократно выбирать функции.

Код:
#include "stdafx.h"
#include "iostream"
using namespace std;
 
    struct bolnica
    {
        char nazvanie[30];
        int mesta;
        int bolnye;
        bolnica *next, *previous;
    };
 
    class Sanya
    {
        bolnica *first, *last, *tek;
    public:
        Sanya();
        ~Sanya();
        void sozd();
        void vyvod_sleva_napravo();
        void vyvod_sprava_nalevo();
        void dobavlenie();
        void udalenie();
    };
 
    Sanya::Sanya()
    {
        first = last = tek = NULL;
    }
 
    Sanya::~Sanya()
    {
        while (first)
        {
            last = first->next;
            delete first;
            first = last;
        }
    }
 
 
    void Sanya::sozd()
    {
        first = tek = last = NULL;
        cout << "признак конца ввода - точка ";
        cout << endl;
        do
        {
            tek = new bolnica;
            cout << "Ввведите название больницы - ";
            cin >> tek->nazvanie;
            cout << endl;
            if (strcmp(tek->nazvanie, ".") == 0) continue;
            cout << "Введите количество мест - ";
            cin >> tek->mesta;
            cout << endl;
            cout << "Введите количество больных - ";
            cin >> tek->bolnye;
            cout << endl;
            tek->previous = first;
            if (first == NULL) last = tek;
            else first->next = tek;
            first = tek;
        } while (strcmp(tek->nazvanie, ".") != 0);
        first->next = NULL;
        cout << "список создан";
    }
 
    void Sanya::vyvod_sleva_napravo()
    {
        tek = last;
        while (tek)
        {
            cout << " Название больницы - " << tek->nazvanie;
            cout << endl;
            cout << " Количество мест в ней - " << tek->mesta;
            cout << endl;
            cout << " Количество больных в ней - " << tek->bolnye;
            tek = tek->next;
            cout << endl;
            }
    }
 
    void Sanya::vyvod_sprava_nalevo()
    {
        int zadannoe_chislo;
        cout << " Введите заданное число - ";
        cin >> zadannoe_chislo;
        cout << endl;
        tek = first;
        while (tek)
        {
            if (tek->mesta > zadannoe_chislo)
            {
                cout << " Название больницы - " << tek->nazvanie;
                cout << endl;
                cout << " Количество мест в ней - " << tek->mesta;
                cout << endl;
                cout << " Количество больных в ней - " << tek->bolnye;
                tek = tek->previous;    
                cout << endl;
            }
        }
    }
 
    void Sanya::dobavlenie()
    {
        bolnica *p;
        tek = first;
        int k;
        cout << " Введите количесто добавляемых больниц - ";
        cin >> k;
        do
        {
            while (tek->next)
                tek = tek->next;
            p = new struct bolnica;
            cout << "Ввведите название больницы - ";
            cin >> p->nazvanie;
            cout << endl;
            cout << "Введите количество мест - ";
            cin >> p->mesta;
            cout << endl;
            cout << "Введите количество больных - ";
            cin >> p->bolnye;
            cout << endl;
            p->next = NULL;
            tek->next = p;
            cout << endl;
            k--;
        } while (k != 0);
    }
 
    void Sanya::udalenie()
    {
        char z[30];
        cout << " Введите заданное значение - ";
        cin >> z;
        bolnica *p;
        tek = first;
        p = tek;
        tek = tek->next;
        while (p->next)
        {
            if (strcmp(tek->nazvanie, z) == 0)
            {
                p->next = tek->next;
                delete tek;
                tek = p->next;
            }
            else
            {
                p = p->next;
                tek = tek->next;
            }
        }
    }
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "Russian");
    int n;
    Sanya obj;
    do {
        cout << endl;
        cout << "1. Создание списка" << endl;
        cout << "2. Вывод на экран слева направо" << endl;
        cout << "3. Вывод на экран справа налево" << endl;
        cout << "4. Добавление больниц в конец" << endl;
        cout << "5. Удаление больницы после заданной" << endl;
        cout << "0. Выход " << endl;
        cout << endl;
        cout << endl;
        cout << "Введите пункт меню: ";
        cin >> n;
 
        switch (n) {
        case 0: break;
        case 1: obj.sozd(); break;
        case 2: obj.vyvod_sleva_napravo(); break;
        case 3: obj.vyvod_sprava_nalevo(); break;
        case 4: obj.dobavlenie(); break;
        case 5: obj.udalenie(); break;
        default: cout << " Неверно ";
        }
    } while (n != 0);
    system("pause");
    return 0;
}
удаление не хочет работать и чуть-чуть криво работает отображение справа налево

Последний раз редактировалось luibrain; 17.04.2016 в 01:49. Причина: забыл добавить
luibrain вне форума Ответить с цитированием
Старый 17.04.2016, 11:45   #2
luibrain
Пользователь
 
Регистрация: 17.02.2016
Сообщений: 27
По умолчанию

очень нужно
luibrain вне форума Ответить с цитированием
Старый 17.04.2016, 12:01   #3
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Много мелких неточностей, но алгоритм верный.
При добавлении нового ненужного элемента нет корректного заполнения полей
Код:
    void Sanya::sozd()
    {
        first = tek = last = NULL;
        cout << "признак конца ввода - точка ";
        cout << endl;
        do
        {
            tek = new bolnica;
            cout << "Ввведите название больницы - ";
            cin >> tek->nazvanie;
            cout << endl;
            if (strcmp(tek->nazvanie, ".") == 0) {delete tek; break;};
            cout << "Введите количество мест - ";
            cin >> tek->mesta;
            cout << endl;
            cout << "Введите количество больных - ";
            cin >> tek->bolnye;
            cout << endl;
            tek->previous = first;
            if (first == NULL) last = tek;
            else first->next = tek;
            first = tek;
        } while (true);
        first->next = NULL;
        cout << "список создан";
    }
Вывод может зациклиться, т.к. не всегда есть условие выхода из цикла
Код:
    void Sanya::vyvod_sprava_nalevo()
    {
        int zadannoe_chislo;
        cout << " Введите заданное число - ";
        cin >> zadannoe_chislo;
        cout << endl;
        tek = first;
        while (tek)
        {
            if (tek->mesta > zadannoe_chislo)
            {
                cout << " Название больницы - " << tek->nazvanie;
                cout << endl;
                cout << " Количество мест в ней - " << tek->mesta;
                cout << endl;
                cout << " Количество больных в ней - " << tek->bolnye;
                cout << endl;
            }
            tek = tek->previous;
        }
    }
Добавление не учитывает границ крайних элементов, поэтому вывод в одну сторону может падать
Код:
    void Sanya::dobavlenie()
    {
        bolnica *p;
        int k;
        cout << " Введите количесто добавляемых больниц - ";
        cin >> k;
        do
        {
            p = new struct bolnica;
            cout << "Ввведите название больницы - ";
            cin >> p->nazvanie;
            cout << endl;
            cout << "Введите количество мест - ";
            cin >> p->mesta;
            cout << endl;
            cout << "Введите количество больных - ";
            cin >> p->bolnye;
            cout << endl;
            p->next = NULL;
            p->previous = first;
            first->next = p;
            first=p;
            cout << endl;
            k--;
        } while (k != 0);
    }
Удаление так
Код:
    void Sanya::udalenie()
    {
        char z[30];
        cout << " Введите заданное значение - ";
        cin >> z;
        bolnica *p;
        //tek = first;
        p = last;
        //tek = tek->next;
        while (p->next)
        {
            if (strcmp(p->nazvanie, z) == 0)
            {
                tek=p->next;
                p->next = tek->next;
                if (tek->next)
                {
                    tek->next->previous=p;
                } else
                {
                    first = first->previous;
                    first->next = NULL;
                }
                delete tek;
                //tek = p->next;
            }
            if (p!=first) p=p->next; else break;
        }
    }
Тесты вроде держит. Но нужно проверить на всякий

Последний раз редактировалось eoln; 17.04.2016 в 12:07. Причина: if (p!=first)
eoln вне форума Ответить с цитированием
Старый 17.04.2016, 12:36   #4
luibrain
Пользователь
 
Регистрация: 17.02.2016
Сообщений: 27
По умолчанию

Спасибо большое, все прекрасно работает!!! Не могу описать словами свою радость!
luibrain вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Линейный двунаправленный список BaTpyXaaa Общие вопросы C/C++ 0 07.12.2014 19:26
линейный двунаправленный список мария герасимова Паскаль, Turbo Pascal, PascalABC.NET 1 22.09.2011 19:04
Линейный двунаправленный список. Дельфи. Nicole Помощь студентам 0 13.05.2011 17:48
Линейный Двунаправленный Список D1mon Помощь студентам 1 14.04.2009 21:37
Линейный двунаправленный список Seg_62 Паскаль, Turbo Pascal, PascalABC.NET 4 28.08.2008 21:02