2013-02-07 14 views
6

Sto scrivendo un'implementazione di elenchi collegati in C e desidero utilizzare una funzione linguistica equivalente ai modelli di C++ per semplificare il mio lavoro.Esistono modelli nel linguaggio di programmazione C?

Esiste una tale funzione?

+1

Cosa intendi per "modello" in questo contesto? – cnicutar

+2

I modelli sono una funzionalità del linguaggio di programmazione C++ che consente a funzioni e classi di operare con tipi generici. –

+0

grazie mille – user1722022

risposta

2

Sì, c'è list.h. Ed è una lista concatenata:

il seguente link contiene un example su come usarlo.

il list.h contiene tutte le funzioni relative alla gestione di un elenco collegato circolare come definizione, aggiungere in testa, aggiungere in coda, rimuovere, funzione foreach per scorrere l'elenco collegato circolare ...

+1

Questa è una risposta specifica al kernel di Linux, non è una risposta generale su come sia "in C". Trovo strano che sia stato votato. – unwind

+2

@unwind: so che list.h è usato nel kernel linux. ma nel link che do in questa risposta per list.h c'è un'altra distribuzione di list.h e funziona nello spazio utente di Linux ed è portatile. Lo uso in tutta la mia applicazione spaziale utente che sviluppo e funziona bene. – MOHAMED

+0

@unwind Fare riferimento a questo paragrafo nel collegamento I dare nella risposta come esempio http://isis.poly.edu/kulesh/stuff/src/klist/ 'Con pochissime modifiche (rimuovendo il prefetching hardware di voci di elenco) possiamo usa anche questa lista nelle nostre applicazioni. Una versione utilizzabile di questo file è disponibile qui per il download. – MOHAMED

6

C trovi non ci sono modelli come C++, anche se è possibile ottenere qualcosa di simile con "intelligente" (o WTFey, a seconda di come lo si guarda) uso dei macro #define.

Tuttavia, date un'occhiata a come ad esempio GLIB lo fa per singly linked lists o doubly linked lists.

+1

+1 per "o WTFey" – Brendan

3

I modelli sono funzionalità di C++, ma se si desidera un'implementazione indipendente dal tipo di elenco con collegamento singolo o doppio, è possibile eseguire con l'aiuto di macro o semplicemente archiviare i puntatori void* nella struttura.

Naturalmente, ci sono molte di queste implementazioni su Internet. @MohamedKALLEL e @hyde hanno già fornito esempi dal kernel di Linux e da GLib, vorrei solo aggiungere una nota sulla piccola libreria uthash.

Esso implementa una tabella hash in C, ma ha anche un utlist.h che implementa singly- e doppiamente-linked (e addirittura circolare) elenca interamente sulle macro. Cioè, puoi semplicemente prendere questo file, includerlo e usare questi macro così come sono o modificarlo per le tue esigenze. Inoltre, è bello poter utilizzare qualsiasi delle strutture dati con esso: è sufficiente avere il puntatore next (e prev, in caso di collegamento doppio).

P.s Ma ricorda sempre quando si usano i macro: con una grande potenza derivano grandi responsabilità. Le macro sono potenti, ma possono diventare estremamente insicuri e illeggibili. Attenzione!

0

hi non so su liste collegate, ma per una funzione template u probabilmente può utilizzare una macro o una funzione con il numero di argomenti variabile come esempio questo programma

#include <stdarg.h> 
#include <stdio.h> 
#define INT 0 
#define STR 1 
void foo(int type, ...) 
{ 
    va_list ap; 
    int i; 
    char *s; 
    va_start(ap, type); 
    switch(type) { 
    case INT: 
     i = va_arg(ap, int); 
     printf("INT: %i\n", i); 
     break; 
    case STR: 
     s = va_arg(ap, char *); 
     printf("STR: %s\n", s); 
     break; 
    default: 
     break; 
    } 
    va_end(ap); 
} 
#define SWAP(type, a, b) {     \ 
     type t;         \ 
     t = a;         \ 
     a = b;         \ 
     b = t;         \ 
    } 
int main(void) 
{ 
    foo(INT, 3); 
    foo(STR, "baz"); 
    int ia = 0, ib = 3; 
    SWAP(int, ia, ib); 
    printf("%i %i\n", ia, ib); 
    float fa = 0.5, fb = 3.14; 
    SWAP(float, fa, fb); 
    printf("%f %f\n", fa, fb); 
    return 0; 
} 

produrrà l'uscita

INT: 3 
STR: baz 
3 0 
3.140000 0.500000 
Problemi correlati