Salve a tutti .
Ho creato questo programmino che dovrebbe eliminare da una lista concatenata tutti i nodi contenenti una data chiave.
Il programma compila senza problemi ma in output mi restituisce simboli anzichè le varie stringhe accettate.
Ho provato a debuggare con il debugger di codeblocks ma nn riesco a capire cosa non va!
Se qualcuno nota l'errore e può comunicarmelo, ne sarei felice! Grazie
codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Nodo
{
    char* chiave;
    struct Nodo *prec, *succ;
};
typedef struct Nodo nodo;

nodo *Cancella_Nodo(nodo*a);
void Stampa_nodo_str(nodo *a);
nodo *Inserisci_strings(nodo *a, char *k);      //crea dei nodi con la stringa k

int main()
{
    nodo *p;
    nodo *head=NULL;
    head=Inserisci_strings(head,"ciao1");
    head=Inserisci_strings(head,"ciao");
    head=Inserisci_strings(head,"marco");
    head=Inserisci_strings(head,"marco");
    head=Inserisci_strings(head,"ciao");
    head=Inserisci_strings(head,"ciao");
    p=head;
    while(p != NULL)
    {
        if(strcmp(p->chiave, "ciao1") == 0)
        {
            p=Cancella_Nodo(p);
        }
        else
        {
            p=p->succ;
        }
    }
    Stampa_nodo_str(head);
    return 0;
}
//Stampa tutti i nodi di una lista di tipo stringa
void Stampa_nodo_str(nodo *a)
{
    int lunghezza;
    nodo *p;
    int i=0;

    if(a==NULL)
    {
        printf("La lista e vuota");
        exit(-1);
    }
    p=a;
    while(p != NULL)
    {
        i=0;
        lunghezza=strlen(p->chiave);
        while(i<lunghezza)
        {
            printf("%c", p->chiave[i]);
            i++;
        }
        printf("\n");
        p=p->succ;
    }
}



//inserisce nodi contenenti stringhe(VERIFICATA)
nodo *Inserisci_strings(nodo *a, char *k)
{
    nodo *temp;
    int lunghezza;
    int i=0;
    nodo *p;

    lunghezza=strlen(k);
    temp=malloc(sizeof(nodo));
    temp->succ=NULL;
    temp->chiave=malloc(sizeof(char)*lunghezza+1);
    while(i<lunghezza)
    {
        temp->chiave[i]=k[i];
        i++;
    }
    temp->chiave[i]='\0';
    if(a == NULL)
    {
        temp->prec=NULL;
        a=temp;
        return a;
    }
    else
    {
        p=a;
        while(p->succ != NULL)
        {
            p=p->succ;
        }
        p->succ=temp;
        temp->prec=p;
        return a;
    }
}



nodo *Cancella_Nodo(nodo*a)
{
    nodo *t;
    //Il primo della lista
    if(a->prec==NULL)
    {
        t=a->succ;
        t->prec=NULL;
        a->succ=NULL;
        free(a->chiave);
        free(a);
        a=t;
        return a;
    }
    //Alla fine
    if(a->succ==NULL)
    {
        a->prec->succ=NULL;
        a->prec=NULL;
        a->succ=NULL;
        free(a->chiave);
        free(a);
        return NULL;
    }
    //Il nodo al centro
    else
    {
        t=a->succ;
        a->prec->succ=t;
        t->prec=a->prec;
        a->succ=NULL;
        a->prec=NULL;
        free(a->chiave);
        free(a);
        a=t;
        return a;
    }
}