链表多项式乘法
Posted
技术标签:
【中文标题】链表多项式乘法【英文标题】:Linked list polynomial multiplication 【发布时间】:2017-03-08 03:55:24 【问题描述】:我编写了一个程序,以单链表的形式将两个多项式相乘。我无法使用此代码打印输出。
我得到的输出是
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
/ @987654327 @ 超过malloc
/ free
。 malloc
不调用构造函数,new
不需要强制转换(C 中的 malloc
也不需要)。
【参考方案1】:
你应该在函数polymul
之前声明你的函数padd()
,或者你可以在顶部写一个函数原型,以便编译器知道函数padd
将在polymul
之后遇到。
对于第二个错误,您应该将 malloc
函数的输出类型转换为 struct node *
,因为 malloc 返回 void *
类型值。
只需将类型转换添加到代码中的 malloc
函数即可。
r = (struct node*)malloc ( sizeof ( struct node ) ) ;
链表中存在一些指针问题。我已经在 ideone 链接中修复了它们。
#include<bits/stdc++.h>
using namespace std;
// Node structure containing power and coefficient of variable
struct node
int coeff;
int exp;
struct node *next;
;
// Function to create new node
void create_node(int x, int y, struct node **temp)
struct node *r, *tmp=NULL ;
if(*temp == NULL) // If the list is NULL then add node at First position
r =(struct node*)malloc(sizeof(struct node));
r->coeff = x;
r->exp = y;
r->next = NULL;
*temp = r;
/*r->next = (struct node*)malloc(sizeof(struct node));
r = r->next;
r->next = NULL;*/ //Not needed
else
tmp = *temp;
while (tmp->next != NULL)
tmp = tmp -> next; //Travel to the end of linked list
r = (struct node*)malloc(sizeof(struct node));
r->coeff = x;
r->exp = y;
r->next = NULL;
tmp->next = r; //Add new node to the list
// Function Adding two polynomial numbers
/* adds a term to the polynomial in the descending order of the exponent */
void padd ( int coeff, int exp, struct node **s )
struct node *r, *temp = *s ;
struct node *tmp = *s;
/* if list is empty or if the node is to be inserted before the first node
*/
if ( temp == NULL || exp > ( temp ) -> exp )
r = (struct node*)malloc ( sizeof ( struct node ) ) ;
r -> coeff = coeff ;
r -> exp = exp ;
r -> next = temp ;
temp = r;
*s = r;
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;
else 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 ;
struct node * polymul ( struct node *poly1, struct node *poly2, struct node *poly3)
struct node *y1 ;
int coeff1;
int exp1 ;
struct node *poly = poly3;
y1 = poly2 ; /* point to the starting of the second linked list */
if ( poly1 == NULL && poly2 == NULL )
return NULL;
/* 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 */
return poly;
// Display Linked list
void show(struct node *node)
while(node != NULL) // if we use node->next != NULL while will break at the last node skipping it
printf("%dx^%d", node->coeff, node->exp);
if(node->next != NULL)
printf(" + ");
node = node->next;
// 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 add two polynomial numbers
poly = polymul(poly1, poly2, poly);
// Display resultant List
printf("\nAdded polynomial: ");
show(poly);
return 0;
Ideone Link
【讨论】:
它确实解决了我的错误。但是现在,我无法获得两个多项式相乘的所需输出。 @JaiPrakash 您的链接列表中有几个错误。你的ceate_node
函数错了,你的show
函数错了。您需要了解链表并自己调试代码。
我看不出我的 create_node () 函数和 show() 函数是如何出错的。我认为唯一的问题是与此代码混淆的指针。
@JaiPrakash 您创建了 2 个多项式 5x^2 + 4x^1 + 2x^0
和 5x^1 + 5x^0
,但显示功能仅打印第一个元素。您的 create node
没有将节点附加到列表中。此外,您的 show
函数不会打印列表的最后一个节点。首先,更正您无法正常工作的代码。
@JaiPrakash 现在检查代码。我已经修复了所有的错误。但是你在指针上犯了很多错误。了解指针,否则您将再次遇到错误。以上是关于链表多项式乘法的主要内容,如果未能解决你的问题,请参考以下文章