[数据结构]多项式相加减(链表)

一元稀疏多项式计算器

基本功能:
1 输入并建立多项式
2 输出多项式
3 能够修改多项式(插入一个新的项,删除任意一项)
4 多项式A和B相加,建立多项式A+B
5 多项式A和B相减,建立多项式A-B

 

#include<stdio.h>
#include<malloc.h>
#include<conio.h>

typedef struct node{
int xi;
int zi;
struct node *next;
}Node;

extern int ListInsert(Node *&head,int i,int fg,int tag);
extern int ListDelete(Node *&head, int i);

Node *Creat()
{ //尾插法建立多项式链表
Node *head,*p,*pre;
int fg,tag;
head=(Node *)malloc(sizeof(Node));
head->next=NULL;
pre=head;
printf("请按照指数从小到大输入多项式并以“0 0”结束:/n");
scanf("%d%d",&fg,&tag);
while(fg)
{
p=(Node *)malloc(sizeof(Node));
p->xi=fg;
p->zi=tag;
p->next=pre->next;
pre->next=p;
pre=p;
scanf("%d%d",&fg,&tag);
}//while
if(fg==0&&tag==0)
printf("/n您的输入:/n");
return head;
}//--------------------------------------------------------------------Creat

void Addread(Node *head) //读取链表中的数据
{
Node *p=head->next;
while(p)
{
printf("%dX^%d+",p->xi,p->zi);
p=p->next;
}//while
printf("0 /n");
}//--------------------------------------------------------------------Addread

void Subread(Node *head) //读取链表中的数据
{
Node *p=head->next;
int a;
while(p)
{
printf("%dX^%d+",p->xi,p->zi);
a=p->xi;
a=0-a;
p->xi=a;
p=p->next;
}//while
printf("0 /n");
}//--------------------------------------------------------------------Subread

Node *CR(Node *head1,int i,int fg,int tag)
{ //插入元素
Node *p,*head,*p1;
head=(Node *)malloc(sizeof(Node));
p=head;
p->xi=fg;
p->zi=tag;
p->next=NULL;
p1=head1;
int j=0;
while(j<i-1&&p1->next!=NULL)
  {
     j++;
     p1=p1->next;
  }//while
if(p1->next==NULL)
p1->next=p;
else{
p->next=p1->next;
p1->next=p;
}//else
return head;
}//--------------------------------------------------------------------CR

Node *SC(Node *head1,int i)
{//删除元素
Node *p1,*q;
p1=head1;
int j=0;
while(j<i-1&&p1!=NULL)
{
      j++;
      p1=p1->next;
}//while
if(!p1==NULL)
   {
      q=p1->next;
      p1->next=q->next;
      free(q);
      return head1;
   }//if
else
return head1;
}//--------------------------------------------------------------------SC

Node *PD(Node *s){ 
       char b;
       int k,i,fg,tag;
       printf("需要修改多项式?(Y/N)/n");
       b=getch();
       if(b=='Y'||b=='y')
    { printf("1.在多项式内插入某项/n");
         printf("2.在多项式内删除某项/n");
         scanf("%d",&k);
         switch(k)
   {
            case 1:printf("插入第几项?/n");
            scanf("%d",&i);
            printf("出入插入项的系数和指数:/n");
            scanf("%d%d",&fg,&tag);
            CR(s,i,fg,tag);break;
            case 2:printf("删除第几项?/n");
            scanf("%d",&i);
            SC(s,i);break;
  }//switch
 }//if
    return s;
}//--------------------------------------------------------------------PD

Node *Add(Node *head1,Node *head2)
{ //多项式相加的实现
Node *p,*head,*p1,*p2;int sum;
head=(Node *)malloc(sizeof(Node));
p=head;
p1=head1->next;
p2=head2->next;
while(p1&&p2) //当两多项式都存在时
{
  if(p1->zi==p2->zi) //指数是否相等
  {
    sum=p1->xi+p2->xi;
    if(sum)
 {
      p1->xi=sum;
      p->next=p1;
      p=p1;
 }//if
    p1=p1->next;
    p2=p2->next;
  }//if
  else //不相等分两种情况
  {
    if(p1->zi<p2->zi)
 {
     p->next=p1;
     p=p1;
     p1=p1->next;
 }//if
    else
 {
     p->next=p2;
     p=p2;
     p2=p2->next;
 }//else
  }//else
}//while
if(p1) p->next=p1; //将1中剩余结点接到和链表中
else p->next=p2; //将2中剩余结点接到和链表中
return head;
}//--------------------------------------------------------------------Add

void main()
{ //主函数
  int a;
  int i,k;int fg,tag;
  char c;
jixu:
  printf("多项式运算:/n");
  printf("1.多项式相加/n");
  printf("2.多项式相减/n");
  scanf("%d",&a);
  switch(a)
  { case 1:Node *head,*p1,*p2,*s;
           p1=Creat();
           Addread(p1);
           s=p1;
           PD(s);
           printf("多项式1:");
     Addread(p1);
           p2=Creat();
           Addread(p2);
           s=p2;
           PD(s);
           printf("/n多项式2:");
     Addread(p2);
           head=Add(p1,p2);
           printf("/n相加后为:/n");
           Addread(head);
       break;
    case 2:Node *head1,*p3,*p4,*s1;
           p3=Creat();
           Addread(p3);
           s1=p3;
           PD(s1);
     printf("多项式1:");
     Addread(p3);
           p4=Creat();
           Addread(p4);
           s1=p4;
           PD(s1);
           printf("/n多项式2:");
           Subread(p4);
           head=Add(p3,p4);
           printf("/n相减后为:/n");
           Addread(head);
     break;
}
  printf("/n是否继续?(Y/N)");
  c=getch();
  if(c=='Y'||c=='y')
  {  
   printf("/n");
   goto jixu;
  }
  else
  {
   printf("/n运算结束/n");
  }

}//--------------------------------------------------------------------END

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值