diff --git a/TP3/List/BlockList.c b/TP3/List/BlockList.c new file mode 100644 index 0000000..009da3f --- /dev/null +++ b/TP3/List/BlockList.c @@ -0,0 +1,267 @@ +#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; + if ((pcell = GetCellFromRecycle(list))) + { + return 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 *GetCellFromRecycle(SList *list) +{ + SCell *pcell = list->recycle; + if (pcell != NULL) + { + list->recycle = pcell->next; + } + return pcell; +} + +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..cec0716 --- /dev/null +++ b/TP3/List/BlockList.h @@ -0,0 +1,30 @@ +#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 *head, SCell *cell); +SCell *GetCellFromBlock(SList *list); +SCell *GetCellFromRecycle(SList *list); + +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..8979139 --- /dev/null +++ b/TP3/List/BlockMain.c @@ -0,0 +1,96 @@ +#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); + + AddElementEnd(list, 10); + 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 ef75cb2..bee611a 100755 Binary files a/TP3/List/a.out and b/TP3/List/a.out differ