Перестановка местами первого и последнего элементов динамического списка - C (СИ)
Формулировка задачи:
есть программа, нужно поменять местами первую и последнюю строчку этой структуры. Подскажите как это можно сделать? Вот текст программы:
Листинг программы
- #include <stdio.h>
- #include <conio.h>
- #include <locale.h>
- #include <malloc.h>
- struct prof
- {
- char vostreb[10];
- char name[20];
- struct zarp
- {
- int min,max;
- }z;
- struct prof* next;
- };
- struct prof* create(void); // функция создания списка (возвращает адрес его головы)
- void destroy(struct prof*); // удаление сиписка
- void list(struct prof*); // функция просмотра списка
- void main()
- {
- setlocale(LC_ALL,"Rus");
- struct prof* head = create();// глобальная переменная, адрес головы списка
- list(head);
- getch();
- }
- struct prof* create(void)
- {
- struct prof* p, * pred = NULL, * head = NULL; // pred – указатель на предыдущую структуру
- char c = 0;
- while (c != '*')
- {
- p = (struct prof*) malloc(sizeof(struct prof));
- printf("Название профессии:"); scanf("%s", p->name);
- fflush(stdin);
- printf("Востребованность:"); scanf("%s", p->vostreb);
- fflush(stdin);
- printf("Минимальная зарплата:"); scanf("%d", &p->z.min);
- printf("Максимальная зарплата:"); scanf("%d", &p->z.max);
- if (pred == NULL)
- {
- head = p;
- }
- else
- {
- pred->next = p; //ссылка из предыдущей записи на текущую
- }
- pred = p; // сохранение адреса текущей записи в поле предыдущей
- printf(" \n ВВод заверщен?\n * - Да , ENTER - Нет \n");
- c = getch();
- }
- p->next = NULL;
- return head;
- }
- void list(struct prof* head)
- {
- printf(" Исходные структурированные данные\n");
- printf(" ЗАРПЛАТА \n");
- printf("МИН\tМАКС\tВОСТРЕБОВАННА\tПРОФЕССИЯ \n");
- while (head != NULL) // пока не конец списка
- {
- printf("%d\t%d\t%s\t\t%s\n",head->z.min,head->z.max,head->vostreb,head->name);
- head = head->next; // продвижение по списку
- }
- }
Решение задачи: «Перестановка местами первого и последнего элементов динамического списка»
textual
Листинг программы
- void SwapItems(prof** ppHead)
- {
- prof* pPrevLastItem = *ppHead; // предпоследний элемент
- prof* pCurrentItem = *ppHead;
- while(pCurrentItem->next != NULL)
- {
- pCurrentItem = pCurrentItem->next;
- if (pCurrentItem->next != NULL) pPrevLastItem = pCurrentItem;
- }
- prof* pLastItem = pPrevLastItem->next;
- pPrevLastItem->next = *ppHead; // предпоследний элемент теперь указывает на голову
- pLastItem->next = (*ppHead)->next; // последний элемент стал указывать на второй
- (*ppHead)->next = NULL; // бывшая голова в конце списка (никуда не указывает)
- (*ppHead) = pLastItem;
- }
Объяснение кода листинга программы
- Переменная
prof** ppHead
указывает на голову динамического списка. - Переменная
prof* pPrevLastItem
инициализируется значением*ppHead
, т.е. первым элементом списка. - Переменная
prof* pCurrentItem
инициализируется значением*ppHead
, т.е. первым элементом списка. - В цикле while происходит проход по всем элементам списка, начиная со второго, до тех пор, пока не будет достигнут последний элемент (или голова списка).
- В каждой итерации цикла
pCurrentItem
указывает на текущий элемент списка, аpPrevLastItem
обновляется значениемpCurrentItem
перед выходом из цикла. - После цикла
pLastItem
указывает на последний элемент списка, аpPrevLastItem
указывает на предпоследний элемент списка. - Затем
pPrevLastItem
обновляется, чтобы указывать на голову списка. pLastItem
обновляется, чтобы указывать на второй элемент списка.pLastItem
обновляется, чтобы указывать на второй элемент списка.(*ppHead)
обновляется, чтобы указывать на последний элемент списка.pPrevLastItem
обновляется, чтобы указывать на голову списка.(*ppHead)
обновляется, чтобы указывать на новыйpLastItem
.- Результат: последний элемент списка становится новым первым элементом списка.
- Результат: голова списка теперь указывает на второй элемент списка.
- Результат: первый элемент списка теперь указывает на конец списка (никуда не указывает).
- Результат:
ppHead
теперь указывает на новыйpLastItem
. - Результат: список перевернут так, что первый элемент стал последним, а последний - первым.
- Возвращается
void
(пустой результат). - Код вызывается с аргументом
ppHead
, указывающим на голову динамического списка. - После вызова функции
SwapItems
список перевернут так, что первый элемент стал последним, а последний - первым.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д