PDA

Visualizza la versione completa : Liste in c


gabama
20-02-2009, 11:12
Ho un problema con 2 liste in c,dovrei fare la differenza tra gli elementi di una meno l' altra e generarne un 'altra,fino a qui tutto bene,ma quando una p breve dell' altra come posso fare per evitare di generare 2 funzioni come ho fatto in questo caso?Perch se l1 minore di l2 mi deve dare il valore negativo



#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<=0)
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:\n");
scanf("%d", &x);
while (x>0)
/* 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:\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;
}
}

node *duplist1(node *l)
{
node *p,*head,*tail;
head=NULL;
while (l != NULL)
{
p=newnode();
p->data = l->data;
p->next = NULL;
if (head == NULL)
{ head=p; tail=p;}
else {tail->next=p; tail=tail->next;}
l=l->next;
}
return head;
}

node *duplist2(node *l)
{
node *p,*head,*tail;
head=NULL;
while (l != NULL)
{
p=newnode();
p->data = -l->data;
p->next = NULL;
if (head == NULL)
{ head=p; tail=p;}
else {tail->next=p; tail=tail->next;}
l=l->next;
}
return head;
}

node *duplica(node *l1, node *l2)
{
node *p, *head, *tail;
head=NULL;
while ((l1 != NULL) && (l2 != NULL))
{
p=newnode();
p->data = l1->data-l2->data;
p->next = NULL;
if (head == NULL){head=p; tail=p;}
else {tail->next=p; tail=tail->next;}
l1 = l1->next;
l2 = l2->next;
} if ((l1 == NULL) && (l2 == NULL)) return head;
else if (l1 == NULL)
{ tail->next=duplist2(l2); return head;}
else {tail->next=duplist1(l1); return head;}
}





int main()
{
node* head;node* head2;node *dup;
int n;int m=6;
printf ("\n-----LISTA A-----\n");
head = buildlis ( );
printf ("\n-----LISTA B-----\n");
head2 = buildlis ( );
printf ("\n-----STAMPA LISTA A-----\n");
int a=3;
printlis(head);
printf ("\n-----STAMPA LISTA B-----\n");
printlis(head2);
printf ("\n-----STAMPA LISTA A MODIFICATA-----\n");
dup=duplica(head,head2);
printlis(duplica(head,head2));
myFree ( head );
return 0;
}

gabama
20-02-2009, 15:35
nessuno mi pu dare consigli?

oregon
20-02-2009, 16:07
Forse non ti ha risposto nessuno perch le tue spiegazioni non sono chiare ...

gabama
20-02-2009, 21:04
il mio problema che se una lista termina prima dell' altra come potevo fare per non che l' operazione di copiatura si interrompesse.Ho risolto cos,funziona,ma corretto sintatticamente?



#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;
}
}


node *duplica(node *l1, node *l2)
{
node *p, *head, *tail;
head=NULL;
while ((l1 != NULL) && (l2 != NULL))
{
p=newnode();
p->data = l1->data-l2->data;
p->next = NULL;
if (head == NULL){head=p; tail=p;}
else {tail->next=p; tail=tail->next;}
l1 = l1->next;
l2 = l2->next;
} if ((l1 == NULL) && (l2 == NULL)) return head;
else if (l1 == NULL)
{ while (l2 != NULL)
{
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;
}
return head; }
else (l2 == NULL);{while (l1 != NULL)
{
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;; return head;}
}

}


int main()
{
node* head;node* head2;node *dup;
int n;int m=6;
printf ("-----LISTA A-----\n");
head = buildlis ( );
printf ("\n-----LISTA B-----\n");
head2 = buildlis ( );
printf ("\n-----STAMPA LISTA A-----\n");
int a=3;
printlis(head);
printf ("\n-----STAMPA LISTA B-----\n");
printlis(head2);
printf ("\n-----STAMPA LISTA A MODIFICATA-----\n");
dup=duplica(head,head2);
printlis(duplica(head,head2));
myFree ( head );
return 0;
}

Loading