使用c中的链表进行多项式乘法

时间:2013-08-10 13:25:24

标签: linked-list multiplication dev-c++ polynomial-math

我正在研究一个程序,使用c中的链表对多项式执行加法,减法,乘法和微分运算。 除乘法之外,其他操作正常工作。 这是代码

#include<stdio.h>
#include<malloc.h>
#include<conio.h>
struct link{
   int coeff;
   int pow;
   struct link *next;
   };
struct link *poly1=NULL,*poly2=NULL,*poly=NULL;
void create(struct link *node)
{
 char ch;
 do
 {
  printf("\n\nenter coeff:");
  scanf("%d",&node->coeff);
  printf("\nenter power:");
  scanf("%d",&node->pow);
  node->next=(struct link*)malloc(sizeof(struct link));
  node=node->next;
  node->next=NULL;
printf("\ncontinue(y/n):");
ch=getch();
}
while(ch=='y' || ch=='Y');
}
void show(struct link *node)
{
while(node->next!=NULL)
{

printf("%dx^%d",node->coeff,node->pow);
node=node->next;
if(node->next!=NULL)
printf(" + ");


}
}
void polyadd(struct link *poly1,struct link *poly2,struct link *poly)
{
 while(poly1->next &&  poly2->next)
 {
  if(poly1->pow>poly2->pow)
  {
   poly->pow=poly1->pow;
   poly->coeff=poly1->coeff;
   poly1=poly1->next;
   }
  else if(poly1->pow<poly2->pow)
  {
   poly->pow=poly2->pow;
   poly->coeff=poly2->coeff;
   poly2=poly2->next;
   }
  else
  {
   poly->pow=poly1->pow;
   poly->coeff=poly1->coeff+poly2->coeff;
   poly1=poly1->next;
   poly2=poly2->next;
   }
  poly->next=(struct link *)malloc(sizeof(struct link));
  poly=poly->next;
  poly->next=NULL;
 }
 while(poly1->next || poly2->next)
 {
  if(poly1->next)
  {
   poly->pow=poly1->pow;
   poly->coeff=poly1->coeff;
   poly1=poly1->next;
   }
  if(poly2->next)
  {
   poly->pow=poly2->pow;
   poly->coeff=poly2->coeff;
   poly2=poly2->next;
   }
   poly->next=(struct link *)malloc(sizeof(struct link));
   poly=poly->next;
   poly->next=NULL;
   }

}

void polysub(struct link *poly1,struct link *poly2,struct link *poly)
{
 while(poly1->next &&  poly2->next)
 {
  if(poly1->pow>poly2->pow)
  {
   poly->pow=poly1->pow;
   poly->coeff=poly1->coeff;
   poly1=poly1->next;
   }
  else if(poly1->pow<poly2->pow)
  {
   poly->pow=poly2->pow;
   poly->coeff=poly2->coeff;
   poly2=poly2->next;
   }
  else
  {
   poly->pow=poly1->pow;
   poly->coeff=poly1->coeff-poly2->coeff;
   poly1=poly1->next;
   poly2=poly2->next;
   }
  poly->next=(struct link *)malloc(sizeof(struct link));
  poly=poly->next;
  poly->next=NULL;
 }
 while(poly1->next || poly2->next)
 {
  if(poly1->next)
  {
   poly->pow=poly1->pow;
   poly->coeff=poly1->coeff;
   poly1=poly1->next;
   }
  if(poly2->next)
  {
   poly->pow=poly2->pow;
   poly->coeff=poly2->coeff;
   poly2=poly2->next;
   }
   poly->next=(struct link *)malloc(sizeof(struct link));
   poly=poly->next;
   poly->next=NULL;
   }

}

void polymul(struct link *n1, struct link *n2, struct link *n)
{
    struct link * n2beg=n2;

            while (n1) 
            {
                    struct link * temp=(struct link *)malloc(sizeof(struct link));
                    temp->next=NULL;    
                    n2=n2beg;
                    while (n2) 
                    {
                            temp->coeff = n1->coeff * n2->coeff;

                            temp->pow = n1->pow + n2->pow;

                            n2 = n2->next;
                            temp->next=(struct link *)malloc(sizeof(struct link));
                            temp=temp->next;
                            temp->next=NULL;

                    }

                    polyadd(temp,n,n);
                    n1 = n1->next;
                    free(temp);
            }

}

