PDA

Visualizza la versione completa : Ancora problema lista in c


gabama
22-02-2009, 12:55
Ho 2 liste e vorrei fargli controllare (tramite una funzione) se contengono gli stessi elementi,e che mi ritorni 1 se è così ,0 viceversa
es l1 1--2--3
l2 3--2--1 mi ritorni 1 perchè gli elementi sono gli stessi,solo in ordine diverso



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

typedef struct nod {
int data;
struct nod *next;
struct nod *prev;
} node;

node *newnode(void)
{
return (node *)malloc(sizeof(node));
}

/* Dato un intero n>0, costruisce la lista di nodi da 1 ad n */
node *buildlis()
{
int x;
node *lis, *p, *last;
printf("nuovo numero da inserire in lista:\n");
scanf("%d", &x);
if (x==00000)
lis= NULL; /* caso di lista vuota */
else
{
/* inserzione del primo elemento in una lista */
last=newnode();
lis = last;
last->data = x;
last->next = NULL;
printf("nuovo numero da inserire in lista (00000 per terminare):\n");
scanf("%d", &x);
while (x!=00000)
/* Invariante: lis punta alla lista con tutti gli interi finora letti, tranne l'ultimo, e last punta all'ultimo nodo di tale lista */
{
p=newnode();
p->data = x;
p->next = NULL;
last->next = p;
last = p;
printf("nuovo numero da inserire in lista (00000 per terminare):\n");
scanf("%d", &x);
}
}
return(lis);
}


/* Stampa degli elementi di una lista */
void printlis(node *lis)
{
node* tmp;

tmp = lis;
int somma=0;float media=0;int conteggio=0;

while (tmp != NULL) {
printf(">>>> %d\n", tmp->data) && (somma=somma+tmp->data) && (conteggio=conteggio+1) ;
tmp = tmp->next;

}
printf("Somma %d\n",somma);

printf("Conteggio %d \n",conteggio);
media=(somma/conteggio);
printf("Media %f",media);
}

void myFree ( node* top )
{
node* tmp;
tmp = top;

while ( top->next != NULL ) {
tmp = top->next;
free(top);
top = tmp;
}
}


int uguali(node *l1,node *l2)

{
int vl=0;
int ug=0;

while((l1!=NULL) &&(l2!=NULL)) {
if (l1->data==l2->data){
ug=ug+1;
vl=vl+1;
}else (vl=vl+1);

l2=l2->next;l1=l1->next;
}



printf("\nvalori %d e uguali %d",vl,ug);
if(vl==ug) return 1;
else return 0;

}








int main()
{
node* head;node* head2;
int m=6;
printf ("-----LISTA A-----\n");
head = buildlis ( );
printf ("-----LISTA B-----\n");
head2 = buildlis ( );

printf ("\n-----STAMPA LISTA A-----\n");
printlis(head);
printf ("\n-----STAMPA LISTA B-----\n");
printlis(head2);

printf ("\n-----STAMPA LISTA A MODIFICATA-----\n");
int n=3;int uguale=0;
uguale=uguali(head,head2);
if(uguale==1)printf("\nUguali ");
else printf("\nDiversi ");
myFree ( head );
return 0;
}

oregon
22-02-2009, 13:10
Guarda ... tu sbagli a proporre il testo di un esercizio e il tuo codice senza dare altre indicazioni.

Dovresti fare una domanda precisa, che so

1) il programma non funziona perche' non da' i risultati corretti se inserisco questi dati ...

2) in compilazione ho un determinato errore in una tale riga ...

3) quando eseguo il programma, in una determinata fase, si arresta con un errore ...

Se non poni il quesito in questi termini, cosa vuoi che si faccia?

gabama
22-02-2009, 13:30
inserendo 1 -- 2 -- 3 e 3 -- 2 -- 1
mi da valori 3 (ed è giusto) ma uguali 1 e non lo è.L' errore è ovviamente nella funzione uguali.Con ogni probabilità il ciclo è creato male ,nel senso che non "gira" e itera come dovrebbe.Come lo posso modificare?

oregon
22-02-2009, 13:35
Ecco ... cosi' va molto meglio, la domanda e' chiara e si individua subito la parte di codice da rivedere senza tanta difficolta' ed e' possibile che qualcuno ti risponda ...

Nella funzione uguali devi prevedere 2 cicli e non uno solo.

Nel primo esterno, scorri la lista A, prendendo un elemento per volta che passerai all'interno del ciclo interno in cui scorri la lista B e in cui confronti l'elemento di A con TUTI quelli di B.

Nel secondo passo, confronterai il secondo elemento di A con TUTTI quelli di B e così via.

gabama
22-02-2009, 14:54
ti ringrazio oregon,e provo a postare solo il pezzo della funzione,perchè essendo agli inizi lo so a parole,ma ho problemi a volte a scriverlo.....

int uguali(node *l1,node *l2)

{
int vl=0;
int ug=0;

while(l1!=NULL) l1=l1->next; {
while (l2!=NULL) l2=l2->next; {
if (l1->data==l2->data) ;{
vl=vl+1;ug=ug+1
}
}

}
}

gabama
22-02-2009, 16:19
prima non ho potuto testare il nuovo codice,ma adesso mi dà valori 1 e uguali 1 e quindi c' è ancora un problema.....

int uguali(node *l1,node *l2)

{
int vl=0;
int ug=0;

while(l1!=NULL) l1=l1->next; {
while (l2!=NULL) l2=l2->next; {
if (l1->data==l2->data) ;{
vl=vl+1;ug=ug+1;
}
}

}




printf("\nvalori %d e uguali %d",vl,ug);
if(vl==ug) return 1;
else return 0;

}

oregon
22-02-2009, 17:52
Ma come sono scritti i while

while(l1!=NULL) l1=l1->next; {


while (l2!=NULL) l2=l2->next; {


???

E soprattutto, devi porre attenzione al fatto che la ricerca nel secondo ciclo deve ricominciare sempre dal primo elemento ...

gabama
22-02-2009, 18:08
sono agli inizi e ti chiedo se puoi ,e ,se hai soprattutto tempo e voglia di darmi un consiglio diretto su come trasformare il codice per farlo funzionare

oregon
22-02-2009, 18:23
Originariamente inviato da gabama
sono agli inizi e ti chiedo se puoi ,e ,se hai soprattutto tempo e voglia di darmi un consiglio diretto su come trasformare il codice per farlo funzionare

Il tempo si trova, ma sappi che cosi' non imparerai a programmare ... anche se sei agli inizi (come tutti), anzi a maggior ragione che sei agli inizi, bisogna "sbatterci" la testa, magari applicando dei "consigli" (che ti ho dato) ma provandoci da solo ...



int uguali(node *l1,node *l2)
{
int vl=0;
int ug=0;
node *tmp;

while(l1)
{
tmp=l2;
while(tmp)
{
if (l1->data==tmp->data)
ug=ug+1;

tmp=tmp->next;
}

vl=vl+1;
l1=l1->next;
}

printf("\nvalori %d e uguali %d",vl,ug);

if(vl==ug) return 1;
else return 0;
}

gabama
22-02-2009, 21:08
mi rendo conto che per imparare bisogna provare,infatti il 90% delle cose che ho imparato sul pc le ho fatte per conto mio,ma in questo caso dopo aver provato e riprovato per continuare e magari a mettermi in testa idee sbagliate ho preferito chiedere.Avevo fatto una cosa analoga con gli array,ma nelle liste mi ero un pò fermato.....
Comunque grazie mille per il codice
Ciao

Loading