Lista genérica enlazada en C

A diferencia de C++ y Java , C no admite genéricos. ¿Cómo crear una lista enlazada en C que se pueda usar para cualquier tipo de datos? En C, podemos usar un puntero vacío y un puntero de función para implementar la misma funcionalidad. Lo mejor del puntero vacío es que se puede usar para apuntar a cualquier tipo de datos. Además, el tamaño de todos los tipos de punteros siempre es el mismo, por lo que siempre podemos asignar un Node de lista enlazada. Se necesita un puntero de función para procesar el contenido real almacenado en la dirección señalada por el puntero de vacío. 

 

Complete Interview Preparation - GFG

A continuación, se muestra un código C de muestra para demostrar el funcionamiento de una lista vinculada genérica.

C

// C program for generic linked list
#include<stdio.h>
#include<stdlib.h>
 
/* A linked list node */
struct Node
{
    // Any data type can be stored in this node
    void  *data;
 
    struct Node *next;
};
 
/* Function to add a node at the beginning of Linked List.
   This function expects a pointer to the data to be added
   and size of the data type */
void push(struct Node** head_ref, void *new_data, size_t data_size)
{
    // Allocate memory for node
    struct Node* new_node = (struct Node*)malloc(sizeof(struct Node));
 
    new_node->data  = malloc(data_size);
    new_node->next = (*head_ref);
 
    // Copy contents of new_data to newly allocated memory.
    // Assumption: char takes 1 byte.
    int i;
    for (i=0; i<data_size; i++)
        *(char *)(new_node->data + i) = *(char *)(new_data + i);
 
    // Change head pointer as new node is added at the beginning
    (*head_ref)    = new_node;
}
 
/* Function to print nodes in a given linked list. fpitr is used
   to access the function to be used for printing current node data.
   Note that different data types need different specifier in printf() */
void printList(struct Node *node, void (*fptr)(void *))
{
    while (node != NULL)
    {
        (*fptr)(node->data);
        node = node->next;
    }
}
 
// Function to print an integer
void printInt(void *n)
{
   printf(" %d", *(int *)n);
}
 
// Function to print a float
void printFloat(void *f)
{
   printf(" %f", *(float *)f);
}
 
/* Driver program to test above function */
int main()
{
    struct Node *start = NULL;
 
    // Create and print an int linked list
    unsigned int_size = sizeof(int);
    int arr[] = {10, 20, 30, 40, 50}, i;
    for (i=4; i>=0; i--)
       push(&start, &arr[i], int_size);
    printf("Created integer linked list is \n");
    printList(start, printInt);
 
    // Create and print a float linked list
    unsigned float_size = sizeof(float);
    start = NULL;
    float arr2[] = {10.1, 20.2, 30.3, 40.4, 50.5};
    for (i=4; i>=0; i--)
       push(&start, &arr2[i], float_size);
    printf("\n\nCreated float linked list is \n");
    printList(start, printFloat);
 
    return 0;
}
Producción

Created integer linked list is 
 10 20 30 40 50

Created float linked list is 
 10.100000 20.200001 30.299999 40.400002 50.500000

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *