题目叙述:
结果:
思路:
这个题目读完本来想使用两个结构体数组,然后遍历操作,但是感觉如要这样的话在调整x幂次由大到小的时候会不太方便,时间复杂度较高。所以决定使用链表完成。
- 编写createLink函数建立两个带哨兵节点的链表。
- 编写multyLink函数实现两个多项式的乘法。函数中,新建哨兵结点作为结果链表的头节点。使用两层while循环分别遍历两个链表,每次malloc一个结点,存储乘的指数和系数。乘完一个就用q指针遍历一次head链表,若有相同指数的相加,相加后若为零,则删去该节点。否则将p指向结点加入。最后返回head结点。
- 编写addLink函数实现多项式加法,之前两个测试点一直不过也是这里出了问题。用两个指针遍历链表,把当前指数大的,新建结点放入结果链表。若相等指数,需要相加看系数,若系数为零,则跳过本次循环(我这里开始把continue放到了p1 p2指向各自next域的语句之前,这就导致出现死循环)正常应该是这样写:先改变各自next,再强制结束本次循环
- 最后编写printLink函数,注意出现0多项式的时候,直接输出0 0,然后return。否则在对链表遍历。
- 最后结束前对所有链表free掉,释放空间。这个应该也可以不用写,不过加上也是良好习惯。
以后在链表中使用continue时候,要注意看next是否被修改。否则会陷入死循环
源代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct Node
{
int index;//指数
int factor;//系数
struct Node*next;
}node;
node*createLink();
node*addLink(node*head1,node*head2);
node*multLink(node*head1,node*head2);
void freeLink(node*head);
void printLink(node*head);
int main()
{
node*head1=createLink();
node*head2=createLink();
node*p1,*p2;
p1=multLink(head1,head2);
printLink(p1);
freeLink(p1);
printf("\n");
p2=addLink(head1,head2);
printLink(p2);
freeLink(p2);
freeLink(head1);
freeLink(head2);
return 0;
}
node*createLink()
{
int n;
scanf("%d",&n);
node*head=(node*)malloc(sizeof(node));
node*tail=head;
tail->next=NULL;
if(n==0)
return head;
for(int i=0;i<n;i++)
{
node*p=(node*)malloc(sizeof(node));
scanf("%d",&p->factor);
scanf("%d",&p->index);
p->next=tail->next;
tail->next=p;
tail=tail->next;
}
return head;
}
node*addLink(node*head1,node*head2)
{
node*p1=head1->next;
node*p2=head2->next;
node*head=(node*)malloc(sizeof(node));
node*tail=head;
tail->next=NULL;
while(p1!=NULL&&p2!=NULL)
{
node*p=(node*)malloc(sizeof(node));
if(p1->index>p2->index)
{
p->index=p1->index;
p->factor=p1->factor;
p1=p1->next;
}
else if(p1->index<p2->index)
{
p->index=p2->index;
p->factor=p2->factor;
p2=p2->next;
}
else{
p->index=p1->index;
p->factor=p1->factor+p2->factor;
/////////////////////!!!!!先改指针再continue!!
p1=p1->next;
p2=p2->next;
if(p->factor==0)
continue;
}
p->next=tail->next;
tail->next=p;
tail=tail->next;
}
///////!!!!加法的时候还要注意对余项处理
while(p1!=NULL)
{
node*p=(node*)malloc(sizeof(node));
p->index=p1->index;
p->factor=p1->factor;
p1=p1->next;
p->next=tail->next;
tail->next=p;
tail=tail->next;
}
while(p2!=NULL)
{
node*p=(node*)malloc(sizeof(node));
p->index=p2->index;
p->factor=p2->factor;
p2=p2->next;
p->next=tail->next;
tail->next=p;
tail=tail->next;
}
return head;
}
node*multLink(node*head1,node*head2)
{
node*head=(node*)malloc(sizeof(node));
head->next=NULL;
node*q;
node*p1=head1->next;
node*p2=head2->next;
while(p1!=NULL)
{
p2=head2->next;
while(p2!=NULL)
{
node*p=(node*)malloc(sizeof(node));
p->factor=p1->factor*p2->factor;
p->index=p1->index+p2->index;
q=head;
while(q->next!=NULL&&q->next->index>p->index)
q=q->next;
if(q->next!=NULL&&q->next->index==p->index)
{
q->next->factor=p->factor+q->next->factor;
if(q->next->factor==0)
{
node*h=q->next;
q->next=q->next->next;
free(h);
}
}
//q->next->factor=p->factor+q->next->factor;
else
{
p->next=q->next;
q->next=p;
}
p2=p2->next;
}
p1=p1->next;
}
return head;
}
void printLink(node*head)
{
node*p=head->next;
if(p==NULL)
{
printf("0 0");
return;
}
else
{
while(p->next!=NULL)
{
printf("%d %d ",p->factor,p->index);
p=p->next;
}
printf("%d %d",p->factor,p->index);
}
}
void freeLink(node*head)
{
node*p=head;
while(p!=NULL)
{
node*q;
q=p;
p=p->next;
free(q);
}
}