Перестановка местами первого и последнего элементов динамического списка - 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список перевернут так, что первый элемент стал последним, а последний - первым.