Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <string.h>
- #include <stdlib.h>
- #include <stdio.h>
- #include <search.h>
- #include "list.h"
- /*
- typedef struct
- {
- // data
- int logLen;
- int allocLen;
- void* elems;
- } List;
- typedef struct{
- int elemSize;
- void* elemAdr;
- } Elem;
- */
- void ListNew(List *l) {
- l->logLen = 0;
- l->allocLen = 4;
- l->elems = malloc(l->allocLen * sizeof(Elem));
- }
- void ListGrow(List* l) {
- l->allocLen *= 2;
- l->elems = realloc(l->elems, sizeof(Elem) * l->allocLen);
- }
- void ListAppend(List *l, void *elemAdr, int elemSize) {
- // შეიძლება insert(l, l->logLen - 1, elemAdr, elemSize);
- if (l->logLen >= l->allocLen) {
- ListGrow(l);
- }
- void* where = ((Elem*) l->elems) + l->logLen;
- Elem * el = malloc( sizeof(Elem));
- el->elemSize = elemSize;
- el->elemAdr = malloc(elemSize);
- el->elemAdr = memcpy(el->elemAdr, elemAdr, elemSize);
- where = memcpy(where, el, (size_t) sizeof(Elem));
- free(el);
- l->logLen++;
- }
- void ListRemove(List *l, int index) {
- Elem* from = (Elem*) l->elems + index;
- free(from->elemAdr);
- memmove(from, from + 1, sizeof(Elem) * (l->logLen - index - 1));
- l->logLen--;
- }
- void ListGet(List *l, int index, void *elemAdr) {
- // assert(index < l->logLen);
- void* from = ((Elem*) l->elems + index)->elemAdr;
- elemAdr = memcpy(elemAdr, from, (size_t)((Elem*) l->elems + index)->elemSize);
- }
- void ListDispose(List *l) {
- // მუშაობს O(N)-ში
- for (int i = l->logLen - 1; i >= 0; i--) {
- ListRemove(l, i);
- }
- free(l->elems);
- }
- void ListInsert(List* l, int index, void* elemAdr, int elemSize) {
- if (l->logLen >= l->allocLen) {
- ListGrow(l);
- }
- Elem* from = (Elem*) l->elems + index;
- memmove(from + 1, from, sizeof(Elem) * (l->logLen - index));
- Elem * el = malloc( sizeof(Elem));
- el->elemSize = elemSize;
- el->elemAdr = malloc(elemSize);
- el->elemAdr = memcpy(el->elemAdr, elemAdr, elemSize);
- from = memcpy(from, el, (size_t) sizeof(Elem));
- free(el);
- l->logLen++;
- }
- void ListPrint(List *l, void(*PrintFn)(void*)) {
- for (int i = 0; i < l->logLen; i++) {
- Elem * curElem = (Elem *)l->elems + i;
- PrintFn(curElem->elemAdr);
- }
- }
- void PrintForInt(List *l) {
- printf("%s\n", "List Elements:");
- for (int i = 0; i < l->logLen; i++) {
- Elem * curElem = (Elem *)l->elems + i;
- printf("%d\n", *(int*)(curElem->elemAdr));
- }
- }
- int intCmpFn(const void* a, const void* b) {
- int x = *(int*) (((Elem *)a) -> elemAdr);
- int y = *(int*) (((Elem *)b) -> elemAdr);
- return x - y;
- }
- // returns an index or -1
- int ListSearch(List* l, void* elem) {
- void* found = bsearch((Elem*)elem, l->elems, (size_t)(l->logLen), (size_t)sizeof(Elem), (
- int (*)(const void *, const void *)) intCmpFn);
- if (found != NULL) {
- return (((char*)found - (char*)l->elems) / sizeof(Elem));
- } else {
- return -1;
- }
- }
- void ListSort(List*l) {
- qsort(l->elems, l->logLen, sizeof(Elem), (int (*)(const void *, const void *)) intCmpFn);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement