Разбить односвязный список на группы - C (СИ)

Узнай цену своей работы

Формулировка задачи:

разбить односвязный список на группы по 5 элементов + в каждой пятерке элементов поменять порядок на обратный ЗЫ.нужно срочно!!!

Решение задачи: «Разбить односвязный список на группы»

textual
Листинг программы
#include <stdlib.h>
#include <locale.h>
 
typedef struct List
{
    int n;
    List* pNext;
} LIST;
 
typedef struct Lists
{
    LIST* pList;
    LIST* pTail;
} LISTS;
 
void Init(LISTS* pLists, int size);
void Fill(LISTS& list, int size);
void AddTail(LISTS& list, int value);
 
int main()
{
    setlocale(LC_ALL,"Russian");
 
    int N = -1, M = -1;
    printf("Введите число элементов списка N = "); 
    scanf("%d",&N);
 
    printf("Введите число элементов в группе M = "); 
    scanf("%d",&M);
 
    printf("\n");
        
    LISTS* pLists = (LISTS*)malloc((N / M + 1) * sizeof(LISTS));
    if (pLists != NULL) { Init(pLists, N / M + 1); Fill(pLists[0], N); }
 
    LIST* pList = pLists[0].pList; 
    for (int i = 1; i <= N / M + 1; i++)
    {
        int nCount = M;
        while ((pList != NULL) && (--nCount >= 0))
        {
            AddTail(pLists[i],pList->n);
            pList = pList->pNext;
        }
    }
 
    for (int i = 1; i <= N / M + 1; i++)
    {
        LIST* pList = pLists[i].pList;
        for (; pList != NULL; pList = pList->pNext)
            printf("%d ",pList->n);
        printf("\n");
    }
 
    free(pLists);
 
    return 0;
}
 
void Init(LISTS* pLists, int size)
{
    for (int i = 0; i <= size; i++)
        pLists[i].pList = pLists[i].pTail = NULL;
}
 
void Fill(LISTS& list, int size)
{
    for (int i = 0; i < size; i++)
        AddTail(list, rand() % size + 1);
}
 
void AddTail(LISTS& list, int value)
{
    LIST* pNode = (LIST*)malloc(sizeof(LIST));
    pNode->n = value; pNode->pNext = NULL;
    if (list.pList == NULL) { list.pList = pNode; 
          list.pTail = list.pList; }
    else { list.pTail->pNext = pNode; list.pTail = pNode; }
}

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

  1. Объявлены структуры данных: LIST и LISTS.
  2. В функции main() пользователь вводит количество элементов в списке N и количество элементов в группе M.
  3. Создается массив размером (N/M+1) для хранения списков.
  4. В цикле заполняются списки из N элементов, добавляя элементы в конец списка.
  5. Затем, в цикле, выводятся все элементы всех списков.
  6. В функции Init() инициализируются все ссылки на NULL.
  7. В функции Fill() в каждой группе случайным образом добавляются элементы до тех пор, пока не будет достигнут размер списка N.
  8. В функции AddTail() создается новый узел списка, и он добавляется в конец списка. Если это первый элемент в списке, то он становится и хвостом списка.

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


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

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

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