void diff(struct link* p1,struct link* p2)
{

while(p1->next!=NULL)
{
    p2->coeff=p1->coeff*p1->pow;
    p2->pow=p1->pow-1;
    p2->next=NULL;
    p2->next=(struct link *)malloc(sizeof(struct link));
   p2=p2->next;
   p2->next=NULL;
   p1=p1->next;
}

}
  main()
  {
  int op;
  char ch;
  do{
  poly1=(struct link *)malloc(sizeof(struct link));
  poly2=(struct link *)malloc(sizeof(struct link));
  poly=(struct link *)malloc(sizeof(struct link));
  printf("\n\nWhat do you want to do?\n1.Addition\n2.Subtraction
          \n3.Multiplication\n4.Differentiation\n0.Exit
          \nEnter your choice:");
  scanf("%d",&op);
  switch(op)
  {
        case 1:
            printf("\n\nenter 1st polynomial:");
            create(poly1);
            printf("\n\nenter 2nd polynomial:");
            create(poly2);
            printf("\n1st Polynomial:\t");
            show(poly1);
            printf("\n2nd Polynomial:\t");
            show(poly2);
            polyadd(poly1,poly2,poly);
            printf("\nAdded polynomial:\t");
            show(poly);
            break;
        case 2:
            printf("\n\nenter 1st polynomial:\t");
            create(poly1);
            printf("\n\nenter 2nd polynomial:\t");
            create(poly2);
            printf("\n\n1st Polynomial:\t");
            show(poly1);
            printf("\n\n2nd Polynomial:\t");
            show(poly2);
            polysub(poly1,poly2,poly);
            printf("\n\nSubtracted polynomial:\t");
            show(poly);
            break;  
        case 3:
            printf("\n\nenter 1st polynomial:");
            create(poly1);
            printf("\n\nenter 2nd polynomial:");
            create(poly2);
            printf("\n\n1st Polynomial:\t");
            show(poly1);
            printf("\n\n2nd Polynomial:\t");
            show(poly2);
            polymul(poly1,poly2,poly);
            printf("\n\nMultiplied polynomial:\t");
            show(poly);
            break;
        case 4:
            printf("\n\nenter polynomial:");
            create(poly1);
            printf("\n\nPolynomial:\t");
            show(poly1);
            diff(poly1,poly2);
            printf("\n\nDifferentiated Polynomial:\t");
            show(poly2);
            break;
        }

 /* printf("\n Want to continue? Y/N:");
  ch=getch();*/
  }
  while(op);

}

5 个答案:

答案 0 :(得分:0)

polyadd(temp,n,n)中使用的

polymul()无法使用n作为源多项式和和目标多项式。

重新设置polyadd()以处理指向相同多项式的参数,或重新调用polyadd()polymul()的调用以使用不同的多项式。建议第一个。

答案 1 :(得分:0)

我没有查看完整的代码,因为我在create()函数中发现了错误。请注意,您已将poly1作为参数传递给函数create()

这不正确,因为C跟随按值调用。只会传递poly1(仍然未初始化)的值并且*node存储该值,会发生什么。最好将poly1的地址作为参数传递,并使用指向指针的函数在函数中捕获该值。

答案 2 :(得分:0)

#include<stdio.h>
#include <conio.h>
struct node
{
    int c,e;
    struct node *link;
}*start1=NULL,*start2=NULL,*start3=NULL,*temp1,*temp2,*temp3,*new_node;
int delete_dup(int h)
{
    struct node *cr,*prev,*run,*tmp;

    cr = start3->link;
    prev = start3;

    while(cr != NULL){

        run = start3;

        while(run != cr)
        {
             if(run->e == cr->e)
            {
                run->c+=cr->c;
                tmp = cr;
                cr = cr->link;
                prev->link = cr;
                remove(tmp);h--;
                break;
            }

            run = run->link;
        }

        if(run == cr){
            cr = cr->link;
            prev = prev->link;
        }
    }
    return h;

}

void main()
{
    int n,m,i,j,k;
    puts("Enter the number of terms in first polynomial");
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        new_node=(struct node*)malloc(sizeof(struct node));
        new_node->link=NULL;
        puts("C=");
        scanf("%d",&new_node->c);
        puts("E=");
        scanf("%d",&new_node->e);
        new_node->link=start1;
        start1=new_node;

        }
        puts("Enter the number of terms in first polynomial");
    scanf("%d",&m);
    for(i=0;i<m;i++)
    {
        new_node=(struct node*)malloc(sizeof(struct node));
        new_node->link=NULL;
        puts("C=");
        scanf("%d",&new_node->c);
        puts("E=");
        scanf("%d",&new_node->e);
        new_node->link=start2;
        start2=new_node;

        }
        temp1=start1;
        temp2=start2;
        i=0; j=0;
        while(i<m)
        {   
            j=0; temp1=start1;
            while(j<n)
            {
                new_node=(struct node*)malloc(sizeof(struct node));
                new_node->link=NULL;
                new_node->c=temp1->c*temp2->c;
                new_node->e=temp1->e+temp2->e;
                new_node->link=start3;
                start3=new_node;
                j++;
                temp1=temp1->link;
            }
            temp2=temp2->link;
            i++;
        }
        i=0;
        k=delete_dup(m*n);
        temp3=start3;
        while(i<k-1)

            {
                printf("(%dx^%d)+",temp3->c,temp3->e);
                temp3=temp3->link;
                i++;
            }
                printf("(%dx^%d)",temp3->c,temp3->e);

                    }

