Перестановка местами первого и последнего элементов динамического списка - 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
список перевернут так, что первый элемент стал последним, а последний - первым.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д