Adjunto el final con mi resolucion, disculpen la calidad de la imagen.
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#define OK 0
#define ERR_MEMORY -1
#define ERR_ITEM -2
int suscribir(sub_t **s, char *id, unsigned int *canales, int(*enviar)(char *));
int desuscribir(sub_t **s, char *id);
int publicar(sub_t *s, char *msg, unsigned int canal);
typedef struct sub_s
{
char id[100];
unsigned int *canales;
int (*enviar)(char *);
struct sub_s *sig;
}sub_t;
int main(int argc, char **argv)
{
return 0;
}
int suscribir(sub_t **s, char *id, unsigned int *canales, int(*enviar)(char *))
{
//reservo memoria
sub_t *nuevo, *aux=*s;
int i;
//pido memoria
if((nuevo = (sub_t *)malloc(sizeof(sub_t))) == NULL)
{
return ERR_MEMORY;
}
//cargo los datos a la estructura
strcpy(nuevo->id, id);
nuevo->enviar = enviar;
for(i = 0 ; canales[i] != 0 ; i++)
{
nuevo->canales[i] = canales[i];
}
//si es la primera
if((*s) == NULL)
{
nuevo->sig = NULL;
*s=nuevo;
}
//si no es la primera
else
{
while(aux != NULL)//verifico si ya estaba
{
if (strcmp(aux->id, nuevo->id) == 0)
{
free(nuevo);
return ERR_ITEM;
}
aux = aux->sig;
}
nuevo->sig = *s;
*s = nuevo;
}
return OK;
}
int desuscribir(sub_t **s, char *id)
{
//reservo memoria
sub_t *aux = *s, *aux1;
//si no se reservo memoria para la lista
if(s == NULL)
{
return ERR_MEMORY;
}
//si es el primer suscriptor el que hay que eliminar
if(strcmp(aux->id, id) == 0)
{
*s = aux->sig;
free(aux);
return OK;
}
else
{
//recorro la lista hasta el suscriptor, o hasta el final
while((strcmp(aux->sig->id, id) != 0) && (aux->sig != NULL))
{
aux = aux->sig;
}
//si encontre el suscriptor para eliminar
if(strcmp(aux->sig->id, id) != 0)
{
aux1 = aux->sig;
aux->sig = aux->sig->sig;
free(aux1);
return OK;
}
}
return ERR_ITEM;
}
int publicar(sub_t *s, char *msg, unsigned int canal)
{
//reservo memoria
int i, j, flag = 0;
//recorro la lista
while(s != NULL)
{
//recorro canales
for(i = 0 ; s->canales[i] != 0 ; i++)
{
//veo si coincide
if(s->canales[i] == canal)
{
j = s->enviar(msg);
flag = 1;//flag para que encontro al menos uno
//si hay error para mandar el mensaje
if(j != OK)
{
return j;
}
}
}
s = s->sig;
}
if(flag == 0)
{
return ERR_ITEM;
}
return OK;
}