Разбить односвязный список на группы - 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; }
}
Объяснение кода листинга программы
- Объявлены структуры данных: LIST и LISTS.
- В функции main() пользователь вводит количество элементов в списке N и количество элементов в группе M.
- Создается массив размером (N/M+1) для хранения списков.
- В цикле заполняются списки из N элементов, добавляя элементы в конец списка.
- Затем, в цикле, выводятся все элементы всех списков.
- В функции Init() инициализируются все ссылки на NULL.
- В функции Fill() в каждой группе случайным образом добавляются элементы до тех пор, пока не будет достигнут размер списка N.
- В функции AddTail() создается новый узел списка, и он добавляется в конец списка. Если это первый элемент в списке, то он становится и хвостом списка.