C-Kurs/libgdsl-beispiel
< C-Kurs
Version vom 25. September 2009, 02:41 Uhr von 85.178.209.0 (Diskussion) (Die Seite wurde neu angelegt: „<pre> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <gdsl_types.h> #include <gdsl_stack.h> /** Copies the given data element (a string in...“)
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <gdsl_types.h> #include <gdsl_stack.h> /** Copies the given data element (a string in our case) */ gdsl_element_t alloc_element(void *elem) { int len = strlen((char *)elem); gdsl_element_t result = malloc(len + 1); memcpy(result, elem, len + 1); return result; } /** Frees memory consumed by the given element */ void free_element(gdsl_element_t e) { free(e); } /** Prints the given element to an arbitrary stream */ void print_element(gdsl_element_t element, FILE *file, gdsl_location_t location, void *user_data) { fprintf(file, "%i: %s\n", location, (char*)element); } /** Call-back function for traversal of data structure */ int do_something(gdsl_element_t element, gdsl_location_t location, void *user_data) { printf("%s", (char*)element); /* just print the element */ return GDSL_MAP_CONT; /* continue traversal */ } #define BUFFER_SIZE 1000 int main(int argc, char **argv) { /* Initialize the stack structure with pointers to alloc- * and free functions */ gdsl_stack_t stack = gdsl_stack_alloc("Mein Stack", alloc_element, free_element); /* Fill the stack dynamically */ char buffer[BUFFER_SIZE]; printf("> "); fgets(buffer, sizeof(buffer)-1, stdin); while (strlen(buffer) > 1) { gdsl_stack_insert(stack, buffer); printf("> "); fgets(buffer, sizeof(buffer)-1, stdin); } /* Traverse stack forward */ printf("map_forward\n-----------\n"); gdsl_stack_map_forward(stack, do_something, NULL); /* Traverse stack backward */ printf("map_backward\n------------\n"); gdsl_stack_map_backward(stack, do_something, NULL); /* printf("\nDump: "); gdsl_stack_write_xml(stack, print_element, stdout, NULL); */ /* Traverse and free stack manually */ while (!gdsl_stack_is_empty(stack)) { gdsl_element_t e = gdsl_stack_remove(stack); free_element(e); } /* Free complete data structure and its contents */ gdsl_stack_free(stack); return EXIT_SUCCESS; }