Advertisement
Anophoo

Untitled

Nov 21st, 2017
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.93 KB | None | 0 0
  1. #include <string.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <search.h>
  5.  
  6. #include "list.h"
  7.  
  8. /*
  9. typedef struct
  10. {
  11. // data
  12. int logLen;
  13. int allocLen;
  14. void* elems;
  15. } List;
  16.  
  17. typedef struct{
  18. int elemSize;
  19. void* elemAdr;
  20. } Elem;
  21. */
  22.  
  23. void ListNew(List *l) {
  24. l->logLen = 0;
  25. l->allocLen = 4;
  26. l->elems = malloc(l->allocLen * sizeof(Elem));
  27. }
  28. void ListGrow(List* l) {
  29. l->allocLen *= 2;
  30. l->elems = realloc(l->elems, sizeof(Elem) * l->allocLen);
  31. }
  32.  
  33. void ListAppend(List *l, void *elemAdr, int elemSize) {
  34. // შეიძლება insert(l, l->logLen - 1, elemAdr, elemSize);
  35. if (l->logLen >= l->allocLen) {
  36. ListGrow(l);
  37. }
  38. void* where = ((Elem*) l->elems) + l->logLen;
  39.  
  40. Elem * el = malloc( sizeof(Elem));
  41. el->elemSize = elemSize;
  42. el->elemAdr = malloc(elemSize);
  43. el->elemAdr = memcpy(el->elemAdr, elemAdr, elemSize);
  44. where = memcpy(where, el, (size_t) sizeof(Elem));
  45. free(el);
  46. l->logLen++;
  47. }
  48.  
  49. void ListRemove(List *l, int index) {
  50. Elem* from = (Elem*) l->elems + index;
  51. free(from->elemAdr);
  52. memmove(from, from + 1, sizeof(Elem) * (l->logLen - index - 1));
  53. l->logLen--;
  54. }
  55.  
  56. void ListGet(List *l, int index, void *elemAdr) {
  57. // assert(index < l->logLen);
  58. void* from = ((Elem*) l->elems + index)->elemAdr;
  59. elemAdr = memcpy(elemAdr, from, (size_t)((Elem*) l->elems + index)->elemSize);
  60. }
  61.  
  62. void ListDispose(List *l) {
  63. // მუშაობს O(N)-ში
  64. for (int i = l->logLen - 1; i >= 0; i--) {
  65. ListRemove(l, i);
  66. }
  67. free(l->elems);
  68. }
  69.  
  70. void ListInsert(List* l, int index, void* elemAdr, int elemSize) {
  71. if (l->logLen >= l->allocLen) {
  72. ListGrow(l);
  73. }
  74. Elem* from = (Elem*) l->elems + index;
  75. memmove(from + 1, from, sizeof(Elem) * (l->logLen - index));
  76.  
  77. Elem * el = malloc( sizeof(Elem));
  78. el->elemSize = elemSize;
  79. el->elemAdr = malloc(elemSize);
  80. el->elemAdr = memcpy(el->elemAdr, elemAdr, elemSize);
  81. from = memcpy(from, el, (size_t) sizeof(Elem));
  82. free(el);
  83. l->logLen++;
  84. }
  85.  
  86. void ListPrint(List *l, void(*PrintFn)(void*)) {
  87. for (int i = 0; i < l->logLen; i++) {
  88. Elem * curElem = (Elem *)l->elems + i;
  89. PrintFn(curElem->elemAdr);
  90. }
  91. }
  92.  
  93. void PrintForInt(List *l) {
  94. printf("%s\n", "List Elements:");
  95. for (int i = 0; i < l->logLen; i++) {
  96. Elem * curElem = (Elem *)l->elems + i;
  97. printf("%d\n", *(int*)(curElem->elemAdr));
  98. }
  99. }
  100.  
  101. int intCmpFn(const void* a, const void* b) {
  102. int x = *(int*) (((Elem *)a) -> elemAdr);
  103. int y = *(int*) (((Elem *)b) -> elemAdr);
  104. return x - y;
  105. }
  106.  
  107. // returns an index or -1
  108. int ListSearch(List* l, void* elem) {
  109. void* found = bsearch((Elem*)elem, l->elems, (size_t)(l->logLen), (size_t)sizeof(Elem), (
  110. int (*)(const void *, const void *)) intCmpFn);
  111. if (found != NULL) {
  112. return (((char*)found - (char*)l->elems) / sizeof(Elem));
  113. } else {
  114. return -1;
  115. }
  116. }
  117.  
  118. void ListSort(List*l) {
  119. qsort(l->elems, l->logLen, sizeof(Elem), (int (*)(const void *, const void *)) intCmpFn);
  120. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement