我写了一个程序,以单链表的形式乘以两个多项式。我无法使用此代码打印输出。链接列表多项式乘法
我得到的输出是
1st Number: 5x^2 + 4x^1 + 2x^0
2nd Number: 5x^1 + 5x^0
Multiplied polynomial:
我该如何解决呢?
我的代码:
// C++ program for multiplication of two polynomials
// using Linked Lists
#include<bits/stdc++.h>
using namespace std;
// Node structure containing power and coefficient of variable
struct node
{
int coeff;
int exp;
struct node *next;
};
void padd(float, int, node**);
// Function to create new node
void create_node(int x, int y, struct node **temp)
{
struct node *r,*z ;
z = *temp;
if(z == NULL)
{
r =(struct node*)malloc(sizeof(struct node));
r->coeff = x;
r->exp = y;
*temp = r;
r->next = (struct node*)malloc(sizeof(struct node));
r = r->next;
r->next = NULL;
}
else
{
r->coeff = x;
r->exp = y;
r->next = (struct node*)malloc(sizeof(struct node));
r = r->next;
r->next = NULL;
}
}
// Function Multiplying two polynomial numbers
void polymul (struct node *poly1, struct node *poly2,
struct node *poly)
{
struct node *y1 ;
float coeff1;
int exp1 ;
y1 = poly2 ; /* point to the starting of the second linked list */
if (poly1 == NULL && poly2 == NULL)
return ;
/* if one of the list is empty */
if (poly1 == NULL)
poly = poly2 ;
else
{
if (poly2 == NULL)
poly = poly1 ;
else/* if both linked lists exist */
{
/* for each term of the first list */
while (poly1 != NULL)
{
/* multiply each term of the second linked list with a
term of the first linked list */
while (poly2 != NULL)
{
coeff1 = poly1 -> coeff * poly2 -> coeff ;
exp1 = poly1 -> exp + poly2 -> exp ;
poly2 = poly2 -> next ;
/* add the new term to the resultant polynomial */
padd (coeff1, exp1, &poly) ;
}
poly2 = y1 ; /* reposition the pointer to the starting of
the second linked list */
poly1 = poly1 -> next ; /* go to the next node */
}
}
}
}
/* adds a term to the polynomial in the descending order of the exponent */
void padd (float coeff, int exp, struct node **s)
{
struct node *r, *temp = *s ;
/* if list is empty or if the node is to be inserted before the first node */
if (*s == NULL || exp > (*s) -> exp)
{
*s=r = (struct node*) malloc (sizeof (struct node)) ;
(*s) -> coeff = coeff ;
(*s) -> exp = exp ;
(*s)-> next = temp ;
}
else
{
/* traverse the entire linked list to search the position to insert a new node */
while (temp != NULL)
{
if (temp -> exp == exp)
{
temp -> coeff += coeff ;
return ;
}
if (temp -> exp > exp && (temp -> next -> exp < exp || temp -> next == NULL))
{
r = (struct node*)malloc (sizeof (struct node)) ;
r -> coeff = coeff;
r -> exp = exp ;
r -> next = temp -> next ;
temp -> next = r ;
return ;
}
temp = temp -> next ; /* go to next node */
}
r -> next = NULL ;
temp -> next = r ;
}
}
// Display Linked list
void show(struct node *node)
{
while(node->next != NULL)
{
printf("%dx^%d", node->coeff, node->exp);
node = node->next;
if(node->next != NULL)
printf(" + ");
}
}
// Driver program
int main()
{
struct node *poly1 = NULL, *poly2 = NULL, *poly = NULL;
// Create first list of 5x^2 + 4x^1 + 2x^0
create_node(5,2,&poly1);
create_node(4,1,&poly1);
create_node(2,0,&poly1);
// Create second list of 5x^1 + 5x^0
create_node(5,1,&poly2);
create_node(5,0,&poly2);
printf("1st Number: ");
show(poly1);
printf("\n2nd Number: ");
show(poly2);
poly = (struct node *)malloc(sizeof(struct node));
// Function multiply two polynomial numbers
polymul(poly1, poly2, poly);
// Display resultant List
printf("\nMultiplied polynomial: ");
show(poly);
return 0;
}
作为一个边注:声明'struct'自动使'struct'命名类型名称,你不需要重复'struct'字,而且,喜欢'new' /'''''''''malloc''''free''。 'malloc'不调用构造函数,'new'不需要强制转换(C中也没有'malloc')。 – crashmstr