Untitled
Definire un tipo di dato opportuno per la rappresentazione e manipolazione di una lista di valori interi. Scrivere un sottoprogramma che riceve in ingresso due liste di interi l1 ed l2, ed un intero k positivo o nullo. Il sottoprogramma restituisce 1 se l1 contiene (nello stesso ordine) tutti gli elementi di l2, eventualmente inframezzati da al massimo k altri valori. In caso contrario, o se almeno una delle due liste è vuota, il sottoprogramma restituisce 0. Ciascuna lista contiene elementi tutti distinti tra loro. Esempio: Se il sottoprogramma riceve in ingresso l1 = 9 -> 4 -> 1 -> 2 -> -4 -> 7 -> -2 -> 6 -> 8 -> 5 l2 = 2 -> -2 -> 6 k = 2 restituisce 1. Se il sottoprogramma riceve in ingresso l1 = 9 -> 4 -> 1 -> 2 -> -4 -> 7 -> -2 -> 6 -> 8 -> 5 l2 = 2 -> -2 -> 6 k = 1 restituisce 0 poichè in l1 tra i due nodi con valore 2 e−2 (presenti in l2) c’è più di un elemento. Se il sottoprogramma riceve in ingresso l1 = 9 -> 4 -> 1 -> 2 -> -4 -> 7 -> -2 -> 6 -> 8 -> 0 l2 = 2 -> 5 -> 6 k = 2 restituisce 0 poichè in l1 non c’è un elemento con valore 5 successivamente all’elemento con valore 2. */ #include <stdio.h> int verificaListe(nodo_t *l1, nodo_t *l2, int k) { if(l1 == NULL || l2 == NULL) { return 0; } nodo_t *curr1=l1; nodo_t *curr2=l2; while(curr1 != NULL && curr2 != NULL) { if(curr1->num == curr2->num) { curr1=curr1->next; curr2=curr2->next; if(curr2==NULL) { return 1; } int tmp_k = k; nodo_t *tmp_curr1= curr1; int trovato =0; /* l1 = 9 -> 4 -> 1 -> 2 -> -4 -> 7 -> -2 -> 6 l2 = 2 -> -2 -> 6 k = 2 */ while(tmp_k >=0 && tmp_curr1 != NULL && !trovato) { if(tmp_curr1->num == curr2 -> num) { curr1 = tmp_curr1; trovato = 1; } tmp_curr1 = tmp_curr1->next; tmp_k--; } if(!trovato) { return 0; } } else { curr1 = curr1->next; } } return 0; } int main() { return 0; }
Leave a Comment