Перестановка местами первого и последнего элементов динамического списка - 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;
}

Объяснение кода листинга программы

  1. Переменная prof** ppHead указывает на голову динамического списка.
  2. Переменная prof* pPrevLastItem инициализируется значением *ppHead, т.е. первым элементом списка.
  3. Переменная prof* pCurrentItem инициализируется значением *ppHead, т.е. первым элементом списка.
  4. В цикле while происходит проход по всем элементам списка, начиная со второго, до тех пор, пока не будет достигнут последний элемент (или голова списка).
  5. В каждой итерации цикла pCurrentItem указывает на текущий элемент списка, а pPrevLastItem обновляется значением pCurrentItem перед выходом из цикла.
  6. После цикла pLastItem указывает на последний элемент списка, а pPrevLastItem указывает на предпоследний элемент списка.
  7. Затем pPrevLastItem обновляется, чтобы указывать на голову списка.
  8. pLastItem обновляется, чтобы указывать на второй элемент списка.
  9. pLastItem обновляется, чтобы указывать на второй элемент списка.
  10. (*ppHead) обновляется, чтобы указывать на последний элемент списка.
  11. pPrevLastItem обновляется, чтобы указывать на голову списка.
  12. (*ppHead) обновляется, чтобы указывать на новый pLastItem.
  13. Результат: последний элемент списка становится новым первым элементом списка.
  14. Результат: голова списка теперь указывает на второй элемент списка.
  15. Результат: первый элемент списка теперь указывает на конец списка (никуда не указывает).
  16. Результат: ppHead теперь указывает на новый pLastItem.
  17. Результат: список перевернут так, что первый элемент стал последним, а последний - первым.
  18. Возвращается void (пустой результат).
  19. Код вызывается с аргументом ppHead, указывающим на голову динамического списка.
  20. После вызова функции SwapItems список перевернут так, что первый элемент стал последним, а последний - первым.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.083 из 5
Похожие ответы