Palindromi
Implementiamo un algoritmo per determinare se la parola contenuta in una lista concatenata è palindroma (parole che restano uguali se lette al contrario. Ad esempio "anna"
, "bob"
sono palindromi, "ciao"
e "bod"
non lo sono). Esistono vari modi per farlo, noi implementiamo un semplice algoritmo che crea una copia in ordine invertito della lista da controllare e verifica se la lista di origine e quella invertita son identiche.
Si chiede di implementare le seguenti funzioni:
void add(Nodo**lis, char c);
int compareLists(Nodo*lis, Nodo* comp);
void copyReversed(Nodo* lis, Nodo** copy);
int checkPalindrome(Nodo*lis);
Delle ultime due viene fornito lo pseudocodice:
add
serve ad ad aggiungere un nodo in coda alla lista lis
contenente il carattere c
come valore.
compareLists
deve restituire True se lis
e comp
sono due liste identiche (hanno lo stesso numero di nodi e il contenuto dei nodi è identico). Esistono più modi di eseguire questo controllo ma si consiglia di usare la ricorsione.
Se necessario, si possono aggiungere funzioni di supporto, ma è necessario che le funzioni richieste siano implementate esattamente con i prototipi forniti.
Lo pseudocodice non è codice completo in C: non considera i tipi dei vari oggetti, l’uso di puntatori/riferimenti, e dunque dell’operatore “->” anziché l’operatore “.”: `e lasciato allo studente il compito di determinare questi dettagli come adeguato.
La soluzione proposta è la seguente:
void add(Nodo **lista, char c)
{
if (lista == NULL)
{
("Passare per riferimento ad ADD\n");
printf}
if (*lista == NULL)
{
*lista = malloc(sizeof(Nodo));
(*lista != NULL);
assert(*lista)->value = c;
(*lista)->next = NULL;
}
else
{
(&(*lista)->next, c);
add}
}
void copyReversed(Nodo *src, Nodo **copy)
{
if (copy == NULL)
{
("Passare la lista di destinazione di copia per puntatore");
printf}
if (src == NULL)
{
return;
}
(src->next, copy);
copyReversed(copy, src->value);
add}
int compareLists(Nodo *list_a, Nodo *list_b)
{
if (list_a == NULL)
{
if (list_b == NULL)
{
return 1;
}
else
{
return 0;
}
}
if (list_a->value != list_b->value)
{
return 0;
}
else
{
return compareLists(list_a->next, list_b->next);
}
}
int checkPalindrome(Nodo *lista)
{
if (lista == NULL)
{
return 0;
}
*inv = NULL;
Nodo (lista, &inv);
copyReversedint result = compareLists(lista, inv);
(inv);
deleteListreturn result;
}