Eliminar elemento de lista enlazada por un criterio determinado

He escrito esta función:

List* delPaintingCode(List* head, char *code) { List *p,*q; for(p=head;p!=NULL;q=p,p=p->next) { if(!strcmp(code,p->code)) { if (p==head) { q=head; head=p->next; free(q); } else { q->next=p->next; free(p); p=q; } } } return head; } 

y cuando lo llamo en otra función:

 void delpainting() { char code[50]; printf("code "); scanf("%s",code); List *head=NULL; head=delPaintingCode(filetolist,code); } 

El progtwig se bloquea tan. Tengo una advertencia: passing argument 1 of delPaintingCode from incompatible pointer type

Entonces, ¿cómo debo pasar la cadena a la función?

El problema lógico que conduce a una falla se encuentra en la twig if (p==head) de su código: cuando elimina el elemento inicial, libera la head sin actualizar p . Esto lleva a eliminar la referencia a un puntero liberado en la siguiente iteración.

Puede solucionar el problema introduciendo un nodo falso con la head en su next , y devolviendo el next , de esta manera:

 List fake; fake.next = head; // This loop always looks ahead by one element, ie at p->next. for(List *p = &fake ; p->next != NULL ; p = p->next) { if(strcmp(code, p->next->code)) { continue; } List *q = p->next; p->next = q->next; free(q); } return fake.next; 

Este enfoque funciona para el elemento inicial, también, porque agregamos una cabeza falsa a nuestra lista, por lo que la primera vez alrededor de p->next es lo mismo que head. Esto nos permite unificar el tratamiento del elemento cabeza y todos los demás elementos.