多项式就是单项式的加减法,对于单项式可以用一组数表示,例如2X^3,可以表示为(2,3)。我们可以使用单链表来进行多项式的合并操作。
一:首先我们先建立新的数据类型multi
typedef struct multi{
int coef;
int index;
struct multi *next;
}multi;
二:建立链表。我这里建立的为带有头结点的链表,这样方便之后的合并操作(关于建立的两种方法可以参考我的另一篇文章单链表的基础操作(头插法、尾插法、插入和删除)https://blog.csdn.net/weixin_43260290/article/details/82843347
struct multi *tailcreat(int a)
{
struct multi *head;
struct multi *p,*q;
int n = 0;
head = (struct multi*)malloc(sizeof(struct multi));
p = (struct multi*)malloc(sizeof(struct multi));
printf("请输入多项式%d配对的系数和指数:\n",a);
do{
q = (struct multi*)malloc(sizeof(struct multi));
scanf("%d%d",&q->coef,&q->index);
if(q->coef == 0)
break;
if(n == 0)
{
p->next = q;
head->next = q;
p = q;
n++;
}
else
{
p->next = q;
p = q;
}
}while(true);
p->next = NULL;
return(head);
}
三:链表的输出
void display(struct multi *head,int i)
{
printf("第%d个多项式为:\n",i);
while((head->next)!=NULL)
{
printf("%dx^%d+",(head->next)->coef,(head->next)->index);
head = head->next;
}
printf("\b \n"); //\b为光标后退一格,后退后再输出个空格就将多项式最后一个+号覆盖啦~
}
四:链表的合并
struct multi *combine(struct multi *head1,struct multi *head2)
{
struct multi *pa,*pb,*L,*p;
pa = head1->next;
pb = head2->next;
L = p = head1;
while(pa&&pb)
{
if(pa->index == pb->index)
{
if(pa->coef + pb->coef)
{
pa->coef = pa->coef + pb->coef;
p->next = pa;
p = pa;
pa = pa->next;
pb = pb->next;
}
else{
pa = pa->next;
pb = pb->next;
}
}
else if(pa->index > pb->index)
{
p->next = pb;
p = pb;
pb = pb->next;
}
else
{
p->next = pa;
p = pa;
pa = pa->next;
}
}
/*
while(pa)
p->next = pa;
while(pb)
p->next = pb;
*/ //永远无法跳出循环。我是智障叭!!!
if(pa == NULL)
{
p->next = pb;
}
else{
p->next = pa;
}
return(L);
}
期间谢谢机机的指教hhhh,大家共同进步!
下面是完整的代码~
#include<stdio.h>
#include<stdlib.h>
typedef struct multi{
int coef;
int index;
struct multi *next;
}multi;
struct multi *tailcreat(int a)
{
struct multi *head;
struct multi *p,*q;
int n = 0;
head = (struct multi*)malloc(sizeof(struct multi));
p = (struct multi*)malloc(sizeof(struct multi));
printf("请输入多项式%d配对的系数和指数:\n",a);
do{
q = (struct multi*)malloc(sizeof(struct multi));
scanf("%d%d",&q->coef,&q->index);
if(q->coef == 0)
break;
if(n == 0)
{
p->next = q;
head->next = q;
p = q;
n++;
}
else
{
p->next = q;
p = q;
}
}while(true);
p->next = NULL;
return(head);
}
void display(struct multi *head,int i)
{
printf("第%d个多项式为:\n",i);
while((head->next)!=NULL)
{
printf("%dx^%d+",(head->next)->coef,(head->next)->index);
head = head->next;
}
printf("\b \n"); //\b为光标后退一格,后退后再输出个空格就将多项式最后一个+号覆盖啦~
}
struct multi *combine(struct multi *head1,struct multi *head2)
{
struct multi *pa,*pb,*L,*p;
pa = head1->next;
pb = head2->next;
L = p = head1;
while(pa&&pb)
{
if(pa->index == pb->index)
{
if(pa->coef + pb->coef)
{
pa->coef = pa->coef + pb->coef;
p->next = pa;
p = pa;
pa = pa->next;
pb = pb->next;
}
else{
pa = pa->next;
pb = pb->next;
}
}
else if(pa->index > pb->index)
{
p->next = pb;
p = pb;
pb = pb->next;
}
else
{
p->next = pa;
p = pa;
pa = pa->next;
}
}
/*
while(pa)
p->next = pa;
while(pb)
p->next = pb;
*/ //永远无法跳出循环。我是智障叭!!!
if(pa == NULL)
{
p->next = pb;
}
else{
p->next = pa;
}
return(L);
}
int main()
{
struct multi *head,*head1,*head2;
head1 = tailcreat(1);
display(head1,1);
head2 = tailcreat(2);
display(head2,2);
head = combine(head1,head2);
display(head,3);
return 0;
}