Умножение двух полиномов в программе cpp LinkedList

Я делаю программу полиномов на C ++, которую мы должны реализовать с помощью односвязного списка. И да, это домашнее задание. Я разработал большую часть программы, и я просто застрял с перегрузкой моего оператора умножения. Это моя оператор * функция:

LinkedList operator*(const LinkedList& a, const LinkedList& b)
{
LinkedList product;
Node* nodeA = a.head;
Node* nodeB = b.head;
int coeff, powr;

if (nodeA == NULL && nodeB == NULL)
return product;
else if (nodeA == NULL && nodeB != NULL)
return b;
else if (nodeA != NULL && nodeB == NULL)
return a;
else {
while (nodeA != NULL) {
while (nodeB != NULL) {
coeff = nodeA->getCoeff() * nodeB->getCoeff();
powr = nodeA->getPow() + nodeB->getPow();
product.addElement(coeff, powr);
nodeB = nodeB->getNext();
}
nodeB = b.head;
nodeA = nodeA->getNext();
}
}
return product;
}

Для справки, я просто сейчас добавляю новый элемент в конец связанного списка.

Вот моя функция AddElement:

void LinkedList::addElement(int coeff, int powr)
{
Node *newNode = new Node();

// Set the Node's data
newNode->setPowAndCoefficient(coeff, powr);
newNode->setNextNode(NULL);
Node *temp = head;

if (temp != NULL) {
// Go to the last element of the list
while (temp->getNext() != NULL) {
temp = temp->getNext();
}
// temp is now the last element and its next element is null
// Set temp's next node to be the newNode
temp->setNextNode(newNode);
}
else
head = newNode;
}

Node — это просто мой класс с частными данными, коэффициентами, мощностью и указателем на следующий узел. LinkedList — это мой основной класс, который включает в себя частный член Node *, перегруженные функции публичного оператора и несколько конструкторов. Используемый здесь конструктор является конструктором по умолчанию, в котором я просто установил заголовок в NULL.

После второго цикла while я поставил некоторые оценки cout и умножил два полинома, чтобы проверить мою функцию умножения.

Так что в этом случае у меня есть этот код в моем файле main.cpp:

LinkedList poly1, poly2, result;
// The first polynomial: 3x^3 + 7x^2 - 7
poly1.addElement(3, 3);
poly1.addElement(7, 2);
poly1.addElement(-7, 0);
cout << "Polynomial A: " << poly1 << endl;

// The second polynomial: -5x^5 - 14x^3 + 7x^2 + 14
poly2.addElement(-5, 14);
poly2.addElement(-14, 3);
poly2.addElement(7, 2);
poly2.addElement(14, 0);
cout << "Polynomial B: " << poly2 << endl;

Так же << перегруженный оператор работает отлично и отображает связанный список нормально.
Проблема в том, когда я пытаюсь сделать это:

result = poly1 * poly2;

Я получаю ошибку сегментации. И я не знаю почему. Как я уже сказал, я помещаю операторы cout в первый цикл while, и это то, что я получаю, когда делаю poly1 * poly2:

 -15x^17 - 42x^6 + 21x^5 + 42x^3 - 35x^16 - 98x^5 + 49x^4 + 98x^2 + 35x^14 + 98x^3 - 49x^2 - 98
[1]    39009 segmentation fault  ~/Desktop/run

Да, это довольно уродливо, но это до того, как я сложу все эти вещи вместе. Но в любом случае, это по сути правильно. Я просто получаю ошибку сегментации после оценки последней константы.

Я понятия не имею, почему он это делает, и он делает это только для оператора умножения. Другие вещи работают хорошо, хотя. Возможно, у меня где-то есть ошибка, и я искал ее последние несколько часов, но я не знаю, что сделал неправильно. Может кто-нибудь, пожалуйста, помогите?

Благодарю.

Мой класс узла:

class Node {
private:
int power;
int coefficient;
Node *next;
public:
Node(); // in implementation: coeff = 0, power = 0, next = NULL;
Node(const int coeff, const int powr = 1);
void setPowAndCoefficient(const int coeff, const int powr);
inline int getPow() const { return power; };

inline int getCoeff() const { return coefficient; };

inline void setNextNode(Node *aNode) { next = aNode; };

inline Node *getNext() const { return next; };
};Node::Node()
{
coefficient = 0;
power = 1;
next = NULL;
}

Node::Node(const int coeff, const int powr)
{
coefficient = coeff;
power = powr;
next = NULL;
}

void Node::setPowAndCoefficient(const int coeff, const int powr)
{
coefficient = coeff;
power = powr;
next = NULL;
}

1

Решение

Чувак,
Мне было немного лень читать весь пост ..
Но вот как я бы умножил два полинома ..

    LinkedList operator*(const LinkedList& a, const LinkedList& b){
int coef,pow;
LinkedList temp = new LinkedList();
for(node * a1 = a->head;a1!=NULL;a1=a1->next)
for(node * b1 = b->head;b1!=NULL;b1=b1->next){
coef = a1->getCoeff() * b1-> getCoeff();
pow = a1->getPow()+b1->getPow();
node ab  = new node(coef,pow);//Writting it java style, cant remember if this is how u       //declare objects in c++ :(
temp.addNode(ab);
}
return temp;
}

Прошу прощения, если это вам не поможет .. Но я просто пытаюсь представить вам идею.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]