C-Programm zur Implementierung von Vector

C-Programm zur Implementierung von Vector
Dies ist ein C-Programm zur Implementierung von Vektoren. Ein Array (Vektor) ist ein allgemeiner Datentyp, der zum Halten und Beschreiben einer Sammlung von Elementen verwendet wird. Diese Elemente können zur Laufzeit durch einen oder mehrere Indizes (Identifizierungsschlüssel) abgerufen werden. Ein Unterscheidungsmerkmal eines Arrays im Vergleich zu einer Liste besteht darin, dass sie im Vergleich zu letzterem sequenziellen Zugriff eine Suche nach wahlfreiem Zugriff in konstanter Zeit ermöglichen. In der Größe veränderbare Arrays ermöglichen zur Laufzeit eine unbestimmte Obergrenze von Sammlungselementen und ähneln konzeptionell einer Liste. Diese dynamischen Arrays sind komplizierter und werden weniger in der Einführung in die Compatriot-Liste verwendet, die von Natur aus dynamisch ist. Unter Verwendung von C als Implementierungssprache führt Sie dieser Beitrag durch den Aufbau einer einfachen Vektordatenstruktur. Die Struktur nutzt ein Array fester Größe mit einer Zählerinvariante, die verfolgt, wie viele Elemente derzeit vorhanden sind. Wenn das zugrunde liegende Array erschöpft ist, weist die Additionsoperation den Inhalt in Form einer Kopie einer größeren Größe neu zu.

Hier ist der Quellcode des C-Programms zur Implementierung von Vector. Das C-Programm wird erfolgreich kompiliert und auf einem Linux-System ausgeführt. Die Programmausgabe wird auch unten angezeigt.

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #ifndef VECTOR_H
  5. #define VECTOR_H
  6.  
  7. #define VECTOR_INIT_CAPACITY 4
  8.  
  9. #define VECTOR_INIT(vec) vector vec; vector_init(&vec)
  10. #define VECTOR_ADD(vec, item) vector_add(&vec, (void *) item)
  11. #define VECTOR_SET(vec, id, item) vector_set(&vec, id, (void *) item)
  12. #define VECTOR_GET(vec, type, id) (type) vector_get(&vec, id)
  13. #define VECTOR_DELETE(vec, id) vector_delete(&vec, id)
  14. #define VECTOR_TOTAL(vec) vector_total(&vec)
  15. #define VECTOR_FREE(vec) vector_free(&vec)
  16.  
  17. typedef struct vector {
  18.     void **items;
  19.     int capacity;
  20.     int total;
  21. } vector;
  22.  
  23. void vector_init(vector *);
  24. int vector_total(vector *);
  25. static void vector_resize(vector *, int);
  26. void vector_add(vector *, void *);
  27. void vector_set(vector *, int, void *);
  28. void *vector_get(vector *, int);
  29. void vector_delete(vector *, int);
  30. void vector_free(vector *);
  31.  
  32. #endif
  33.  
  34. void vector_init(vector *v) {
  35.     v->capacity = VECTOR_INIT_CAPACITY;
  36.     v->total = 0;
  37.     v->items = malloc(sizeof(void *) * v->capacity);
  38. }
  39.  
  40. int vector_total(vector *v) {
  41.     return v->total;
  42. }
  43.  
  44. static void vector_resize(vector *v, int capacity) {
  45. #ifdef DEBUG_ON
  46.     printf("vector_resize: %d to %d\n", v->capacity, capacity);
  47. #endif
  48.  
  49.     void **items = realloc(v->items, sizeof(void *) * capacity);
  50.     if (items) {
  51.         v->items = items;
  52.         v->capacity = capacity;
  53.     }
  54. }
  55.  
  56. void vector_add(vector *v, void *item) {
  57.     if (v->capacity == v->total)
  58.         vector_resize(v, v->capacity * 2);
  59.     v->items[v->total++] = item;
  60. }
  61.  
  62. void vector_set(vector *v, int index, void *item) {
  63.     if (index >= 0 && index < v->total)
  64.         v->items[index] = item;
  65. }
  66.  
  67. void *vector_get(vector *v, int index) {
  68.     if (index >= 0 && index < v->total)
  69.         return v->items[index];
  70.     return NULL;
  71. }
  72.  
  73. void vector_delete(vector *v, int index) {
  74.     if (index < 0 || index >= v->total)
  75.         return;
  76.  
  77.     v->items[index] = NULL;
  78.     int i;
  79.     for (i = 0; i < v->total - 1; i++) {
  80.         v->items[i] = v->items[i + 1];
  81.         v->items[i + 1] = NULL;
  82.     }
  83.  
  84.     v->total--;
  85.  
  86.     if (v->total > 0 && v->total == v->capacity / 4)
  87.         vector_resize(v, v->capacity / 2);
  88. }
  89.  
  90. void vector_free(vector *v) {
  91.     free(v->items);
  92. }
  93.  
  94. int main(void) {
  95.     int i;
  96.  
  97.     vector v;
  98.     vector_init(&v);
  99.  
  100.     vector_add(&v, "Bonjour");
  101.     vector_add(&v, "tout");
  102.     vector_add(&v, "le");
  103.     vector_add(&v, "monde");
  104.  
  105.     for (i = 0; i < vector_total(&v); i++)
  106.         printf("%s ", (char *) vector_get(&v, i));
  107.     printf("\n");
  108.  
  109.     vector_delete(&v, 3);
  110.     vector_delete(&v, 2);
  111.     vector_delete(&v, 1);
  112.  
  113.     vector_set(&v, 0, "Hello");
  114.     vector_add(&v, "World");
  115.  
  116.     for (i = 0; i < vector_total(&v); i++)
  117.         printf("%s ", (char *) vector_get(&v, i));
  118.     printf("\n");
  119.  
  120.     vector_free(&v);
  121. }

Ausgabe:

$ gcc Vector.c
$ ./a.out
 
Bonjour tout le monde 
Hello World