Индивидуальное задание (FIFO, массивы) - C (СИ)
Формулировка задачи:
Привет!
Ребята, нужна ваша помощь. Мне нужно написать несколько программ на работу с очередями, используя динамические структуры. Но в этой теме не очень разобрался. Точнее, понимаю, как все работает, но вызрели 2 вопроса.
1) Последний элемент FIFO всегда NULL?
2) Нужно три указателя для работы с очередью: для первого, текущего и следующего элементов?
(*p1).value = NULL; // p1 — указатель на текущий элемент; value — значение элемента (*p1).next = NULL; // next — адрес следующего элемента
Решение задачи: «Индивидуальное задание (FIFO, массивы)»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #include <alloc.h> #include <time.h> #include <math.h> main(){ int *mas, i, n = 0, min, max, *m, z = 0, x; while(n<1){ printf("Введите n: "); scanf("%d", &n); } mas = (int *)malloc(n * sizeof(int)); if(!mas){ printf("Оишбка выделения памяти!\n"); system("PAUSE"); return 0; } srand(time(NULL)); printf("Исходный массив: \n"); for(i = 0; i < n; i++){ *(mas+i) = -10 + rand()%21; printf("%5d", *(mas+i)); } printf("\n"); min = 0; max = 0; for(i = 1; i < n; i++){ if(*(mas+i) > *(mas+max)) max = i; if(*(mas+i) < *(mas+min)) min = i; } x = n - abs(max - min)+1; m = (int *)malloc(x * sizeof(int)); if(!m){ printf("Оишбка выделения памяти!\n"); system("PAUSE"); return 0; } if(min < max){ for(i = 0; i < n; i++) if((i <= min)||(i >= max)) *(m + z++) = *(mas + i); }else for(i = 0; i < n; i++) if((i <= max)||(i >= min)) *(m + z++) = *(mas + i); free(mas); mas = m; printf("Полученный массив:\n"); for(i = 0; i < x; i++) printf("%5d", *(mas+i)); free(mas); printf("\n"); system("PAUSE"); return 0; }
Объяснение кода листинга программы
- Объявление переменных:
- mas: указатель на массив целых чисел (int)
- i: целочисленная переменная для цикла
- n: целочисленная переменная для количества элементов массива
- min: целочисленная переменная для хранения минимального значения в массиве
- max: целочисленная переменная для хранения максимального значения в массиве
- m: указатель на массив целых чисел (int)
- z: целочисленная переменная для хранения индекса элемента в массиве m
- x: целочисленная переменная для хранения размера нового массива
- srand(time(NULL)): инициализация генератора случайных чисел текущим временем
- printf(
Введите n:
): вывод сообщения с просьбой ввести количество элементов массива - scanf(
%d
, &n): ввод количества элементов массива с помощью функции scanf
- Выделение памяти под массив с помощью функции malloc:
- mas = (int )malloc(n sizeof(int));
- если память не может быть выделена, программа выводит сообщение об ошибке и завершается
- Инициализация массива:
- srand(time(NULL)): инициализация генератора случайных чисел текущим временем
- for(i = 0; i < n; i++){
- *(mas+i) = -10 + rand()%21;
- printf(
%5d
, *(mas+i)); - printf(
\n
);
- Поиск минимального и максимального значений в массиве:
- min = 0;
- max = 0;
- for(i = 1; i < n; i++){
- if((mas+i) > (mas+max)) max = i;
- if((mas+i) < (mas+min)) min = i;
- x = n - abs(max - min)+1;
- Выделение памяти под новый массив:
- m = (int )malloc(x sizeof(int));
- если память не может быть выделена, программа выводит сообщение об ошибке и завершается
- Копирование элементов из исходного массива в новый:
- if(min < max){
- for(i = 0; i < n; i++)
- if((i <= min)||(i >= max)) (m + z++) = (mas + i);
- else
- for(i = 0; i < n; i++)
- if((i <= max)||(i >= min)) (m + z++) = (mas + i);
- Освобождение памяти под исходный массив:
- free(mas);
- Замена указателя на массив на указатель на новый массив:
- mas = m;
- Вывод нового массива:
- printf(
Полученный массив:\n
); - for(i = 0; i < x; i++)
- printf(
%5d
, *(mas+i));
- printf(
- Освобождение памяти под новый массив:
- free(mas);
- Вывод сообщения и завершение программы:
- printf(
\n
); - system(
PAUSE
); - return 0;
- printf(
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д