一元稀疏多项式计算器
基本功能:
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