PDA

Visualizza la versione completa : [c] confrontaliste


ant_alt
25-01-2009, 21:00
questo esercizio mi ha spiazzato un pò..praticamente non saprei da dove cominciare :(



typedef struct nodo *lista;
typedef struct nodo {
int val;
lista next;
}nodo;

/* Function: confrontaListe
* Usage: L = confrontaListe (L1, L2, &n)
* -----------------------------------------------
* Confronta uno ad uno gli elementi corrispondenti delle due liste L1 e L2, che devono
* avere uguale lunghezza, costruendo una nuova lista L che contiene gli elementi
* corrispondenti che risultano uguali. Se L1 e L2 hanno lunghezza diversa,
* restituisce NULL. Il parametro di output n conta il numero di elementi corrispondenti
* uguali
*/



ho pensato, scorro le due liste contemporaneamente:



lista confrontaListe(lista L1, lista L2, int *n)
{
nodo *corrente1;
nodo *precedente1;
nodo *corrente2;
nodo *precedente2;
while (corrente1==NULL&&corrente2==NULL){
precedente1=corrente1;
precedente2=corrente2;
corrente1=corrente1->next;
corrente2=corrente2->next;
if (corrente1->val==corrente2->val){
//appendi nodo alla nuova lista
//incrementa n (non so come)
}}
}


la strada è giusta?

YuYevon
25-01-2009, 22:09
Mi sembra di sì, anche se forse potrebbe semplificarsi un po' il codice.

E' un po' che non tratto liste in C e potrei aver fatto qualche sciocchezza (anche se ho provato la funzione e funge...) comunque ho scritto questo codice di esempio



#include <stdio.h>
#include <stdlib.h>

struct nodo {
char c;
struct nodo *next;
};

typedef struct nodo NODO;

typedef NODO * LINK;

LINK visita(LINK lista1, LINK lista2, int *n) { /*n viene passato per riferimento e ha valore 0*/

LINK temp1 = lista1;
LINK temp2 = lista2;

LINK nuova_lista = (LINK) malloc(sizeof(NODO));

/* poiché le liste hanno uguale lunghezza e poiché vengono scorse parallelamente,
finita l'una sarà finita necessariamente anche l'altra, quindi eseguo il controllo
solo su una di esse */
while ( temp1 != NULL ) {

if ( temp1->c == temp2->c ) {

if ( *n == 0 )

nuova_lista = temp1;

else

nuova_lista->next = temp1;

*n = *n + 1;
}

temp1 = temp1->next;
temp2 = temp2->next;
}

return nuova_lista;
}

ant_alt
25-01-2009, 22:22
scusami ma volendo usare il tuo codice è sbagliato dichiarare una lista così
LINK listauno={'a', 'd', 'e'};

xke mi da errore?

"initializer for scalar variable requires one element "

YuYevon
25-01-2009, 22:22
Ora che rileggo non è detto che le liste abbiano uguale lunghezza, e anzi se non ce l'hanno la funzione deve restituire NULL... si potrebbe risolvere aggiungendo un controllo del genere



...
temp1 = temp1->next;
temp2 = temp2->next;

if ( (temp1 == NULL && temp2 != NULL) || (temp1 != NULL && temp2 == NULL) ) {
nuova_lista = NULL;
break;
}

YuYevon
25-01-2009, 22:24
Originariamente inviato da ant_alt
scusami ma volendo usare il tuo codice è sbagliato dichiarare una lista così
LINK listauno={'a', 'd', 'e'};

xke mi da errore?

"initializer for scalar variable requires one element "

Scusa ma LINK è un puntatore alla struttura nodo... come puoi dichiararlo così?

ant_alt
25-01-2009, 22:24
Originariamente inviato da YuYevon
Ora che rileggo non è detto che le liste abbiano uguale lunghezza, e anzi se non ce l'hanno la funzione deve restituire NULL... si potrebbe risolvere aggiungendo un controllo del genere



...
temp1 = temp1->next;
temp2 = temp2->next;

if ( (temp1 == NULL && temp2 != NULL) || (temp1 != NULL && temp2 == NULL) ) {
nuova_lista = NULL;
break;
}


certo, non ti ho corretto xke questo è decisamente secondario:)



Originariamente inviato da YuYevon
Scusa ma LINK è un puntatore alla struttura nodo... come puoi dichiararlo così?

so che era sbagliato, quindi come si dichiara? :(

Loading