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