【问题标题】:Polynomial multiplication using linked list in c使用c中的链表进行多项式乘法
【发布时间】:2013-08-12 07:25:42
【问题描述】:

我正在开发一个程序,使用 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);

}

【问题讨论】:

  • (这篇文章中“社区”发生了什么变化?)除了polyadd() 之外,没有实现polysub(),而是为标量乘法执行polyscale()。 (在polyadd() 中,可以将将“未配对”节点复制到结果一次 - 从所呈现的八次开始。)

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


【解决方案1】:

polymul() 中使用的polyadd(temp,n,n) 无法处理将n 用作源多项式和目标多项式的总和。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:
      #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);
      
                          }
      

      【讨论】:

      • 请添加一些解释。 :)
      【解决方案4】:
      #include<stdio.h>
      #include<conio.h>
      #include<stdlib.h>
      struct node{
          int coef,pow;
          struct node *next;
      };
      
      struct node* create()
      {
          int c;
          struct node *new_node=NULL;
          struct node *head=NULL,*temp;
      
      
      
          do{
              new_node=(struct node*)malloc(sizeof(struct node));
              printf("\nEnter coef :");
              scanf("%d",&new_node->coef);
              printf("\nEnter power : ");
              scanf("%d",&new_node->pow);
      
              if(head==NULL)
              {
                  head=new_node;
                  head->next=NULL;
                  temp=new_node;
              }
              else
              {
                  temp->next=new_node;
                  temp=temp->next;
                  temp->next=NULL;
              }
              printf("\nDo you want to continue :");
              scanf("%d",&c);
          }while(c==1);
          return head;
      }
      
      void print(struct node *p)
      {
          while(p!=NULL)
          {
              printf("|%d|%d|->",p->coef,p->pow);
              p=p->next;
          }
      }
      
      struct node* create_new(int p, int q)
      {
      
          struct node *nn=(struct node*)malloc(sizeof(struct node));
          nn->coef=p;
          nn->pow=q;
          nn->next=NULL;
          return nn;
      }
      struct node* add(struct node *poly1,struct node *poly2)
      {
          struct node *tempadd,*temp;
          struct node *temp1=poly1;
          struct node *temp2=poly2,*head=NULL;
          while(temp1!=NULL && temp2!=NULL)
          {   
              if(temp1->pow==temp2->pow)
              {
                  tempadd=create_new(temp1->coef+temp2->coef,temp2->pow);
                  temp1=temp1->next;
                  temp2=temp2->next;
              }
              else if(temp1->pow<temp2->pow)
              {
                  tempadd=create_new(temp2->coef,temp2->pow);
                  temp2=temp2->next;
              }
              else
              {
                  tempadd=create_new(temp1->coef,temp1->pow);
                  temp1=temp1->next;
              }
              if(head==NULL)
              {
                  head=tempadd;
                  temp=head;
              }
              else
              {
                  temp->next=tempadd;
                  temp=temp->next;
              }
      
          }
          if(temp1!=NULL)
          {
              while(temp1!=NULL)
              {
                  tempadd=create_new(temp1->coef,temp1->pow);
                  temp1=temp1->next;
                  temp->next=tempadd;
                  temp=temp->next;
              }
          }
          else if(temp2!=NULL)
          {
              while(temp2!=NULL)
              {
                  tempadd=create_new(temp2->coef,temp2->pow);
                  temp2=temp2->next;
                  temp->next=tempadd;
                  temp=temp->next;
              }
          }
      
          return head;
      }
      
      void main()
      {
          struct node *head1,*head2,*head3;
          head1=create();
          print(head1);
          head2=create();
          print(head1);
          printf("\n");
          print(head2);
          printf("\n");
          head3=add(head1,head2);
          printf("\n\nResult : ");
          print(head3);
          getch();
      }
      

      【讨论】:

      • 虽然此代码 sn-p 可能会提供一些有限的即时帮助,但 proper explanation 将通过说明为什么这是解决问题的好方法并使其更加完善,从而大大提高其长期价值对有其他类似问题的未来读者有用。请edit您的回答添加一些解释,包括您所做的假设。
      【解决方案5】:
      #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);
      }
      }
      

      我考虑了第一个多项式的第一项并与第二个多项式的所有项相乘,从而创建了一个相乘多项式的主链表。作为下一段代码,我考虑了第一个多项式的下一项,然后在乘法多项式中相乘并搜索相同的索引并将结果添加到它,如果它不存在,我在乘法多项式中创建了一个新节点。 快乐编码

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-26
        • 2015-08-22
        • 1970-01-01
        • 1970-01-01
        • 2019-05-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多