fork(1) download
  1. typedef struct {
  2. void** data;
  3. int size;
  4. int count;
  5. } vector;
  6.  
  7. void vector_create(vector*);//Создание вектора
  8. int vector_count(vector*);//Информация о количестве элементов в векторе
  9. void vector_push_back(vector*, void*);//Добавление элемента в конец вектора
  10. void vector_set(vector*, int, void*);//Замена определенного элемента в векторе на другое значение
  11. void* vector_get(vector*, int);//Вывод элемента из вектора
  12. void vector_delete(vector*, int);//Удаление элемента из вектора
  13. void vector_free(vector*);//Очистка вектора
  14.  
  15. #include <stdio.h>
  16. //#include <time.h>
  17. //#include <conio.h>
  18. #include <stdlib.h>
  19. //#include "vector.h"
  20. #include <string.h>
  21.  
  22. void vector_create(vector *v) //Функция создания нового вектора.
  23. {
  24. v->data = 0;//Количество памяти выделенной вектору
  25. v->size = 0;//Размер вектора
  26. v->count = 0;//Количество данных в векторе
  27. }
  28.  
  29. int vector_count(vector *v)//Функция получения информации о количестве данных
  30. {
  31. return v->count;
  32. }
  33.  
  34. void vector_push_back(vector *v, void *e)//Функция добавления данных в векторе
  35. {
  36. if (v->size == 0) {//Проверка на размер, если размер равен нулю
  37. v->size = 5; //Увеличиваем размер вектора хотя бы до еденицы
  38. v->data = (void**)malloc(sizeof(void*) * v->size);//Добавление памяти в вектор
  39. memset(v->data, '\0', sizeof(void*) * v->size);//Заполнение памяти вектора
  40. }
  41.  
  42. if (v->size == v->count) {//Если размер вектора равен количеству данных
  43. v->size *= 2;//Удваиваем размер вектора
  44. v->data = (void**)realloc(v->data, sizeof(void*) * v->size);//Перераспределение блоков памяти вектора
  45. }
  46. v->data[v->count] = e;
  47. v->count++;
  48. }
  49.  
  50. void vector_set(vector *v, int index, void *e)//Функция замены элемента блока
  51. {
  52. if (index >= v->count) {//Если номер элемента неверный, то выполнение прекращается
  53. return;
  54. }
  55.  
  56. v->data[index] = e;//Замена элемента новыми данными
  57. }
  58.  
  59. void* vector_get(vector *v, int index)//Функция получения значения элемента вектора
  60. {
  61. if (index >= v->count) {//Если номер элемента неверный, то выполнение прекращается
  62. return 0;
  63. }
  64.  
  65. return v->data[index];//Значение конкретного элемента
  66. }
  67.  
  68. void vector_delete(vector *v, int index)//Функция удаления конкретного элемента вектора
  69. {
  70. if (index >= v->count) {//Если номер элемента неверный, то выполнение прекращается
  71. return;
  72. }
  73.  
  74. v->data[index] = NULL;//Обнуление элемента
  75. //остат
  76. int i, j;
  77. void **newarr = (void**)malloc(sizeof(void*) * v->count * 2);//Цикл подсчета пустых элементов вектора и корректировка значения vector_count
  78. for (i = 0, j = 0; i < v->count; i++) {
  79. if (v->data[i] != NULL) {
  80. newarr[j] = v->data[i];
  81. j++;
  82. }
  83. }
  84.  
  85. free(v->data);
  86. v->data = newarr;
  87. v->count--;
  88. }
  89.  
  90. void vector_free(vector *v)//Функция обнуления вектора
  91. {
  92. free(v->data);
  93. v->data=0;
  94. }
  95.  
  96. int main(void)//Тестирование функций
  97. {
  98. int noe=0;
  99. int k=0;
  100. char m[10];
  101. vector v;
  102. vector_create(&v);//Создаем вектор
  103. printf("Enter number of elements: ");
  104. //scanf("%i\n", &noe);
  105. noe=6;
  106. for(k=0; k<noe; k++){
  107. sprintf(m, "%d", k);
  108. printf("%s\n", m);
  109. vector_push_back(&v, m);
  110. }
  111. /*vector_push_back(&v, "1");//Добавляем данные в вектор
  112. vector_push_back(&v, "2");
  113. vector_push_back(&v, "3");
  114. vector_push_back(&v, "4");
  115. vector_push_back(&v, "5");*/
  116.  
  117. int i;
  118. printf("Start vector contains %d elements:\n", vector_count(&v));
  119. for (i = 0; i < vector_count(&v); i++) {//Вывод векторп
  120. printf("%s\n", vector_get(&v, i));
  121. }
  122. vector_set(&v, 2, "12");//Заменим 2 элемент вектора на число 12
  123. vector_delete(&v, 1);//Удалим 1 элемент вектора
  124. vector_delete(&v, 3);//И 3
  125. printf("Edited vector contains %d elements:\n", vector_count(&v));
  126. for (i = 0; i < vector_count(&v); i++) {//Вывод нового вектора
  127. printf("%s\n", vector_get(&v, i));
  128. }
  129.  
  130. vector_free(&v);//Очистка вектора
  131.  
  132. return 0;
  133. }
Success #stdin #stdout 0s 4368KB
stdin
Standard input is empty
stdout
Enter number of elements: 0
1
2
3
4
5
Start vector contains 6 elements:
5
5
5
5
5
5
Edited vector contains 4 elements:
5
12
5
5