Corso IN110 Algoritmi e Strutture Dati

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

Università degli Studi Roma Tre - Dipartimento di Matematica e Fisica - Corso di laurea in Matematica - Corso di Informatica 1 (IN110)

Author: Marco Liverani - Last modified: Saturday July 13, 2019 - URI: http://www.mat.uniroma3.it/users/liverani/IN1/20010605a.shtml