// [Link] : Este arquivo contém a função 'main'.
A execução do
programa começa e termina ali.
//
#include <iostream>
using namespace std;
struct Monomio
{
int coeficiente; //coeficiente do termo
int expoente; // expoente do termo
Monomio* proximo; // ponteiro do proximo termo
};
struct Polinomio
{
Monomio* comeco; //inicia um ponteiro no primeiro termo
//Construtor que inicializa os ponteiro como null
Polinomio()
{
comeco = nullptr;
}
};
void mostrarPolinomio(Polinomio polinomio) {
if ([Link] == NULL) {
cout << " vazia";
}
Monomio* atual = [Link]; // inicia um ponteiro no primeiro termo
while (atual != nullptr)
{
cout << atual->coeficiente << "x^" << atual->expoente << " ";
atual = atual->proximo;
}
// insere um novo termo no linal da lista
void inserirPolinomio(Polinomio& polinomio) {
Monomio* novoMonomio = new Monomio;//cria um novo monomio
//se a lista estiver vazia
if ([Link] == nullptr) {
[Link] = novoMonomio;
}
//se a lista nao estiver vazia
Monomio* atual = [Link];//inicia o ponteiro no atual no primeiro
numero da lista
while (atual->proximo != nullptr)
{
atual = atual->proximo;
}
atual->proximo = novoMonomio;
};
void inserirOrdenadamente(Polinomio& polinomio, Monomio* novoMonomio) {
// Se a lista estiver vazia, insira o novo termo como o primeiro termo
if ([Link] == nullptr) {
[Link] = novoMonomio;
return;
}
Monomio* atual = [Link]; //INICIA PONTEIRO ATUAL NO COMECO DA LISTA
Monomio* anterior = nullptr;//INICIA O PONTEIRO ANTERIOR
// Percorre a lista até encontrar a posição correta para inserir o novo termo
while (atual != nullptr && atual->expoente >= novoMonomio->expoente) {
anterior = atual;
atual = atual->proximo;
}
// Insere o novo termo antes do termo atual
novoMonomio->proximo = atual;
if (anterior != nullptr) {
anterior->proximo = novoMonomio;
} else {
[Link] = novoMonomio;
}
}
///baseadao na que esta na da lista LUE que o professor fez em sala do dia 09/03
Monomio* buscarPolinomio(Polinomio polinomio, int valor) {
Monomio* atual = [Link];//inicia o ponteiro atual
while (atual != NULL)
{ // se o exponte do atual e oque esta sendo procurado
if (atual->expoente == valor) {
return atual;
atual = atual->proximo;// avanca para o proxomo termo
}
return NULL;/// se o termo nao for encontrado
}
}
///funcao que le o polinomio
void lerPolinomio(Polinomio& polinomio) {
int n; // número de termos do polinômio
cout << "Digite o número de termos do polinômio: ";
cin >> n;
for (int i = 0; i < n; i++) {
int coeficiente, expoente;
cout << "Digite o coeficiente e expoente do termo " << i + 1 << ": ";
cin >> coeficiente >> expoente;
Monomio* novoMonomio = new Monomio; // cria um novo Monomio com alocação
dinâmica de memória
novoMonomio->coeficiente = coeficiente; // atribui o coeficiente passado
como parâmetro para o novo Monomio
novoMonomio->expoente = expoente; // atribui o expoente passado como
parâmetro para o novo Monomio
novoMonomio->proximo = nullptr; // o próximo elemento da lista encadeada é
nulo, pois o novo Monomio é o último elemento a ser inserido
inserirOrdenadamente(polinomio, novoMonomio);
}
}
// Função que remove um termo da lista encadeada a partir de um dado expoente
void removerTermos(Polinomio& polinomio, int expoente) {
// Primeiro, verificamos se a lista está vazia
if ([Link] == nullptr) {
cout << "A lista está vazia, não há termos para remover!" << endl;
return;
}
bool algumTermoRemovido = false; // flag para indicar se algum termo foi
removido
// Loop para percorrer a lista encadeada em busca de todos os termos com o
expoente especificado
do {
Monomio* atual = [Link];
Monomio* anterior = nullptr;
bool encontrado = false;
// Percorre a lista encadeada até encontrar um nó com o expoente
especificado
while (atual != nullptr) {
if (atual->expoente == expoente) {
encontrado = true;
break;
}
anterior = atual;
atual = atual->proximo;
}
// Se um termo com o expoente especificado foi encontrado, remova-o da
lista
if (encontrado) {
if (anterior == nullptr) {
// Se o termo a ser removido é o primeiro da lista, atualizamos o
início da lista para o próximo elemento
[Link] = atual->proximo;
} else {
// Se o termo a ser removido não é o primeiro da lista, atualizamos
o ponteiro "proximo" do elemento anterior para apontar para o próximo elemento
depois do elemento removido
anterior->proximo = atual->proximo;
}
delete atual; // Libera a memória alocada para o nó removido
algumTermoRemovido = true; // Atualiza a flag para indicar que um termo
foi removido
} else {
// Se nenhum termo com o expoente especificado foi encontrado,
interrompa o loop
break;
}
} while (true); // Loop infinito que será interrompido apenas quando nenhum
termo com o expoente especificado for encontrado
// Verifica se pelo menos um termo foi removido e exibe uma mensagem
correspondente
if (algumTermoRemovido) {
cout << "Todos os termos com expoente " << expoente << " foram removidos da
lista com sucesso!" << endl;
} else {
cout << "Nenhum termo com expoente " << expoente << " foi encontrado na
lista!" << endl;
}
}
int main() {
int p;
Polinomio polinomio;
lerPolinomio(polinomio);
mostrarPolinomio(polinomio);
cout<<endl;
cout << "digite o expoente que deseja remover: "<<endl;
cin>>p;
removerTermos(polinomio,p);
mostrarPolinomio(polinomio);
return 0;
}