怎么用链表实现多项式的相加
谁能帮帮我编个单链表的程序, 实现多项式相加 A=7+3X+9X*X*X; B=8X+22X*X; (我不会写X的次方,分开写了,希望能理解)这不是作业贴,我刚刚开始学数据库(C),希望能有人帮我。
程序代码:#include<stdio.h>
#include<malloc.h>
typedef struct linklist
{
int coef;//系数
int exp; //指数
struct linklist *next;
}nodelink;
nodelink *create()//创建单链表
{
nodelink *head,*s,*t;
int c,e;
head=(nodelink *)malloc(sizeof(nodelink));//哨兵头结点
head->next=NULL;
t=head;//始终指向单链表的尾部
printf("请输入c和e的值,当系数e等于-1为结束条件:\n");
scanf("%d%d",&c,&e);
while(e!=-1)
{
s=(nodelink *)malloc(sizeof(nodelink));
s->coef=c;
s->exp=e;
s->next=NULL;
t->next=s;
t=s;
printf("请继续输入c和e的值,当系数e等于-1为结束条件:\n");
scanf("%d%d",&c,&e);
}
return head;
}
void printhead(nodelink *head)//输出连表数据
{
nodelink *phead;
phead=head->next;//指向第一个元素结点
int pcount=1;//结点计数器
while(phead!=NULL)
{
printf("第%d个结点的系数和指数分别为:",pcount);
printf("%2d%4d\n",phead->coef,phead->exp);
phead=phead->next;
pcount++;
}
printf("\n");
}
nodelink *ADD(nodelink *heada,nodelink *headb)//实现多项式相加
{
nodelink *p,*q,*prea,*preb,*temp;
int sum;
p=heada->next;//分别使p和q指向第一个元素结点
q=headb->next;
prea=heada;
free(headb);//释放headb链表的头结点
while(p!=NULL&&q!=NULL)
{
if(p->exp<q->exp)
{
prea=p;
p=p->next;
}
else if(p->exp==q->exp)
{
sum=p->coef+q->coef;
if(sum!=0)
{
p->coef=sum;
preb=q;
prea=p;
p=p->next;
q=q->next;
free(preb);
}
else//如果和为零
{
temp=p;
p=p->next;
prea->next=p;
free(temp);
preb=q;
q=q->next;
free(preb);
}
}
else //若p->exp大于q->exp
{
preb=q;
q=q->next;
preb->next=p;
prea->next=preb;
prea=prea->next;
}
}
if(q!=NULL)
prea->next=q;
return heada;
}
void main()
{
nodelink *heada,*headb,*headc;
heada=create();
printhead(heada);
headb=create();
printhead(headb);
headc=ADD(heada,headb);
printf("相加后的的链表为:\n");
printhead(headc);
}
程序代码:#include<stdio.h>
#include<malloc.h>
#include<conio.h>
typedef struct node{
int xi;
int zi;
struct node *next;
}Node;
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);
}
if(fg==0&&tag==0)
printf("\n输入结束:\n");
return head;
}
void Read(Node *head) //读取链表中的数据
{
Node *p=head->next;
while(p)
{
printf("%dX~%d->",p->xi,p->zi);
p=p->next;
}
printf("NULL\n");
}
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;
}
p1=p1->next;
p2=p2->next;
}
else //不相等分两种情况
{
if(p1->zi<p2->zi)
{ //分别怎么处理
p->next=p1;
p=p1;
p1=p1->next;
}
else
{
p->next=p2;
p=p2;
p2=p2->next;
}
}
}
if(p1) p->next=p1; //将1中剩余结点接到和链表中 因为最终只剩下一段链表多项式,只需要将
else p->next=p2; //将2中剩余结点接到和链表中 这段链的链头接到目标链表就可以了
return head;
}
void main()
{ //主函数
Node *head,*p1,*p2;
p1=Creat();
Read(p1);
p2=Creat();
Read(p2);
head=Add(p1,p2);
printf("相加后为:\n");
Read(head);
getch();
}
这个方法不是我做的!上一个是我的