程序的大体框架是:
设计数据结构:多项式的表示。可以用数组和链表。数组需事先确定数组大小,链表则对动态操作比较有利。
读多项式:这里需要设计一个attach函数,是用来将新的结点插入链尾的。
加法实现:多项式相加其实就是比较指数,相同则合并同类项,不同则直接插入到结果链表。
乘法实现:乘法实现比较复杂。大致的思路就是其中一个多项式的每一项与另一个多项式的每一项相乘。可以先将p1的第一项与p2的各项相乘得到一个初始的p,然后再双重循环P1 p2,系数相乘指数相加,再插入到初始链表的适当位置。由于原来的链表是按指数递减排列的,只要比较指数大小就可以找到适当的插入位置的。当然其中还有很多细节问题需注意。
多项式输出:输出用循环,链表指针依次后移就行。
链表加法算法:
给定两个多项式的链表表示,我们可以设计一个算法来实现它们的加法运算,并返回一个新的多项式的链表表示。
算法的基本思想是:
1.创建一个空的结果链表,并初始化一个尾指针来指向它。
2.同时遍历两个输入链表,比较当前节点的指数,并根据以下规则进行操作:
如果两个节点的指数相等,则将它们的系数相加,并创建一个新节点存储结果。如果结果不为零,则将新节点插入到结果链表的尾部,并更新尾指针。然后将两个输入链表的当前节点都后移一位。
如果第一个节点的指数大于第二个节点的指数,则将第一个节点复制并插入到结果链表的尾部,并更新尾指针。然后将第一个输入链表的当前节点后移一位。
如果第二个节点的指数大于第一个节点的指数,则将第二个节点复制并插入到结果链表的尾部,并更新尾指针。然后将第二个输入链表的当前节点后移一位。
3.当两个输入链表中有一个遍历完毕时,将另一个未遍历完毕的链表剩余部分复制并插入到结果链表的尾部,并更新尾指针。
返回结果链表的头指针。
临摹代码:
1.构建
typedef struct LinkNode{
int coefficient;
int exponent;
struct LinkNode *next;
}*LinkList,*NodePtr;
ᝰꫛꫀꪝ 17:46:16
初始化
2.初始化
LinkList initLinkList(){
LinkList tempHeader=(LinkList)malloc(sizeof(struct LinkNode));
tempHeader->coefficient=0;
tempHeader->exponent=0;
tempHeader->next=NULL;
return tempHeader;
}
3.打印
void printList(LinkList paraHeader){
NodePtr p=paraHeader->next;
while(p!=NULL){
printf("%d * 10^%d +",p->coefficient,p->exponent);
p=p->next;
}
printf("\r\n");
}
void printNode(NodePtr paraPtr,char paraChar){
if(paraPtr==NULL){
printf("NULL\r\n");
} else{
printf("The element of %c is (%d * 10^%d)\r\n",paraChar,paraPtr->coefficient,paraPtr->exponent);
}
}
4.添加
void appendElement(LinkList paraHeader,int paraCoefficient,int paraExponent){
NodePtr p,q;
q=(NodePtr)malloc(sizeof(struct LinkNode));
q->coefficient=paraCoefficient;
q->exponent=paraExponent;
q->next=NULL;
p=paraHeader;
while(p->next!=NULL){
p=p->next;
}
p->next=q;
}
5.加法函数
void add(Listptr plist1,Listptr plist2){
Nodeptr p,q,