Gli esercizi
Testi e soluzioni di alcuni esercizi
Derivata di un polinomio con liste
/*
** derivata.c
**
** Leggere in input un polinomio a coefficienti reali e memorizzarlo
** in una lista costituita da nodi con tre campi (grado, coefficiente,
** puntatore al seguente). Scrivere un programma che dopo aver costruito
** una seconda lista che rappresenta il polinomio derivato di quello
** fornito in input, ne stampi l'espressione sullo schermo.
**
** Marco Liverani (liverani@mat.uniroma3.it) - Giugno 2001
*/
#include <stdlib.h>
#include <stdio.h>
struct nodo {
int grado;
float coefficiente;
struct nodo *next;
};
struct nodo *leggi_lista(void) {
struct nodo *p, *primo;
int x, n, i;
printf("Grado del polinomio: ");
scanf("%d", &n);
primo = NULL;
for (i=0; i<=n; i++) {
printf("Coefficiente del termine di grado %d: ",i);
scanf("%d", &x);
if (x != 0) {
p = (struct nodo *) malloc(sizeof(struct nodo));
p->grado = i;
p->coefficiente=x;
p->next = primo;
primo = p;
}
}
return(primo);
}
void stampapolinomio(struct nodo *l) {
while(l != NULL) {
if (l->coefficiente != 0) {
if(l->next != NULL) {
printf("%4.1fx^%d", l->coefficiente, l->grado);
if (l->next->coefficiente > 0)
printf(" +");
} else {
printf("%4.1f", l->coefficiente);
}
}
l = l->next;
}
printf("\n");
return;
}
struct nodo *invertilista(struct nodo *p) {
struct nodo *q, *primo=NULL;
while(p != NULL) {
q = (struct nodo *) malloc(sizeof(struct nodo));
q->grado = p->grado;
q->coefficiente = p->coefficiente;
q->next = primo;
primo = q;
p = p->next;
}
return(primo);
}
struct nodo *derivapolinomio(struct nodo *p) {
struct nodo *q, *primo=NULL;
while(p != NULL) {
if(p->grado != 0) {
q = (struct nodo *) malloc(sizeof(struct nodo));
q->grado = p->grado - 1;
q->coefficiente = (p->grado) * (p->coefficiente);
q->next = primo;
primo = q;
}
p = p->next;
}
return(primo);
}
int main(void) {
struct nodo *l, *l2;
l = leggi_lista();
printf("Derivando il polinomio:\n");
stampapolinomio(l);
printf("si ottiene il polinomio:\n");
l = invertilista(l);
l2 = derivapolinomio(l);
stampapolinomio(l2);
return(0);
}