Eine einfache Stringliste könnte so aussehen.
Zum Verständnis schaue am besten erstmal in main.
Die konkreten Implementierungen sind natürlich nur sehr einfach gehalten, ohne Fehlerbehandlung usw. und auf ein char-Array konstanter Länge hin abgestimmt.
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
typedef struct {
char str[100];
} EinTyp; /* erweiterbarer Datentyp, hier der Einfachheit halber nur ein char-Array */
typedef struct Liste Liste;
struct Liste {
void (*add)(Liste*,void*);
void (*delat)(Liste*,int);
void (*delall)(Liste*);
void (*loop)(Liste*,void(*)(void*));
void (*sort)(Liste*);
void (*unique)(Liste*);
void (*release)(Liste*);
int n;
EinTyp *liste;
};
void add(Liste*l,EinTyp*e) /* Hinzufügen eines Elements */
{
l->liste=realloc(l->liste,++l->n*sizeof*l->liste);
l->liste[l->n-1]=*e;
}
void delat(Liste*l,int i) /* "Lösche" Element bei Index ( 0 basiert ) */
{
memmove(l->liste+i,l->liste+i+1,(--l->n-i)*sizeof*l->liste);
}
void delall(Liste*l) /* keine Einträge */
{
l->n=0;
}
void loop(Liste*l,void(*f)(void*)) /* Durchlaufen aller Elemente mit angegebener Funktion */
{
int i=0;
for(;i<l->n;f(l->liste+i++));
}
void sort(Liste*l) /* aufsteigend sortieren */
{
qsort(l->liste,l->n,sizeof*l->liste,strcmp);
}
void unique(Liste*l) /* nur einzige Werte */
{
int i,found;
l->sort(l);
do {
found=0;
for(i=1;i<l->n;++i)
if( !memcmp(l->liste+i-1,l->liste+i,sizeof*l->liste) ) {found=1;l->delat(l,i);break;}
} while( found );
}
void release(Liste*l) /* Speicherfreigabe */
{
free(l->liste);
l->n=0;
}
int main()
{
Liste l={add,delat,delall,loop,sort,unique,release};
l.add(&l,"sieben");
l.add(&l,"sechs");
l.add(&l,"eins");
l.add(&l,"eins");
l.loop(&l,puts);
l.sort(&l);
l.loop(&l,puts);
l.unique(&l);
l.loop(&l,puts);
l.delat(&l,1);
l.loop(&l,puts);
l.delall(&l);
l.loop(&l,puts);
l.release(&l);
return 0;
}
Hier nochmal als Link:
http://ideone.com/Dkchg