答案 3 :(得分:0)

testcol

答案 4 :(得分:0)

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct node {
    struct node *previous;
    int coef;
    int pow;
    struct node *next;
}poly;
poly *locate(int,poly *);
void display(poly *);
poly *mult(poly *,poly *,poly *);
void display2(poly *);
void main()
{
char ch;
poly *s1,*s2,*s3,*head1,*head2,*head3,*s4;;
s1=(poly *)malloc(sizeof(poly));
s1->previous=NULL;
head1=s1;
s2=(poly *)malloc(sizeof(poly));
s2->previous=NULL;
head2=s2;
head3=s3;
printf("Enter first polynomial :\n");
do{                                           //Input for polynomial-1
    printf("Enter co-efficient : ");
    scanf("%d",&s1->coef);
    printf("Enter exponent : ");
    scanf("%d",&s1->pow);
    printf("Do you want to enter more terms(Y/N) : ");
    scanf(" %c",&ch);
    if(ch=='Y'){
        s1->next=(poly*)malloc(sizeof(poly));
        s1->next->previous=s1;
        s1=s1->next;
    }
    else {
        s1->next=NULL;
        break;
    }
}while(1);
printf("Enter second polynomial : \n");
do{                                     //input for polynomial-2
    printf("Enter co-efficient : ");
    scanf("%d",&s2->coef);
    printf("Enter exponent : ");
    scanf("%d",&s2->pow);
    printf("Do you want to enter more terms(Y/N) : ");
    scanf(" %c",&ch);
    if(ch=='Y'){
        s2->next=(poly*)malloc(sizeof(poly));
        s2->next->previous=s2;
        s2=s2->next;
    }
    else {
        s2->next=NULL;
        break;
    }
}while(1);
printf("Entered polynomials are : \n");
display(s1);
printf("\n");
display(s2);
s3=NULL;
s4=mult(s1,s2,s3);
printf("Resultant Polynomial after multiplication :\n");
display(s4);
}
void display(poly *a)
{
while(a!=NULL)
{
    printf("%dx^%d",a->coef,a->pow);
    if(a->previous!=NULL)
        printf(" + ");
    a=a->previous;
}
}
poly *mult(poly *s1,poly *s2,poly *s3)
{
while(s1->previous!=NULL)
    s1=s1->previous;
while(s2->previous!=NULL)
    s2=s2->previous;
while(s1)
{
    while(s2->previous!=NULL)
        s2=s2->previous;
    while(1)
    {
        if(s2->next!=NULL)
        {   
            poly *s4;
            if(s3==NULL)
            {
                s3=(poly *)malloc(sizeof(poly));
                s3->pow=s1->pow+s2->pow;
                s3->coef=s1->coef*s2->coef;
                s3->previous==NULL;
                s3->next==NULL;
            }
            else
            {
                s4=locate(s1->pow+s2->pow,s3);
                if(s4==NULL)
                {
                    s3->next=(poly *)malloc(sizeof(poly));
                    s3->next->previous=s3;
                    s3=s3->next;
                    s3->pow=s1->pow+s2->pow;
                    s3->coef=s1->coef*s2->coef;
                    s3->next==NULL;
                }
                else
                {
                    s4->coef=(s4->coef)+(s1->coef*s2->coef);    
                }
            }
            s2=s2->next;
        }
        else
        {
            poly *s4;
            if(s3==NULL)
            {
                s3=(poly *)malloc(sizeof(poly));
                s3->pow=s1->pow+s2->pow;
                s3->coef=s1->coef*s2->coef;
                s3->previous==NULL;
                s3->next==NULL;
            }
            else{
                s4=locate(s1->pow+s2->pow,s3);
                if(s4==NULL)
                {
                    s3->next=(poly *)malloc(sizeof(poly));
                    s3->next->previous=s3;
                    s3=s3->next;
                    s3->pow=s1->pow+s2->pow;
                    s3->coef=s1->coef*s2->coef;
                    s3->next==NULL;
                }
                else
                {
                    s4->coef=s4->coef+s1->coef*s2->coef;
                }
            }
            break;
        };
    }s1=s1->next;
}return s3;

}
poly *locate(int exp,poly *s3)
{
if(s3==NULL)
{
    return NULL;
}
else if(s3->pow==exp)
{
    return s3;
}
else{
    return locate(exp,s3->previous);
}
}
我考虑了第一项多项式的第一项,并与第二项多项式的所有项相乘,从而创建了多项式的主链接列表。作为下一段代码,我考虑了第一个多项式的下一项,然后在相乘的多项式中相乘并搜索相同的索引,然后将结果相加。如果不存在,则在相乘的多项式中创建一个新节点。 快乐编码