Главная страница
Навигация по странице:

  • Прототип функции

  • 10.Результат выполнения программы При выполнении программы были получены результаты, совпадающие со значениями из таблиц 1 и 2. Ошибки не обнаружены.Вывод

  • Односвязные списки в языке СС. лаб 2 сем 2 односвяз Изотов 5307. Односвязные списки в языке С


    Скачать 436.79 Kb.
    НазваниеОдносвязные списки в языке С
    АнкорОдносвязные списки в языке СС
    Дата17.06.2022
    Размер436.79 Kb.
    Формат файлаdocx
    Имя файлалаб 2 сем 2 односвяз Изотов 5307.docx
    ТипОтчет
    #599891
    страница4 из 4
    1   2   3   4

    Прототип функции: void menupoisk()

    Вызов функции: menupoisk()

    8.22 Функция menucreate

    Назначение функции: вывод меню редактирования списка.

    Прототип функции: void menucreate()

    Вызов функции: menucreatek()

    8.23 Функция menusort

    Назначение функции: вывод меню сортиовки.

    Прототип функции: void menusort()

    Вызов функции: menusortk()

    8.24 Функция spravka

    Назначение функции: вывод справки.

    Прототип функции: void spravka()

    Вызов функции: spravka()

    9.Исходный текст программы

    #include "stdafx.h"

    #include "conio.h"

    #include "stdlib.h"

    #include "iostream"

    #include "locale.h"

    #include "windows.h"

    #define _CRT_SECURE_NO_WARNINGS
    typedef struct t

    {

    int number;

    char brand[30];

    char model[30];

    char recomend[30];

    char cambertype[30];

    int flex;

    int lenght;

    }SN;
    struct snow

    {

    SN info;

    struct snow *next;

    };
    snow* inputback(snow*, short); //Функция добавления элементов в конец списка

    snow* inputpre(snow*); //Функция добавления элементов в начало списка

    void output(snow*); //Функция вывода информации

    snow* search(snow*, short); //Функция поиска по словам

    snow* searchint(snow*, short, int);//Функция поиска по числам

    void mainmenu(); //Функция вывода меню программы

    void menupoisk(); //Функция вывода меню поиска

    void spravka(); //Функция вывода справки

    char* inputslovo(char*); //Функция ввода слова

    char* clearchar(char*); //Функция освобождения памяти занятой словом

    snow* number(snow*); //Функция нумерации элементов списка

    snow* clearhead(snow*); //Функция удаления списка

    snow* inputinfo(snow*); //Функция ввода информации о сноубордах

    snow* inputn(snow*); //Функция добавления информации о n-ом сноуборде

    snow* clearone(snow*); //Функция удаления n-ого элемента списка

    void inputflex(int*); //Функция ввода значения жесткости

    void inputlenght(int*); //Функция ввода значения длины

    snow* rewrite(snow*, snow*); //Функция записи информации в новый список

    void menucreate(); //Функция вывода меню редактирования списка

    void menusort(); //Функция вывода меню сортировки

    snow* sort(snow*, short); //Функция для выполнения сортировки

    snow* exchange(snow*, snow*); //Функция обмена информацией между соседними эл-ми

    char* priority(char*); //Функция ввода приоритета для сортировки

    snow* changen(snow*); //Функция изменения информации о n-ом сноуборде
    int main()

    {

    setlocale(LC_ALL, "Russian");

    snow *head;

    snow* newhead;

    short x, flag1 = 0, flag3 = 0, choice, choice2;

    int flex, lenght;
    do

    {

    mainmenu();

    x = _getch();

    system("cls");

    switch (x)

    {

    case '1':

    if (flag1 == 1)

    {

    puts("Формирование нового списка приведет к удалению уже

    введенных данных!");

    puts("Если вы хотите добавить информацию без удаления

    текущего списка");

    puts("вернитесь в меню программы и воспользуйтесь пунктами

    3, 4, 5!\n");

    puts("Создать новый список(введенные данные будут удалены)?\n");

    puts("Для продолжения нажмите - 1 ");

    puts("Для возврата к меню нажмите - 0");

    choice = _getch();

    system("cls");

    if (choice == '1')

    {

    flag1 = 1;

    head = clearhead(head);

    if (flag3 == 1)

    {

    flag3 = 0;

    newhead = clearhead(newhead);

    }

    puts("Формирование нового списка");

    do

    {

    head = inputback(head, x);

    puts("Хотите продолжить ввод");

    puts("Для продолжения нажмите 1, выход - 0:\n");

    fflush(stdin);

    choice = _getch();

    puts("---------------------------------------");

    } while (choice != '0');

    head = number(head);

    }

    }

    else

    {

    flag1 = 1;

    puts("Формирование нового списка");

    do

    {

    head = inputback(head, x);

    puts("Хотите продолжить ввод");

    puts("Для продолжения нажмите 1, выход - 0: \n");

    fflush(stdin);

    choice = _getch();

    puts("----------------------------------------------");

    } while (choice != '0');

    head = number(head);

    }

    system("cls");

    break;

    case '2':

    if (flag1 == 1)

    {

    puts("Информация о всех сноубордах");

    output(head);

    }

    else

    puts("Сначала введите информацию о сноубордах");

    _getch();

    system("cls");

    break;

    case '3':

    if (flag1 == 1)

    {

    menucreate();

    choice2 = _getch();

    system("cls");

    switch (choice2)

    {

    case '1':

    puts("Добавление информации в конец списка");

    do

    {

    head = inputback(head, x);

    puts("Хотите продолжить ввод");

    puts("Для продолжения нажмите 1, выход – 0:");

    fflush(stdin);

    choice = _getch();

    puts("-------------------------------------");

    } while (choice != '0');

    head = number(head);

    break;

    case '2':

    puts("Добавление информации в начало списка");

    do

    {

    head = inputpre(head);

    puts("Хотите продолжить ввод");

    puts("Для продолжения нажмите 1, выход – 0:");

    fflush(stdin);

    choice = _getch();

    puts("-------------------------------------");

    } while (choice != '0');

    head = number(head);

    break;

    case '3':

    puts("Добавление информации на n-место");

    head = inputn(head);

    head = number(head);

    _getch();

    break;

    case '4':

    puts("Вы действительно хотите удалить информацию

    о n–ом сноуборде ? \n");

    puts("Для продолжения нажмите - 1 ");

    puts("Для возврата к меню нажмите - 0");

    fflush(stdin);

    choice = _getch();

    if (choice != '0')

    {

    head = clearone(head);

    if (head == NULL)

    {

    puts("\nСписок был полностью удален");

    flag1 = 0;

    }

    _getch();

    }

    break;

    case '5':

    puts("Изменение информации о n-ом сноуборде\n");

    head = changen(head);

    break;

    default:

    puts("В меню нет такого пункта. Повторите ввод.");

    _getch();

    break;

    }

    }

    else

    {

    puts("Сначала сформируйте список!");

    _getch();

    }

    system("cls");

    break;

    case '4':

    if (flag1 == 1)

    {

    puts("Удаление списка приведет у удалению всей введенной

    ранее информации.");

    puts("Вы действительно хотите удалить список?\n");

    puts("Для продолжения нажмите - 1 ");

    puts("Для возврата к меню нажмите - 0");

    fflush(stdin);

    choice = _getch();

    if (choice == '1')

    {

    flag1 = 0;

    head = clearhead(head);

    puts("\nИнформация успешно удалена!");

    _getch();

    }

    }

    else

    {

    puts("Сначала сформируйте список!");

    _getch();

    }

    system("cls");

    break;

    case '5':

    if (flag1 == 1)

    {

    if (flag3 == 1)

    newhead = clearhead(newhead);

    flag3 = 1;

    menupoisk();

    choice2 = _getch();

    system("cls");

    switch (choice2)

    {

    case '1':

    puts("Введите название бренда(до 30 символов): ");

    newhead = search(head, choice2);

    break;

    case '2':

    puts("Введите название модели(до 30 символов): ");

    newhead = search(head, choice2);

    break;

    case '3':

    puts("Введите назначение доски(до 30 символов): ");

    newhead = search(head, choice2);

    break;

    case '4':

    puts("Введите тип прогиба(до 30 символов): ");

    newhead = search(head, choice2);

    break;

    case '5':

    puts("Поиск сноубордов по жесткости");

    inputflex(&flex);

    newhead = searchint(head, choice2, flex);

    break;

    case '6':

    puts("Поиск сноубордов по длине");

    inputlenght(&lenght);

    newhead = searchint(head, choice2, lenght);

    break;

    default:

    flag3 = 0;

    puts("В меню нет такого пункта. Повторите ввод.");

    break;

    }

    }

    else

    puts("Сначала введите информацию о сноубордах!");

    if (newhead == NULL)

    flag3 = 0;

    _getch();

    system("cls");

    break;

    case '6':

    if (flag3 == 1)

    {

    puts("Результат поиска по запросу:");

    if (newhead != NULL)

    output(newhead);

    else

    puts("По данному запросу ничего не найдено");

    }

    else

    puts("Сначала нужно выполнить поиск по запросу");

    _getch();

    system("cls");

    break;
    case '7':

    if (flag1 == 1)

    {

    menusort();

    choice2 = _getch();

    system("cls");

    switch (choice2)

    {

    case '1':

    head = sort(head, choice2);

    break;

    case '2':

    head = sort(head, choice2);

    break;

    default:

    puts("В меню нет такого пункта. Повторите ввод.");

    break;

    }

    head = number(head);

    }

    else

    puts("Сначала введите информацию о сноубордах!");

    _getch();

    system("cls");

    break;

    case '8':

    spravka();

    _getch();

    system("cls");

    break;

    default:

    if (x != '0')

    {

    puts("В меню нет такого пункта. Повторите ввод.");

    _getch();

    system("cls");

    }

    }

    } while (x != '0');

    return 0;

    }
    //---------------------------------------------------------------------------------------
    //Функция добавление элементов в конец списка

    snow* inputback(snow* head, short x)

    {

    snow* p = NULL;

    snow* head2 = NULL;

    p = inputinfo(p);

    if ((head != NULL && x == '1') || x == '3')

    {

    head2 = head;

    while (head2->next != NULL)

    head2 = head2->next;

    head2->next = (p);

    head2 = (p);

    head2->next = NULL;

    }

    if (head == NULL)

    {

    (p)->next = head;

    head = (p);

    }

    return head;

    }

    //Функция добавления элементов в начало списка

    snow* inputpre(snow* head)

    {

    snow* p = NULL;

    p = inputinfo(p);

    (p)->next = head;

    head = (p);

    return head;

    }
    //Функция вывода информации

    void output(snow* head)

    {

    snow* qwe;

    if (head != NULL)

    {

    qwe = head;

    do

    {

    printf("\nСноуборд № %d", qwe->info.number);

    printf("\n\tбренд: %s", qwe->info.brand);

    printf("\n\tмодель: %s", qwe->info.model);

    printf("\n\tназначение: %s", qwe->info.recomend);

    printf("\n\tпрогиб: %s", qwe->info.cambertype);

    printf("\n\tжесткость: %d", qwe->info.flex);

    printf("\n\tдлина: %d", qwe->info.lenght);

    puts("\n");

    qwe = qwe->next;

    } while (qwe != NULL);

    }

    }
    //Функция ввода слова для поиска

    char* inputslovo(char* slovo)

    {

    char l; //вводимый сивол

    short nosimvol = 0; //проверяет слово наличие букв и цифр

    short i = 0; //индекс массива

    short h = 0; //хранит место первого введенного символа

    char sl[30]; //введенное слово
    while (i == 0 || nosimvol == 0)

    {

    nosimvol = 0;

    i = 0;

    h = 0;

    l = 'o';

    while (i < 30 && (int)l != 13)

    {

    l = _getche();

    //если вводимый символ цифра, буква латиницы или пробел

    if ((int)l >= 32 && (int)l < 127)

    {

    if ((int)l != 32 && nosimvol == 0)

    {

    nosimvol = 1;

    h = i;

    }

    sl[i] = l;

    i++;

    }

    else

    {

    //запрет на ввод символов кроме лат. букв, цифр и пробелов

    if ((int)l != 13 && (int)l != 8)

    {

    printf("\b");

    printf(" ");

    printf("\b");

    }

    }

    /*удаление уже введенных символов

    и проверка на полное удаление слова*/

    if ((int)l == 8 && i != 0)

    {

    if (h == i - 1)

    {

    nosimvol = 0;

    h = 0;

    }

    printf(" ");

    printf("\b");

    i--;

    }

    }

    //проверка на наличие символов в слове

    if (i == 0 || nosimvol == 0)

    puts("Вы не ввели ни одного символа. Повторите ввод:");

    else

    {

    if (i == 30)

    sl[i - 1] = '\0';

    else

    sl[i] = '\0';

    }

    }

    slovo = (char*)malloc(sizeof(char) * (i + 1));

    strcpy(slovo, sl);

    return slovo;

    }
    //Функция поиска по ключевому слову

    snow* search(snow* head, short choice2)

    {

    char* slovo2;

    short poisk; //0-если по запросу ничего не нашлось

    short k; //0-если в словах нашлись не совпадающие символы

    char* snowptr;

    char* slovopoisk;

    snow* newhead = NULL;

    snow* newhead2 = NULL;

    snow* head2 = NULL;

    snow* newheadre;

    slovo2 = inputslovo(slovo2);

    head2 = head;

    poisk = 0;

    do

    {

    slovopoisk = slovo2;

    switch (choice2)

    {

    case '1':

    snowptr = head2->info.brand;

    break;

    case '2':

    snowptr = head2->info.model;

    break;

    case '3':

    snowptr = head2->info.recomend;

    break;

    case '4':

    snowptr = head2->info.cambertype;

    break;

    }

    k = 1;

    while (*snowptr != '\0' && *slovopoisk != '\0' && k == 1)

    {

    //если разные символы

    if (*snowptr != *slovopoisk && (*snowptr != (int)*slovopoisk + 32) &&

    (*snowptr != (int)*slovopoisk - 32))

    k = 0;

    snowptr++;

    slovopoisk++;

    }

    //если слова одинаковы

    if (k == 1 && *snowptr == '\0' && *slovopoisk == '\0')

    {

    newheadre = rewrite(newheadre, head2);

    if (newhead == NULL)

    {

    newhead = newheadre;

    newhead->next = NULL;

    newhead2 = newhead;

    }

    else

    {

    newhead2->next = newheadre;

    newhead2 = newheadre;

    newhead2->next = NULL;

    }

    poisk = 1;

    }

    head2 = head2->next;

    } while (head2 != NULL);

    if (poisk == 1)

    {

    printf("\n\nСноуборды по запросу: %s", slovo2);

    output(newhead);

    }

    else

    puts("\nСноубордов по данному запросу не нашлось.");

    return newhead;

    }
    //Функция поиска по числу

    snow* searchint(snow* head, short choice2, int flex)

    {

    short poisk;//0-если по запросу ничегоне нашлось

    int intpoisk;

    snow* newhead = NULL;

    snow* head2 = NULL;

    snow* newhead2 = NULL;

    snow* newheadre = NULL;
    head2 = head;

    poisk = 0;

    do

    {

    switch (choice2)

    {

    case '5':

    intpoisk = head2->info.flex;

    break;

    case '6':

    intpoisk = head2->info.lenght;

    break;

    }

    if (flex == intpoisk)

    {

    newheadre = rewrite(newheadre, head2);

    if (newhead == NULL)

    {

    newhead = newheadre;

    newhead->next = NULL;

    newhead2 = newhead;

    }

    else

    {

    newhead2->next = newheadre;

    newhead2 = newheadre;

    newhead2->next = NULL;

    }

    poisk = 1;

    }

    head2 = head2->next;

    } while (head2 != NULL);

    if (poisk == 0)

    puts("Сноубордов по данному запросу не нашлось.");

    if (poisk == 1)

    {

    printf("\n\nСноуборды по запросу: %d", flex);

    output(newhead);

    }

    return newhead;

    }
    //Функция вывода меню программы

    void mainmenu()

    {

    puts("Меню программы <Сноуборды>");

    puts("\nДля перехода введите номер пункта меню");

    puts("1-ввод информации о сноубордах (формирование нового списка)");

    puts("2-вывод введенной информации на экран");

    puts("3-редактирование информации (списка)");

    puts("4-удаление всей введенной информации (удаление списка)");

    puts("5-поиск информации по запросу");

    puts("6-вывод информации, найденной по запросу");

    puts("7-сортировка информации (элементов списка)");

    puts("8-справка");

    puts("\n0- выход из программы");

    }
    //Функция вывода меню поиска

    void menupoisk()

    {

    puts("По какому критерию произвести поиск?");

    puts("\nДля перехода введите номер пункта меню:");

    puts("1-по бренду");

    puts("2-по модели");

    puts("3-по назначению");

    puts("4-по типу прогиба");

    puts("5-по жесткости");

    puts("6-по длине");

    }
    //Функция вывода справки

    void spravka()

    {

    puts("Справка");

    puts("\nВведите информацию о сноубордах.");

    puts("При вводе используйте латинские буквы,цифры,пробелы.");

    puts("Вы можете выполнить поиск сноуборда по ключевому слову или числу.");

    puts("При вводе ключевого слова используйте латинские буквы,цифры,пробелы.");

    puts("Длина слова не должна превышать 30 символов.");

    puts("Если вы превысите лимит - ввод слова автоматически прекратится.");

    }
    //Функция освобождения памяти занятой словом

    char* clearchar(char* slovo)

    {

    free(slovo);

    return NULL;

    }
    //Функция нумерации элементов

    snow* number(snow* head)

    {

    snow* head2 = NULL;

    short i = 1;

    head2 = head;

    while (head2 != NULL)

    {

    head2->info.number = i;

    head2 = head2->next;

    i++;

    }

    return head;

    }
    //Функция ввода значения жесткости

    void inputflex(int* ptrflex)

    {

    int flex;

    do

    {

    flushall();

    puts("\nВведите жесткость доски (число от 1 до 10): ");

    scanf_s("%d", &flex);

    if (flex < 1 || flex > 10)

    puts("Недопутимое значение жесткости! Повторите ввод.");

    } while (flex < 1 || flex > 10);

    *ptrflex = flex;

    }
    //Функция ввода значения длины

    void inputlenght(int* ptrlenght)

    {

    int lenght;

    do

    {

    puts("\nВведите длину доски (число от 120 до 220): ");

    fflush(stdin);

    scanf("%d", &lenght);

    if (lenght < 120 || lenght > 220)

    puts("Недопутимое значение длины! Повторите ввод.");

    } while (lenght < 120 || lenght > 220);

    *ptrlenght = lenght;

    }

    //Функция удаления списка

    snow* clearhead(snow* head)

    {

    snow* head2 = NULL;

    int i;

    while (head != NULL)

    {

    head2 = head;

    head = head->next;

    free(head2);

    }

    return NULL;

    }
    //Функция ввода информации о сноуборде

    snow* inputinfo(snow* p)

    {

    char* slovo = NULL;

    int flex;

    int lenght;

    p = (snow*)malloc(sizeof(snow));

    puts("\nВведите название бренда (до 30 символов): ");

    slovo = inputslovo(slovo);

    strcpy((p)->info.brand, slovo);

    slovo = clearchar(slovo);

    puts("\n\nВведите модель доски (до 30 символов): ");

    slovo = inputslovo(slovo);

    strcpy((p)->info.model, slovo);

    slovo = clearchar(slovo);

    puts("\n\nВведите назначение доски: ");

    slovo = inputslovo(slovo);

    strcpy((p)->info.recomend, slovo);

    slovo = clearchar(slovo);

    puts("\n\nВведите тип прогиба: ");

    slovo = inputslovo(slovo);

    strcpy((p)->info.cambertype, slovo);

    slovo = clearchar(slovo);

    puts("");

    inputflex(&flex);

    (p)->info.flex = flex;

    inputlenght(&lenght);

    (p)->info.lenght = lenght;

    return p;

    }
    //Функция добавления элемента на n-место

    snow* inputn(snow* head)

    {

    int n;

    int i = 1;

    snow* p = NULL;

    snow* head2 = NULL;

    p = inputinfo(p);

    do

    {

    puts("\nВведите номер нового элемента:");

    scanf("%d", &n);

    head2 = head;

    //если добавляем не в начало

    if (n > 1)

    {

    while (i < n - 1 && head2->next != NULL)

    {

    head2 = head2->next;

    i++;

    }

    p->next = head2->next;

    head2->next = p;

    }

    else

    {

    //если добавляем в начало списка

    if (n >= 0)

    {

    p->next = head;

    head = p;

    }

    else

    puts("Вы ввели отрицателное значение! Повтрите ввод!");

    }

    } while (n < 0);

    puts("\nЭлемент успешно добавлен!");

    return head;

    }
    //Функция удаления n-ого элемента списка

    snow* clearone(snow* head)

    {

    int n;

    int i = 1;

    int m;

    snow* head2 = NULL;

    snow* prehead = NULL;
    head2 = head;

    while (head2->next != NULL)

    {

    head2 = head2->next;

    i++;

    }

    m = i;

    do

    {

    fflush(stdin);

    puts("\nВведите номер сноуборда для удаления:");

    scanf("%d", &n);

    if (n >= 1 && n <= m)

    {

    head2 = head;

    i = 1;

    //если нужно удалить первый элемент списка

    if (n == 1)

    {

    //если в списке не один элемент

    if (m != 1)

    {

    prehead = head;

    head = head->next;

    free(prehead);

    }

    else

    {

    free(head);

    head = NULL;

    }

    }

    else

    {

    while (i < n && head2->next != NULL)

    {

    prehead = head2;

    head2 = head2->next;

    i++;

    }

    prehead->next = head2->next;

    free(head2);

    }

    //если список не был полностью удален

    if (head != NULL)

    head = number(head);

    }

    else

    puts("Cноуборда с таким номером не нашлось. Повторите ввод!");

    } while (n < 1 || n > m);

    puts("\nЭлемент успешно удален!");

    return head;

    }
    //Функция записи информации в новый список

    snow* rewrite(snow* newheadre, snow* head2)

    {

    snow* p = NULL;

    p = (snow*)malloc(sizeof(snow));

    *p = *head2;

    newheadre = p;

    return newheadre;

    }
    //Функция вывода меню редактирования списка

    void menucreate()

    {

    puts("1-добавление информации в конец списка");

    puts("2-добавление информации в начало списка");

    puts("3-добавление информации на n-место");

    puts("4-удаление информации о n-ом сноуборде");

    puts("5-изменение информации о n-ом сноуборде");

    }
    //Функция обмена информацией между соседними элементами списка

    snow* exchange(snow* head2, snow* headnext)

    {

    snow* p = NULL;

    snow* head3 = NULL;

    p = (snow*)malloc(sizeof(snow));

    *p = *head2;

    *head2 = *headnext;

    head2->next = headnext;

    head3 = headnext->next;

    *headnext = *p;

    headnext->next = head3;

    return head2;

    }
    //Функция вывода меню сортировки

    void menusort()

    {

    puts("1-Сортировка по возрастанию");

    puts("2-Сортировка по убыванию");

    }
    //Изменение информации о n-ом элементе

    snow* changen(snow* head)

    {

    int n;

    int m;

    int i;

    snow* head2 = NULL;

    short choice2;

    int flex;

    int lenght;

    char* slovo = NULL;

    head2 = head;

    while (head2->next != NULL)

    {

    head2 = head2->next;

    i++;

    }

    m = i;

    do

    {

    puts("Введите номер сноуборда:");

    scanf("%d", &n);

    if (n < 1 || n > m + 1)

    puts("В списке нет сноуборда с таким номером. Повторите ввод\n");

    } while (n < 1 || n > m + 1);

    head2 = head;

    for (i = 0; i < n - 1; i++)

    head2 = head2->next;

    do

    {

    printf("\nВведите номер критерия для изменения инф. о сноуборде №%d", n);

    puts("\n1-бренд");

    puts("2-модель");

    puts("3-назначение");

    puts("4-тип прогиба");

    puts("5-жесткость");

    puts("6-длина");

    puts("0-выход в главное меню");

    choice2 = _getch();

    system("cls");

    switch (choice2)

    {

    case '1':

    printf("Сноуборд №%d", n);

    printf("\nТекущее значение: %s", head2->info.brand);

    puts("\n\nВведите название бренда (до 30 символов): ");

    slovo = inputslovo(slovo);

    strcpy(head2->info.brand, slovo);

    slovo = clearchar(slovo);

    puts("\n\nИзменения успешно внесены");

    getch();

    system("cls");

    break;

    case '2':

    printf("Сноуборд №%d", n);

    printf("\nТекущее значение: %s", head2->info.model);

    puts("\n\nВведите модель доски (до 30 символов): ");

    slovo = inputslovo(slovo);

    strcpy(head2->info.model, slovo);

    slovo = clearchar(slovo);

    puts("\n\nИзменения успешно внесены");

    getch();

    system("cls");

    break;

    case '3':

    printf("Сноуборд №%d", n);

    printf("\nТекущее значение: %s", head2->info.recomend);

    puts("\n\nВведите назначение доски: ");

    slovo = inputslovo(slovo);

    strcpy(head2->info.recomend, slovo);

    slovo = clearchar(slovo);

    puts("\n\nИзменения успешно внесены");

    getch();

    system("cls");

    break;

    case '4':

    printf("Сноуборд №%d", n);

    printf("\nТекущее значение: %s", head2->info.cambertype);

    puts("\n\nВведите тип прогиба: ");

    slovo = inputslovo(slovo);

    strcpy(head2->info.cambertype, slovo);

    slovo = clearchar(slovo);

    puts("\n\nИзменения успешно внесены");

    getch();

    system("cls");

    break;
    case '5':

    printf("Сноуборд №%d", n);

    printf("\nТекущее значение: %d", head2->info.flex);

    inputflex(&flex);

    head2->info.flex = flex;

    puts("\n\nИзменения успешно внесены");

    getch();

    system("cls");

    break;

    case '6':

    printf("Сноуборд №%d", n);

    printf("\nТекущее значение: %d", head2->info.flex);

    inputlenght(&lenght);

    head2->info.lenght = lenght;

    puts("\n\nИзменения успешно внесены");

    getch();

    system("cls");

    break;

    default:

    if (choice2 != '0')

    {

    puts("В меню нет такого пункта. Повторите ввод");

    getch();

    system("cls");

    }

    }

    } while (choice2 != '0');

    return (head);

    }
    //Функция ввода приоритета сортировки

    char* priority(char* slovo)

    {

    char l;

    short nosimvol = 0;//0-если не ввели ни одного символа

    short i = 0;

    short j;

    char sl[3];

    short z;//1-если ввели два одинаковых критерия

    short k;

    while (i == 0 || nosimvol == 0 || z == 1)

    {

    nosimvol = 0;

    i = 0;

    z = 0;

    l = 'o';

    while (i < 2 && (int)l != 13)

    {

    l = _getche();

    //если ввели 1 или 2

    if ((int)l >= 49 && (int)l <= 50)

    {

    if (nosimvol == 0)

    {

    nosimvol = 1;

    }

    sl[i] = l;

    i++;

    }

    else

    {

    //запрет на ввод символов кроме '1' или '2'

    if ((int)l != 13 && (int)l != 8)

    {

    printf("\b");

    printf(" ");

    printf("\b");

    }

    }

    //удаление введеннго слова

    if ((int)l == 8 && i != 0)

    {

    printf(" ");

    printf("\b");

    i--;

    }

    }

    if (i == 0 || nosimvol == 0)

    puts("Вы не ввели ни одного символа. Повторите ввод:");

    else

    sl[i] = '\0';

    //проверка на ввод одинаковых критериев

    for (j = 0; j < i - 1; j++)

    for (k = j + 1; k < i; k++)

    {

    if (sl[j] == sl[k])

    {

    puts("Вы ввели два или более одинаковых критерия.

    Повторите ввод");

    z = 1;

    }

    }

    }

    slovo = (char*)malloc(sizeof(char) * (i + 1));

    strcpy(slovo, sl);

    return slovo;

    }
    //Функция для сортировки списка

    snow* sort(snow* head, short choice2)

    {

    snow* head2 = NULL;

    snow* headnext = NULL;

    snow* p = NULL;

    int a;

    int nexta;

    int b;

    int nextb;

    char* prior = NULL;

    int n = 10000;

    int i = 0;

    short h = 0;//1-если нужно перейти к следующей паре элементов

    int j = 0;//0-если еще неизвестно кол-во элементов списка

    char* prior2 = NULL;

    short z = 0;//0-если было сравнение по первому приоритету

    head2 = head;

    if (head2->next == NULL)

    puts("В списке всего один элемент");

    else

    {

    switch (choice2)

    {

    case '1':

    puts("Сортировка по возрастанию\n");

    break;

    case '2':

    puts("Сортировка по убыванию\n");

    break;

    }

    puts("Введите номера критериев для сортировки (по приоритету) :");

    puts("1 - по жесткости");

    puts("2 - по длине\n");

    //ввод приоритета сортировки

    prior = priority(prior);

    do

    {

    z = 0;

    i = 0;

    h = 0;

    head2 = head;

    headnext = head2->next;

    while (i < n && headnext->next != NULL)

    {

    head2 = head2->next;

    headnext = head2->next;

    i++;

    }

    //если еще не известно кол-во эементов списка

    if (j == 0)

    {

    n = i;

    j++;

    }

    do

    {

    switch (*prior)

    {

    case '1': //если сортировка по жесткости

    a = head2->info.flex;

    nexta = headnext->info.flex;

    break;

    case '2': //если сортировка по длине

    a = head2->info.lenght;

    nexta = headnext->info.lenght;

    break;

    }

    //если сортировка по возрастанию или убыванию

    if (choice2 == '1' ? a > nexta : a < nexta)

    {

    exchange(head2, headnext);

    head2 = head2->next;

    headnext = head2->next;

    }

    else

    {

    //если по первому приоритету эл-ты равны

    if (a == nexta)

    {

    //если перед этим сравнивали по первому приоритету

    if (z == 0)

    {

    prior2 = prior;

    z = 1;

    }

    prior2++;

    switch (*prior2)

    {

    case '1': //если сортировка по жесткости

    b = head2->info.flex;

    nextb = headnext->info.flex;

    break;

    case '2': //если сортировка по жесткости

    b = head2->info.lenght;

    nextb = headnext->info.lenght;

    break;

    case '\0': //если элементы равны по всем

    приоритетам

    head2 = head2->next;

    headnext = head2->next;

    z = 0;

    break;

    }

    if (*prior2 != '\0' &&

    ( choice2 == '1' ? b > nextb : b < nextb))

    {

    exchange(head2, headnext);

    head2 = head2->next;

    headnext = head2->next;

    z = 0;

    }

    }

    else

    /*если элемент больше или меньше следующего

    переход к следующей паре элементов*/

    h = 1;

    }

    } while (headnext != NULL && h == 0);

    n--;

    } while (n != -1);

    }

    puts("\n\nСортировка успешно выполнена");

    return head;

    }
    10.Результат выполнения программы

    При выполнении программы были получены результаты, совпадающие со значениями из таблиц 1 и 2. Ошибки не обнаружены.

    Вывод

    При выполнении лабораторной работы были получены практические навыки работы с односвязными списками в языке «С/C++».
    1   2   3   4


    написать администратору сайта