Advertisement
Guest User

Untitled

a guest
Feb 21st, 2019
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.41 KB | None | 0 0
  1. Polinomio CriaTermo(float coef, int exps[], int numVars)
  2. {
  3.     Polinomio *r, *p, q;
  4.     r=p;
  5.     if(numVars != -1)
  6.     {
  7.         while (i<numVars-1)
  8.         {
  9.             q=MALLOC(sizeof(Termo));
  10.             q->tipo = tipoPoli;
  11.             q->expo = exps[i];
  12.             q->prox = NULL;
  13.             if(i!=0)
  14.                 (*p)->info.poli = q;
  15.             *p = q;
  16.             i++;
  17.         }
  18.     }
  19.     q=MALLOC(sizeof(Termo));
  20.     q->tipo = tipoConst;
  21.     q->info.coef = coef;
  22.     q->expo = exps[i];
  23.     q->prox = NULL;
  24.     if(numVars !=1)
  25.         (*p)->info.poli = q;
  26.     else
  27.         p=q;
  28.  
  29.     return *r;
  30. }
  31.  
  32. Polinomio CriaPolinomioNulo()
  33. {
  34.     return NULL;
  35. }
  36.  
  37. Boolean PolinomioNulo(Polinomio p)
  38. {
  39.     if(p==NULL)
  40.         return true;
  41.     else
  42.         return false;
  43. }
  44.  
  45. Polinomio CopiaPolinomio(Polinomio p)
  46. {
  47.     if(p==NULL)
  48.         return NULL;
  49.  
  50.     q=MALLOC(sizeof(Termo));
  51.  
  52.     if(p->tipo = tipoPoli)
  53.     {
  54.         q->tipo = tipoPoli; //MUITO IMPORTANTE
  55.         q->expo = p->expo;
  56.         q->info.poli = CopiaPolinomio(p->info.poli);
  57.         q->prox = CopiaPolinomio(p->prox);
  58.     }
  59.     else
  60.     {
  61.         q->tipo = tipoConst;
  62.         q->coef = p->coef;
  63.         q->expo = p->expo;
  64.         q->prox = CopiaPolinomio(p->prox);
  65.     }
  66.     return  q;
  67. }
  68.  
  69.  
  70. Polinomio SomaPolinomios(Polinomio a, Polinomio b)
  71. {
  72.     Polinomio soma = CriaPolinomioNulo(),s, *p;
  73.  
  74.     *p = soma;
  75.  
  76.     while (a!=NULL&& b!=NULL) //percorre os nós da lista sequencialmente
  77.     {
  78.         if (((a->expo)==(b->expo)) || a->expo = 0 || b->expo = 0) //se os termos têm o mesmo grau, eles são somados
  79.         {
  80.             if(a->tipo == tipoConst)
  81.             {
  82.                 int x = a->info.coef + b->info.coef;
  83.                 int y;
  84.                 if(a->expo && b->expo!=0) //trata caso expo = 0
  85.                     y = a->expo;
  86.                 else
  87.                     y = a->expo + b->expo;
  88.                 if(y!= 0)
  89.                 {
  90.                     s = MALLOC(sizeof(Termo));
  91.                     s->tipo = tipoConst;
  92.                     s->info.coef = x;
  93.                     s->expo = y;
  94.                 }
  95.                 else    //TESTAR //GAMBIARRA?
  96.                     s= NULL;
  97.             }
  98.             else
  99.             {
  100.                 Polinomio res = SomaPolinomios(a->info.poli, b->info.poli);
  101.                 if(res!=NULL)
  102.                 {
  103.                     s = MALLOC(sizeof(Termo));
  104.                     s->tipo = tipoPoli;
  105.                     s->expo = y;
  106.                     s->info.poli = res;
  107.                 }
  108.                 else
  109.                     s=NULL;
  110.             }
  111.             /*
  112.             if(soma == NULL)
  113.                 soma = s;
  114.             else
  115.             {
  116.                 soma->prox = s;
  117.                 soma = soma->prox;
  118.             }
  119.             */
  120.             InsereApos(soma, s);
  121.             a=a->prox;
  122.             b=b->prox;
  123.         }
  124.         else if(a->expo > b->expo) //se o grau do nó em a é menor que o de b, insere o de a
  125.         {
  126.             s=CopiaTermo(a);
  127.             /*
  128.             if(soma!=NULL)
  129.                 soma->prox = s;
  130.             else
  131.                 soma = s;
  132.             */
  133.             InsereApos(soma, s);
  134.             //soma = soma->prox;
  135.             a=a->prox;
  136.         }
  137.         else if (b->expo > a->expo ) //se o grau do nó em a é menor que o de b, insere o de b
  138.         {
  139.             s = CopiaTermo(b);
  140.             /*
  141.             if(soma!=NULL)
  142.                 soma->prox = s;
  143.             else
  144.                 soma = s;
  145.             */
  146.             InsereApos(soma, s);
  147.             //soma = soma->prox;
  148.             b=b->prox;
  149.         }
  150.     }
  151.  
  152.     //O programa sai do loop quando pelo menos uma dos dois polinomios acaba. Falta inserir os termos restantes do outro, se houverem.
  153.  
  154.     while (a!=NULL)  //Se a ainda não acabou, continua inserindo seus termos até acabar.
  155.     {
  156.         s = CopiaTermo(a);
  157.         /*
  158.         if(soma!=NULL)
  159.             soma->prox = s;
  160.         else
  161.             soma = s;
  162.         */
  163.         InsereApos(soma, s);
  164.         //soma = soma->prox;
  165.         a=a->prox;
  166.     }
  167.  
  168.     while (b!=NULL) //Se a ainda não acabou, continua inserindo seus termos até acabar.
  169.     {
  170.         s = CopiaTermo(b);
  171.         /*
  172.         if(soma!=NULL)
  173.             soma->prox = s;
  174.         else
  175.             soma = s;
  176.         */
  177.         InsereApos(soma, s);
  178.        // soma = soma->prox;
  179.         b=b->prox;
  180.     }
  181.     soma->prox = NULL;
  182.     return *p;
  183. } /* SomaPolinomios */
  184.  
  185.  
  186. void InsereApos(Polinomio p, Polinomio q)
  187. /*Insere um polinomio @q após o polinômio @p e avança
  188.   até a posição final de @p, se este não é nulo;
  189.   caso contrário, atribui @q a @p */
  190. {
  191.     if(p!=NULL)
  192.     {
  193.       p->prox = q;
  194.       p=p->prox;
  195.     }
  196.     else
  197.         p = q;
  198. }
  199.  
  200.  
  201. Polinomio MultPolinomios(Polinomio a, Polinomio b);
  202. /* Devolve o produto dos polinômios 'a' e 'b', sem alterá-los */
  203. {
  204.     Polinomio produto=CriaPolinomioNulo(), prod;
  205.     while (q!=NULL)
  206.     {
  207.         while(p!=NULL)
  208.         {
  209.             prod = MALLOC(sizeof(Termo));
  210.             prod->expo = p->expo + q->expo;
  211.             prod->prox = NULL;
  212.             if(p->tipo == tipoPoli)
  213.             {
  214.                 prod->tipo = tipoPoli;
  215.                 prod->info.poli = MultPolinomios(p->info.poli, q->info.poli);
  216.             }
  217.             else
  218.             {
  219.                 prod->tipo = tipoConst;
  220.                 prod->info.coef = (p->coef)*(q->coef);
  221.             }
  222.             produto=SomaPolinomios(produto, prod);  //ver questão dos auxiliares e da liberação de memoria
  223.             p=p->prox;
  224.         }
  225.         q=q->prox;
  226.     }
  227.     return produto;
  228. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement