Cześć, mam taką funkcję do usuwania

 void usun(){
        int flag = 0; // dodalem sam 0
        char nazwisko_key[20];
        char imie_key[20];
        dane *temp;
        temp = head;
        if(head == NULL)
                printf("Nie ma czego usuwać\n");

        else {
                printf("Wpisz imie i nazwisko ktore chcesz usunac\n");
                scanf("%s %s",&imie_key,&nazwisko_key);

                while(temp != NULL){
                        if(strcmp(temp->imie,imie_key) == 0 && strcmp(temp->nazwisko,nazwisko_key) == 0){
                                flag = 1;
                                if(temp==head){ // Jak pierwszy element
                                        head=head->nast_wsk;
                                        head->poprz_wsk = NULL;
                                }

                                else{
                                        if(temp->nast_wsk == NULL){ // Jak ostatni element
                                                temp->poprz_wsk->nast_wsk = NULL;
                                        }
                                        else{   
                                                temp->poprz_wsk->nast_wsk = temp->nast_wsk;
                                                temp->nast_wsk->poprz_wsk = temp->poprz_wsk;

                                        }
                                        free(temp);
                                }
                        }
                        temp=temp->nast_wsk;
                }
        }

        if(flag == 0)
                printf("Nie znaleziono osoby\n");

        if(flag == 1)
                printf("Usunięto\n");
}

Jak jest troche wpisów w liście to działa spoko, ale jak zostaje jeden(lub tylko 1 element jest wprowadzony) to wywala mi naruszenie ochrony pamięci.
I nie wiem gdzie to się sypie więc proszę was o pomoc.