PDA

Visualizza la versione completa : Ancora domanda su iterazione liste in c


gabama
09-03-2009, 22:41
Ho fatto queste lista con scopo
1->2->3
4->5->6
da come risultato
1->4->2->5->3->6
e funziona



#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;int z=0;
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);
z=z+1;
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);
z=z+1;

}
}
if (z>0) printf("Il valore e' %d\n",z);
if(z==0) printf("|||||-----lista vuota-----|||||\n");
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) ;
tmp = tmp->next;

}

}

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

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

int conteggio(node *lis)
{
int acc=0;
while (lis != NULL)
{
acc=acc+1;
lis=lis->next;
}
return(acc);
}


node* moltiplica(node *l1,node *l2)
{
node *p,*head,*tail;
head=NULL;int n=1;int pos=1;
if ((l1==NULL) && (l2==NULL)) return NULL;
while ((l1!=NULL) && (l2!=NULL)) {

if(n%2!=0) {
p=newnode();
p->data=l1->data;
p->next=NULL;
if(head==NULL){head=p,tail=p;}
else{tail->next=p;tail=tail->next;}
l1=l1->next;
n++;
}
if(n%2==0){
p=newnode();
p->data=l2->data;
p->next=NULL;
if(head==NULL){head=p,tail=p;}
else{tail->next=p;tail=tail->next;}
l2=l2->next;
n++;

}
}
return head;

}



int main()
{
node* head;node* head2;node *dup;

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-----CONTROLLO-----\n");

dup=moltiplica(head,head2);
printlis(dup);
if(head==NULL) printf ("\nNESSUN RISULTATO ESPRIME I VALORI VOLUTI\n");
free ( head );


return 0;
}


se invece volessi stampare solo in posizione multipla ad un numero,es
1->2->3
4->5->6
da come risultato
1->4->3->6
cosa devo fare,dove devo aggiugere pos ,ho provato con un ciclo che include cosė ,ma non va,dove sbaglio?

node* moltiplica(node *l1,node *l2)
{
node *p,*head,*tail;
head=NULL;int n=1;int pos=1;
if ((l1==NULL) && (l2==NULL)) return NULL;
while ((l1!=NULL) && (l2!=NULL)) {
if(pos%3==0){
if(n%2!=0) {
p=newnode();
p->data=l1->data;
p->next=NULL;
if(head==NULL){head=p,tail=p;}
else{tail->next=p;tail=tail->next;}
l1=l1->next;
n++;
}
if(n%2==0){
p=newnode();
p->data=l2->data;
p->next=NULL;
if(head==NULL){head=p,tail=p;}
else{tail->next=p;tail=tail->next;}
l2=l2->next;
n++;

}
pos++;}
}

return head;

}

Pacio88
10-03-2009, 00:47
Originariamente inviato da gabama
Ho fatto queste lista con scopo
1->2->3
4->5->6
da come risultato
1->4->2->5->3->6
e funziona
Personalmente non capisco cosa tu abbia fatto...
Provando ad immaginarlo hai passato ad una funzione le liste 1->2->3 e 4->5->6 ottenendo 1->4->2->5->3->6 come risultato... ho capito bene?


Originariamente inviato da gabama
se invece volessi stampare solo in posizione multipla ad un numero,es
1->2->3
4->5->6
da come risultato
1->4->3->6
Qui invece non riesco nemmeno ad immaginarlo che cosa tu intendessi... prova ad essere pių chiaro.

gabama
10-03-2009, 10:13
innanzitutto grazie per avermi risposto,
nel primo caso ho duplicato 2 liste in una terza che mi sstampi tutti gli elementi,riprendendo l' esempio

l1 1->2->3
l2 4->5->6
da come risultato
1->4->2->5->3->6
e funziona

nel secondo č lo stesso procedimento,solo che voglio stampare solo gli elementi in posizione dispari o multipla ad un numero

l1 1->2->3->4->5
l2 6->7->8->9->10
da come risultato
1->6->3->8->5->10

gabama
18-03-2009, 15:24
nessuno mi da consigli?

Loading