Bueno, despues de como 3hs programando (si ya se, no soy una luz en programacion) pude "resolver" el final, el tema es que no puedo compilarlos por que tengo un lio en la cabeza en como hacer el main para el ejercicio 1 y 2, y en el tercero no puedo terminar de hacerlo andar.
EJ 1-2
#include <stdio.h>
#include <stdlib.h>
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;
typedef ST_XYZ* stPtr;
void extract (ST_XYZ **P, ST_XYZ **Q, ST_DAT **sp, void *key, int (*pfun)(ST_DAT *, void*));
void extract (ST_XYZ **P, ST_XYZ **Q, ST_DAT **sp, void *key, int (*pfun)(ST_DAT *, void*))
{
stPtr anterior, actual, auxiliar;
int comp;
comp = (*pfun)(*sp,&key); //Busco el nodo en la lista
if((*pfun)(*sp,&key)) //El nodo es el primero de la lista
{
auxiliar = *P; //Guardo el nodo a eliminar
*P = (*P)->sig; //Apunto P al siguiente nodo
(*P)->ant = NULL; //Apunto el anterior a NULL
(*auxiliar).st = *sp; //Guardo el contenido en SP.
free(auxiliar);
}else{ //Sigo buscando
anterior = *P;
actual = (*P)->sig;
while (actual != NULL && !(*pfun)(*sp,&key)) //Me desplazo hasta encontra el nodo o llegar al final de la lista.
{
anterior = actual;
actual = actual->sig;
actual->ant = anterior;
}
if(actual != NULL) //Encontre el nodo, si actual == NULL entonces el nodo no estaba
{
auxiliar = actual;
anterior->sig = actual ->sig;
anterior->sig->ant = anterior;
free (auxiliar);
}else{
sp = NULL; //Como no encontre el nodo en la lista sp = NULL
}
}
}
//LA FUNCION DE COMPARACION RETORNARA 1 CUANDO SX COINCIDA CON EL PARAMETRO KEY DE BUSQUEDA
int compare(ST_DAT *stData, void *key)
{
//Busco en todos los valores
//if(*(int *)key == stData->val ||*(int *)key == stData->code || *(int *)key == stData->qtty || strcmp(*(char*)key,stData->sx) || strcmp(*(char *)key,stData->abc))
if (!strcmp(*(char*)key,stData->sx)) //Casteo KEY como CHAR*, y lo comparo con SX, si son iguales strcmp devuelve cero, entonces uso ! para que se cumpla la condicion.
{
return 1; //Encontre el valor en la estructura
}else{
return 0; //No encontre el valor en la estructura
}
}
Hasta aca el 1 y 2, en el segundo tengo comentado una forma de comparar con cualquier valor en la estructura, estaria correcto de esa forma?
EJ 3
int read_param (char *sFile, char *sSec, char *sPar, char *sRet, int ilen)
{
FILE *fp;
int aux, i;
char *strAux,*strAux2;
fp = fopen (sFile,"r");
if(fp == NULL)
{
printf("Error al abrir el archivo\n");
return (-1);
}else{
while(!feof(fp)) //Mientras no termine el archivo
{
fscanf (fp,"%s",strAux); //Leo una linea del archivo
if(!strcmp(strAux,sSec)) //Si encontre la seccion
{
for(i=0; i<2; i++)
{
*strAux = fscanf(fp,"%s",strAux); //Leo la cadena
*strAux2 = strtok (strAux,"="); //Guardo en strAux2 los caracteres hasta el =
if (!strcmp(strAux2,sPar))
{
*strAux2 = strtok (NULL,"\r"); //Guardo en strAux2 los datos desde el = hasta que termina la linea
if(strlen(strAux2>ilen))
{
fclose(fp);
return (-3);
}else{
sRet = strncpy(sRet,strAux2,ilen);
printf("Parametro: %s\n",sRet);
fclose(fp);
return (strlen(sRet)); //Devuelvo el valor
}
}
}
}else{ //No encontro la seccion
fclose(fp);
return (-2);
}
}
fclose(fp);
}
}
Aca es donde tengo mas inconvenientes, todavia tengo problemas con el manejo de las instrucciones de manejo de archivos y strings, mas que nada en cuando usar el puntero. De todas formas se me complica mucho pensar en como resolver el ejercicio, no encuentro forma mas simple (hacer esto en final me lo imagino imposible). Estoy intentando debuggear un archivo .ini pero no puedo hacer que solo lea el texto como indica el final. Alguien me da una mano viendo los codigos? Mil gracias.