From 57fb482c0a5be06e5d34b0b3c1adea23c4e801ef Mon Sep 17 00:00:00 2001 From: MAO Dongyang Date: Fri, 17 Mar 2023 20:35:24 +0100 Subject: [PATCH] recycle fini --- TP3/List/BlockList.c | 253 +++++++++++++++++++++++++++++++++++++++++++ TP3/List/BlockList.h | 28 +++++ TP3/List/BlockMain.c | 91 ++++++++++++++++ TP3/List/a.out | Bin 50104 -> 50472 bytes 4 files changed, 372 insertions(+) create mode 100644 TP3/List/BlockList.c create mode 100644 TP3/List/BlockList.h create mode 100644 TP3/List/BlockMain.c diff --git a/TP3/List/BlockList.c b/TP3/List/BlockList.c new file mode 100644 index 0000000..1311e55 --- /dev/null +++ b/TP3/List/BlockList.c @@ -0,0 +1,253 @@ +#include +#include +#include +#include "BlockList.h" +#define BLOCK_SIZE 5 + +struct SList +{ + SCell *first; + SCell *last; + SBlock *block; + SCell *recycle; +}; + +struct SCell +{ + int data; + SCell *next; + SCell *prev; +}; + +struct SBlock +{ + SCell tab[BLOCK_SIZE]; + SBlock *bnext; +}; + +SList *CreateList() +{ + SList *list; + list->block = CreateBlock(); + list->first = NULL; + list->last = NULL; + list->recycle = NULL; + return list; +} + +SBlock *CreateBlock() +{ + SBlock *block = (SBlock *)malloc(sizeof(SBlock)); + block->bnext = NULL; + for (int i; i < BLOCK_SIZE; i++) + { + block->tab[i].data = NULL; + block->tab[i].prev = NULL; + block->tab[i].next = NULL; + } + return block; +} + +void DeleteList(SList *list) +{ + SCell *cell = GetFirstElement(list); + while (cell != NULL) + { + SCell *next = GetNextElement(cell); + DeleteCell(list, cell); + cell = next; + } + free(list); +} + +SCell *GetCellFromBlock(SList *list) +{ + SCell *pcell; + while (!(pcell = _GetCellFromBlock(list->block))) + { + AddBlock(list->block); + } + return pcell; +} + +SBlock *AddBlock(SBlock *blist) +{ + SBlock *pblock = CreateBlock(); + while (blist->bnext != NULL) + { + blist = blist->bnext; + } + blist->bnext = pblock; + return pblock; +} + +SCell *_GetCellFromBlock(SBlock *bList) +{ + while (bList != NULL) + { + for (int i = 0; i < BLOCK_SIZE; i++) + { + if ((bList->tab)[i].data == NULL) + { + return &(bList->tab)[i]; + } + } + bList = bList->bnext; + } + return NULL; +} + +SCell *AddElementBegin(SList *list, int data) +{ + SCell *cell = GetCellFromBlock(list); + cell->data = data; + cell->next = list->first; + cell->prev = NULL; + if (list->first != NULL) + { + list->first->prev = cell; + } + list->first = cell; + if (list->last == NULL) + { + list->last = cell; + } + return cell; +} + +SCell *AddElementEnd(SList *list, int data) +{ + SCell *cell = GetCellFromBlock(list); + cell->data = data; + cell->next = NULL; + cell->prev = list->last; + if (list->last != NULL) + { + list->last->next = cell; + } + list->last = cell; + if (list->first == NULL) + { + list->first = cell; + } + return cell; +} + +SCell *AddElementAfter(SList *list, SCell *cell, int data) +{ + if (cell == NULL) + { + return AddElementBegin(list, data); + } + else if (cell == list->last) + { + return AddElementEnd(list, data); + } + else + { + SCell *newCell = GetCellFromBlock(list); + newCell->data = data; + newCell->next = cell->next; + newCell->prev = cell; + cell->next->prev = newCell; + cell->next = newCell; + return newCell; + } +} + +SCell *RecycleCell(SCell *head, SCell *cell) +{ + cell->next = NULL; + SCell *recycle = head; + if (recycle == NULL) + { + return cell; + } + while (recycle->next != NULL) + { + recycle = recycle->next; + } + recycle->next = cell; + return head; +} + +void DeleteCell(SList *list, SCell *cell) +{ + if (cell == list->first) + { + list->first = cell->next; + } + if (cell == list->last) + { + list->last = cell->prev; + } + if (cell->prev != NULL) + { + cell->prev->next = cell->next; + } + if (cell->next != NULL) + { + cell->next->prev = cell->prev; + } + list->recycle = RecycleCell(list->recycle, cell); +} + +SCell *GetFirstElement(SList *list) +{ + return list->first; +} + +SCell *GetLastElement(SList *list) +{ + return list->last; +} + +SCell *GetNextElement(SCell *cell) +{ + return cell->next; +} + +SCell *GetPrevElement(SCell *cell) +{ + return cell->prev; +} + +int GetData(SCell *cell) +{ + return cell->data; +} + +void PrintBlockList(SList *list) +{ + printf("Block: "); + SBlock *pBlock = list->block; + while (pBlock != NULL) + { + for (size_t i = 0; i < BLOCK_SIZE; i++) + { + if (pBlock->tab[i].data != NULL) + { + printf(" [%d] ", pBlock->tab[i].data); + } + else + { + printf(" | NULL | "); + } + } + printf("-->"); + pBlock = pBlock->bnext; + } + printf("\n"); +} + +void PrintRecycleList(SList *list) +{ + printf("Recycle: "); + SCell *pCell = list->recycle; + while (pCell != NULL) + { + printf("[%d] -> ", pCell->data); + pCell = pCell->next; + } + printf("\n"); +} \ No newline at end of file diff --git a/TP3/List/BlockList.h b/TP3/List/BlockList.h new file mode 100644 index 0000000..aa4fd0d --- /dev/null +++ b/TP3/List/BlockList.h @@ -0,0 +1,28 @@ +#ifndef _LISTE_H +#define _LISTE_H + +typedef int Data; +typedef struct SCell SCell; +typedef struct SList SList; +typedef struct SBlock SBlock; + +SList *CreateList(); +SBlock *CreateBlock(); +void DeleteList(SList *list); +SCell *_GetCellFromBlock(SBlock *bList); +SBlock *AddBlock(SBlock *blist); +SCell *AddElementBegin(SList *list, Data elem); +SCell *AddElementEnd(SList *list, Data elem); +SCell *AddElementAfter(SList *list, SCell *cell, Data elem); +void DeleteCell(SList *list, SCell *cell); +void PrintRecycleList(SList *list); +SCell* RecycleCell(SCell *, SCell *cell); + +SCell *GetFirstElement(SList *list); +SCell *GetLastElement(SList *list); +SCell *GetPrevElement(SCell *cell); +SCell *GetNextElement(SCell *cell); +Data GetData(SCell *cell); +void PrintBlockList(SList *list); + +#endif diff --git a/TP3/List/BlockMain.c b/TP3/List/BlockMain.c new file mode 100644 index 0000000..ee5cccd --- /dev/null +++ b/TP3/List/BlockMain.c @@ -0,0 +1,91 @@ +#include +#include +#include "BlockList.h" + +void PrintList(SList *list); + +int main() +{ + SList *list; + SCell *cell1, *cell2; + + list = CreateList(); + AddElementEnd(list, 1); + AddElementEnd(list, 2); + AddElementEnd(list, 3); + AddElementEnd(list, 4); + cell1 = AddElementEnd(list, 5); + AddElementEnd(list, 6); + AddElementEnd(list, 7); + AddElementEnd(list, 8); + cell2 = AddElementEnd(list, 9); + + PrintList(list); + PrintBlockList(list); + PrintRecycleList(list); + DeleteCell(list, cell1); + PrintList(list); + PrintBlockList(list); + PrintRecycleList(list); + DeleteCell(list, cell2); + PrintList(list); + PrintBlockList(list); + PrintRecycleList(list); + + printf("\n"); + + // printf("Add 5, 3, 1\n"); + // AddElementEnd(list, 5); + // cell = AddElementEnd(list, 3); + // AddElementEnd(list, 1); + // PrintList(list); + // PrintBlockList(list); + // printf("\n"); + + // printf("Add 6, 8\n"); + // AddElementEnd(list, 6); + // AddElementEnd(list, 8); + // PrintList(list); + // PrintBlockList(list); + // printf("\n"); + + // printf("Add 4\n"); + // AddElementAfter(list, cell, 4); + // PrintList(list); + // PrintBlockList(list); + // printf("\n"); + + // printf("Add 2\n"); + // AddElementAfter(list, GetFirstElement(list), 2); + // PrintList(list); + // printf("\n"); + + // printf("Delete 3\n"); + // DeleteCell(list, cell); + // PrintList(list); + // printf("\n"); + + // printf("Add 7\n"); + // AddElementAfter(list, GetPrevElement(GetLastElement(list)), 7); + // PrintList(list); + // printf("\n"); + + // DeleteList(list); + + return 0; +} + +void PrintList(SList *list) +{ + printf("List: "); + if (list) + { + SCell *cell = GetFirstElement(list); + while (cell != NULL) + { + printf("[%d] -> ", GetData(cell)); + cell = GetNextElement(cell); + } + printf("NULL\n"); + } +} diff --git a/TP3/List/a.out b/TP3/List/a.out index ef75cb2f4e1a6a10f2acb444608e0e985cde6be9..92acb565c396a29e4facede85dbb52b3f8ed973d 100755 GIT binary patch literal 50472 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