Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <clocale>
- #include <iostream>
- #include <stdio.h>
- #include <stdlib.h>
- #include <windows.h>
- struct Vodoem{
- char name[20]; // название водоема
- long int size; // размер водоема
- int number_ports; // количество портов
- Vodoem* next; // указатель на следующий элемент в списке
- };
- // функция добавления элемента в конец списка
- void spisok_add_item( Vodoem*& spisok, // указатель на начало списка
- char* name, // название водоема
- long int size, // размер водоема
- int number_ports
- )
- {
- Vodoem* p; // указатель
- // если в списке есть элементы
- if( spisok != NULL ){
- p = spisok; // ставим указатель на начало списка
- // перемещаем текущий указатель p на самый последний элемент списка
- while( p->next != NULL ){
- p = p->next;
- }
- p->next = (Vodoem*) malloc( sizeof(Vodoem) ); // создаем новый элемент
- p = p->next;
- } else {
- spisok = (Vodoem*) malloc( sizeof(Vodoem) ); // создаем новый элемент
- p = spisok;
- }
- // ИНИЦИАЛИЗИРУЕМ СОЗДАННЫЙ ЭЛЕМЕНТ СПИСКА
- p->next = NULL; // делаем указатель на следующий элемент NULL
- strcpy( p->name, name ); // копируем название
- p->size = size; // присваиваем размер
- p->number_ports = number_ports; // присваиваем количество портов
- }
- // Выводит все элементы списка на экран
- void spisok_print( Vodoem* spisok){
- Vodoem* p; // указатель
- p = spisok; // ставим указатель на начало списка
- // пока есть элементы, выводим значения элемента и перемещаем указатель на следующий
- printf("nn===========================================n");
- printf(" Данные массиваn");
- printf("===========================================n");
- printf(" Название водоема Размер Кол-во портов ");
- printf("n===========================================n");
- while( p != NULL )
- {
- printf("t%stt%dt%dn", p->name, p->size, p->number_ports );
- p = p->next;
- printf("===========================================n");
- }
- }
- // удаляет последний элемент в списке
- void spisok_remove_last_item( Vodoem*& spisok ){
- Vodoem* p, pback; // указатель
- if( spisok != NULL ){
- p = spisok; // ставим указатель на начало списка
- // если в списке 1 эоемент, то удаляем его
- if( p->next == NULL ){
- free(spisok); // удаляем элемент
- spisok = NULL; // делаем указатель NULL
- } else {
- // если элементов в списке много, то ищем предпоследний
- while( p->next->next != NULL ){
- p = p->next;
- }
- free(p->next); // удаляем последний элемент
- p->next = NULL; // делаем указатель NULL
- }
- }
- }
- void menu_vvod(Vodoem*& spisok){
- Vodoem* p; // указатель
- p = spisok; // ставим указатель на начало списка
- FILE *f;
- char name[20];
- long int size;
- int number_ports;
- system("cls");
- printf("1. Вы выбрали ввод из файлаn");
- f = fopen("vodoemy.txt", "r");
- // пока есть элементы, выводим значения элемента и перемещаем указатель на следующий
- while ( !feof(f) ){
- fscanf(f, "%st%dt%dn", name, &size, &number_ports ); // читаем из файла
- spisok_add_item(spisok, name, size, number_ports); // добавляем в конец списка
- }
- fclose(f);
- printf("Файл vodoemy.txt успешно подключен n");
- spisok_print(spisok);
- system("pause");
- }
- // добавление элемента в конец
- void menu_add(Vodoem*& spisok){
- char name[20];
- long int size;
- int number_ports;
- // очищаем экран
- system("cls");
- printf("2. Вы выбрали добавить элемент в конец n");
- printf("Введите название водоема: ");
- scanf("%s", name);
- printf("Введите размер водоема: ");
- scanf("%d", &size);
- printf("Введите количество портов: ");
- scanf("%d", &number_ports);
- printf("Элемент успешно добавлен");
- // добавление водоема в конец списка
- spisok_add_item(spisok, name, size, number_ports);
- spisok_print(spisok);
- system("pause");
- }
- void menu_print(Vodoem*& spisok){
- system("cls");
- printf("3. Вы выбрали просмотр всех элементовn");
- spisok_print(spisok);
- system("pause");
- }
- void menu_save(Vodoem*& spisok){
- Vodoem* p; // указатель
- p = spisok; // ставим указатель на начало списка
- FILE *f;
- system("cls");
- printf("4. Вы выбрали сохранение в файлn");
- f = fopen("vodoemy.txt", "w");
- // пока есть элементы, выводим значения элемента и перемещаем указатель на следующий
- while( p != NULL ){
- fprintf(f, "%s%d%dn", p->name, p->size, p->number_ports );
- p = p->next;
- }
- fclose(f);
- printf("Успешно сохранено в файл vodoemy.txt.n");
- spisok_print(spisok);
- system("pause");
- }
- // Возвращает указатель на элемент списка по индексу
- Vodoem* spisok_item_by_index(Vodoem*& spisok, int index ){
- int i = 0;
- Vodoem* p = spisok;
- while( p != NULL && i != index ){
- p = p->next;
- ++i;
- }
- if( i != index ){
- p = NULL;
- }
- return p;
- }
- void menu_korekt(Vodoem*& spisok){
- int index;
- int i;
- char name[20];
- long int size;
- int number_ports;
- Vodoem* p = spisok;
- system("cls");
- printf("5. Вы выбрали корректировка полей по индексу n");
- spisok_print( spisok );
- printf("Введите номер элемента в списке (начиная с 0): ");
- scanf("%d", &index);
- i = 0;
- p = spisok_item_by_index(spisok, index);
- if( p != NULL ){
- printf("%dt%st%dt%dn", i, p->name, p->size, p->number_ports );
- printf("Введите название водоема: ");
- scanf("%s", p->name);
- printf("Введите размер водоема: ");
- scanf("%d", &p->size);
- printf("Введите количество портов: ");
- scanf("%d", &p->number_ports);
- spisok_print( spisok );
- } else {
- printf("Элемент не найденnn");
- }
- system("pause");
- }
- // возвращает указатель на элемент по индексу
- Vodoem* get( Vodoem*& spisok, int index){
- Vodoem* p;
- int i = 0;
- p = spisok;
- while(i < index && p != NULL){
- ++i;
- p = p->next;
- }
- return p;
- }
- // возвращает количество элементов в списке
- int count( Vodoem*& spisok ){
- int N = 0;
- Vodoem *p = spisok;
- while( p !=NULL ){
- ++N;
- p = p->next;
- }
- return N;
- }
- void menu_sort(Vodoem*& spisok){
- system("cls");
- printf("6. Вы выбрали сортировка по размеру водоема n");
- // выводим на экран список
- printf("Do sortirovki: nn");
- spisok_print( spisok );
- int N;
- int i,j;
- // считаем количество элементов
- N = count(spisok);
- Vodoem* a, *b, *t;
- for(i=0; i<N; ++i){
- for(j=i+1; j<N; ++j){
- a = get(spisok, i);
- b = get(spisok, j);
- if( a->size < b->size ){
- Vodoem* ap = get(spisok, i-1);
- Vodoem* bp = get(spisok, j-1);
- // меняем местами
- ap->next = b;
- bp->next = a;
- t = a->next;
- a->next = b->next;
- b->next = t;
- }
- }
- }
- printf("nnnPosle sortirovki: nn");
- spisok_print( spisok );
- system("pause");
- }
- void menu_add_new(Vodoem*& spisok){
- int i, index;
- char name[20];
- long int size;
- int number_ports;
- Vodoem* p = spisok;
- Vodoem* new_item = NULL;
- Vodoem* prev_item = NULL;
- system("cls");
- printf("7. Вы выбрали вставка нового элемента перед выбраным n");
- spisok_print( spisok );
- printf("Введите номер элемента в списке (начиная с 0): ");
- scanf("%d", &index);
- p = spisok_item_by_index(spisok, index);
- if( p == NULL ){
- printf("Элемен не найденnn");
- } else {
- // Выводим информацию о водоеме, перед которым нужно вставить новый элемент
- printf("%dt%st%dt%dn", index, p->name, p->size, p->number_ports );
- // создаем объект водоема
- new_item = (Vodoem*) malloc( sizeof(Vodoem) );
- printf("Введите название водоема: ");
- scanf("%s", new_item->name);
- printf("Введите размер водоема: ");
- scanf("%d", &new_item->size);
- printf("Введите количество портов: ");
- scanf("%d", &new_item->number_ports);
- if( index > 0 ){
- // ищем предыдущий элемент
- prev_item = spisok_item_by_index(spisok, index -1 );
- } else {
- spisok = new_item;
- }
- if( prev_item != NULL ){
- prev_item->next = new_item;
- }
- new_item->next = p;
- }
- spisok_print( spisok );
- system("pause");
- }
- // удаляет список из памяти
- void spisok_delete(Vodoem*& spisok){
- }
- void menu(){
- SetConsoleCP(1251);// установка кодовой страницы win-cp 1251 в поток ввода
- SetConsoleOutputCP(1251);
- // объявляем указатель на Vodoem
- // это будет указатель НА ПЕРВЫЙ элемент списка водоемов
- Vodoem* spisok = NULL; // инициируем указатель NULL
- int punkt_menu;
- do{
- system("cls");
- printf("=========================================n");
- printf(" Меню программы <Водоемы страны>:n");
- printf("=========================================n");
- printf("1. Ввод из файлаn");
- printf("2. Добавить элемент в конецn");
- printf("3. Просмотр всех элементовn");
- printf("4. Сохранение в файлn");
- printf("5. Корректировка полей по индексуn");
- printf("6. Сортировка по размеру водоемаn");
- printf("7. Вставка нового элемента перед выбранымn");
- printf("0. Выход из программыn");
- printf("=========================================n");
- printf("Введите номер пункта меню: ");
- scanf("%d", &punkt_menu);
- switch( punkt_menu ){
- case 1:
- menu_vvod(spisok);
- break;
- case 2:
- menu_add(spisok);
- break;
- case 3:
- menu_print(spisok);
- break;
- case 4:
- menu_save(spisok);
- break;
- case 5:
- menu_korekt(spisok);
- break;
- case 6:
- menu_sort(spisok);
- break;
- case 7:
- menu_add_new(spisok);
- break;
- }
- } while( punkt_menu != 0 );
- // удаляет список из памяти
- void spisok_delete(Vodoem*& spisok);{
- Vodoem* it;
- Vodoem* p = spisok;
- // пока не достигнут последний элемент списка - удаляем элементы из памяти
- while( p != NULL ){
- it = p;
- p = p->next;
- // освобождаем память
- free(it);
- }
- }
- }
- int main(int argc, char *argv[])
- {
- menu();
- return 1;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement