====== 9 - Pole v dynamické paměti 2/2 ======
===== 2D pole v dynamické paměti =====
#include
#include
/** @brief Funkce pro naplneni 2D pole alokovaneho v dynamicke pameti
*
* @param data
* @param w
* @param h
*/
void fill_heap (int ** data, int w, int h)
{
int k = 0;
for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
data[i][j] = k++;
}
}
}
/** @brief Funkce pro tisk obsahu 2D pole alokovaneho v dynamicke pameti
*
* @param data
* @param w
* @param h
*/
void print_heap (int ** data, int w, int h)
{
for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
printf ("%2i ", data[i][j]);
}
printf("\n");
}
}
/** @brief Funkce pro tisk obsahu 2D pole alokovaneho v zasobniku
*
* Pro srovnani s predchozi funkci je uvedena funkce se stejnymi
* parametry.
*
* @param data
* @param w
* @param h
*/
void print_stack (int ** data, int w, int h)
{
int (* q)[w] = (int(*)[w])data;
for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
printf("%i ", q[i][j]);
}
}
printf("\n");
}
int main ()
{
/** Pole ukazatelu do dynamicke pameti
* Varianta A: pole ukazatelu alokovane v zasobniku
*/
int * p1[2];
p1[0] = (int *)malloc(3*sizeof(int));
p1[1] = (int *)malloc(3*sizeof(int));
fill_heap (p1, 3, 2);
print_heap (p1, 3, 2);
/** Dealokace
*/
free(p1[0]);
free(p1[1]);
/** Pole ukazatelu do dynamicke pameti
* Varianta B: pole alokovane take v dynamicke pameti
*/
int ** p2 = malloc(2*sizeof(int *));
p2[0] = malloc(3*sizeof(int));
p2[1] = malloc(3*sizeof(int));
fill_heap (p2, 3, 2);
print_heap (p2, 3, 2);
// dealokace
free(p2[0]);
free(p2[1]);
free(p2);
}
===== Dynamicky vytvářený seznam vektorů (1D polí) =====
#include
#include
/*
list: | * | * | * | * |
^
pole - size informace o velikosti
- * data ukazatel do d. pameti, kde jsou ulozenan data
*/
typedef struct
{
int size;
int * data;
} array;
typedef struct
{
int size;
array ** data;
} list;
array * array_init (int size)
{
array * tmp = malloc(sizeof(array));
tmp->size = size;
tmp->data = malloc(size*sizeof(int));
for (int i = 0; i < size; i++) tmp->data[i] = i;
return tmp;
}
void list_init (list ** x)
{
*x = malloc(sizeof(list));
(*x)->size = 0;
(*x)->data = malloc(0);
}
void list_deinit (list * x)
{
for (int i = 0; i < x->size; i++)
{
free(x->data[i]->data);
free(x->data[i]);
}
free(x->data);
free(x);
}
void list_add (list * x, int size)
{
x->data = realloc(x->data, (x->size+1)*sizeof(array *));
x->data[x->size++] = array_init(size);
}
list_item_add (list * x, int position, int constant)
{
for (int i = 0; i < x->data[position]->size; i++)
{
x->data[position]->data[i] += constant;
}
}
void list_print (list * x)
{
for (int i = 0; i < x->size; i++)
{
array * tmp = x->data[i];
for (int j = 0; j < tmp->size; j++)
{
printf("%3i ", tmp->data[j]);
}
printf("\n");
}
printf("-------------------------------\n");
}
void list_bubble (list * x)
{
for (int j = 0; j < x->size; j++)
{
for (int i = 0; i < x->size-1; i++)
{
if (x->data[i]->size > x->data[i+1]->size)
{
array * tmp = x->data[i];
x->data[i] = x->data[i+1];
x->data[i+1] = tmp;
}
}
}
}
int main()
{
list * seznam;
list_init (&seznam);
list_add (seznam, 12);
list_add (seznam, 10);
list_add (seznam, 4);
list_add (seznam, 20);
list_print (seznam);
list_bubble (seznam);
list_print (seznam);
list_item_add (seznam, 1, 10);
list_print (seznam);
printf("seznam[2][10] = %i\n", seznam->data[2]->data[10]);
list_deinit(seznam);
return 0;
}