Salve a tutti, dovrei implementare un dizionario in C, con le tre operazioni di inserimento, cancellazione e ricerca.
Ho provato a farlo da solo ma credo h ci siano un po' di errori e siccome non so dove mettere le mani confido in un vostro aiuto!!!
Vi ringrazio anticipatamente e vi allego il mio codice con gli errori inlclusi...

codice:
/*
* Dizionario realizzato mediante struttura circolare doppiamente collegata.
* 
*       classe StrutturaCollegata implementa Dizionario:
*        dati:                                                                  S(n) = @(n)
*             una collezione di n record contenenti ciascuno una quadrupla
*             (prev, elem, chiave, next), dove prev e next sono puntatori
*             al precedente e successivo record della collezione.
*             Manteniamo inoltre un puntatore list che contiene l'indirizzo
*             di un record se la collezione non è vuota e null altrimenti.
*        operazioni:
*             insert(elem e, chiave k)                                          T(n)=O(1)
*                         viene creato un record p con elemento e e chiave k.
*                         Se list=null, si effettua p->next=p, p->prev=p e
*                         list=p . Altrimenti si collega il record p tra
*                         list e list->next effettuando p->next=list->next,
*                         list->next->prev=p, p->prev=list e list->next=p.
*             delete(chiave k)                                                  T(n)=O(n)
*                         si trova il record P con chiave k come nella
*                         search; poi si effettua p->prev->next=p->next e
*                         p->next->prev=p->prev; infine viene distrutto
*                         il record p.
*             search(chiave k)-> elem                                           T(n)=O(n)
*                         se list=null si restituisce null. Altrimenti si
*                         scandisce la struttura saltando di record in
*                         record con p=p->next fino a quando non diventa
*                         p=list, verificando se qualche p ha chiave k.
*                         In caso positivo si restituisce l'elemento
*                         trovato e null altrimenti.
*/

#include <stdio.h>
typedef char* STRINGA;
typedef struct dato {
        struct dato* prec;
        int elemento;
        STRINGA chiave;
        struct dato* succ;
} DATO;

typedef struct dizionario {
        DATO* list;
        inserisci(int el, STRINGA ch);
        cancella(STRINGA ch);
        cerca(STRINGA ch);
} DIZIONARIO;


void creadiz(DIZIONARIO diz)
{
     diz = malloc(sizeof(DIZIONARIO));
     diz.list = NULL;
}
void inserisci(int el, STRINGA ch)
{
     DATO p;
     p = malloc(sizeof(DATO));
     
     p.elemento = el;
     p.chiave = ch;
     
     if (list == NULL) {
              p.prec = p;
              p.succ = p;
     } else {
            p.succ = list.succ;
            list.succ.prec = p;
            p.prec = list;
            list.next = p;
     }
}

void cancella(STRINGA ch)
{
     if (list == NULL) {
              return NULL;
     } else {
            while ( p != list ) {
                  if( p.chiave == ch ) {
                      p.prec.succ = p.succ;
                      p.succ.prec = p.prec;
                      
                      free(p);
                  } else {
                         p = p.succ;
                  }
            } 
     }
     return 0;
}

void cerca(STRINGA ch)
{
     if (list == NULL) {
              return NULL;
     } else {
            while ( p != list ) {
                  if( p.chiave == ch ) {
                      return p.elemento;
                  } else {
                         p = p.succ;
                  }
            } 
     }
     
     return NULL;
}
codice: