Te adjunto un video sobre punteros a funcion que me parecio practico, y mi resolucion de este final no se si esta bien, igual hay un final muy parecido tomado el 23-2-16, por no decir el mismo.
https://www.youtube.com/watch?v=Sm6_lQMJ5Lk
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int extract(ST_XYZ **P, ST_XYZ **Q, ST_DAT **sp, void *key, int(*pfun1)(ST_DAT *, void *), void(*pfun2)(ST_DAT *));
int read_param(char *sFile, char *sSec, char *sPar, char *sRet,int ilen);
int comp(ST_DAT *st, void *key);
void eliminar(ST_DAT *st);
typedef struct
{
char *sx;
int val, code, qtty;
char abc[20];
}ST_DAT;
typedef struct xyz
{
ST_DAT *st;
struct xyz *sig,*ant;
}ST_XYZ;
int main (int argc, char **argv)
{
return 0;
}
int extract (ST_XYZ **P, ST_XYZ **Q, ST_DAT **sp, void *key, int(*pfun1)(ST_DAT *, void *), void(*pfun2)(ST_DAT *))
{
ST_XYZ *aux = *Q;
*sp = NULL;
if(pfun1(aux->st, key) == 1)
{
aux->ant->sig = NULL;
*Q = aux->ant;
*sp = aux->st;
pfun2(aux->st);
free(aux);
return 1;
}
aux = *P;
if(pfun1(aux->st, key) == 1)
{
aux->sig->ant = NULL;
*P = aux->sig;
*sp = aux->st;
pfun2(aux->st);
free(aux);
return 1;
}
while(pfun1(aux->st, key) == 0 && aux->sig != NULL)
{
aux=aux->sig;
}
if(pfun1(aux->st, key) == 1)
{
aux->sig->ant=aux->ant;
aux->ant->sig=aux->sig;
*sp = aux->st;
pfun2(aux->st);
free(aux);
return 1;
}
return 0;
}
int read_param (char *sFile, char *sSec, char *sPar, char *sRet,int ilen)
{
FILE *file;
int i, s, j=0, flag=0;
char buffer[1024];
//asumo que por renglon hay 1024 caracteres como maximo, si no habria que hacerlo con memoria dinamica.
file = fopen(sFile,"r");
if(file == NULL)
{
return -1;
}
i = strlen(sPar);
i--;
while(!feof(file))
{
fgets(buffer, 1024, file);
if(buffer[0] == '[')
{
s=1;
while(buffer[s] == sSec[j])
{
s++;
j++;
}
if(buffer[s] == ']')
{
flag = 1;
}
else
{
flag = 0;
}
}
if(strncmp(buffer, sPar, i) == 0 && flag == 1)
{
s = i + 2;
j = 0;
while((j < ilen) && (buffer[s] != '\n') && (buffer[s] != EOF))
{
sRet[j] = buffer[s];
s++;
j++;
}
sRet[j] = '\0';
if(((buffer[s] != '\n') || (buffer[s] != EOF)) && (j <= ilen))
{
return j;
}
return -3;
}
}
return -2;
}
int comp(ST_DAT *st, void *key)
{
if(strcmp(st->sx,key) == 0)
{
free(st->sx);
return 1;
}
else
{
return 0;
}
}
void eliminar(ST_DAT *st)
{
free(st->sx);
}