写在前面:在我看来多项式的加法与前面学的单链表唯一的区别就是添加了合并两个单链表这一步,合并的过程中设置了三个变量,p,q,r,其中p,q分别代表了两个链表要比较的结点,r代表新链表的尾部,在一轮循环最后r->next指向新加入的结点,r的地址变新加入结点的地址,继续充当链表尾部。 比较指数时存在三种情况,总的规律是新链表优先合并指数较小的结点,当两个结点指数相同时,先合并,再链接,并释放空闲的空间。
另外,当链表1或2剩下多个结点时源代码貌似并不能保证剩下的结点全部接入到新链表后,所以
对这部分进行了修改
一.1.结点内包含的变量
typedef struct LinkNode{
int coefficient;
int exponent;
struct LinkNode *next;
}*LinkList,*NodePtr;
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");
}
4.测试结点
void printNode(NodePtr paraPtr,char paraChar)
{
if(paraPtr == NULL)
{
printf("NULL\r\n");
}
else
{
printf("The element of %c is (%d*10^%d)",paraChar,paraPtr->coefficient,paraPtr->exponent);
}
}
5. 尾部加入结点
void appendElement(LinkList paraHeader, int paracoefficient,int paraExponent)
{
NodePtr q,p;
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;
}
6.合并链表
void add(NodePtr paraList1,NodePtr paraList2)
{
NodePtr p,q,r,s;
p=paraList1->next;
printNode(p,'p');
q=paraList2->next;
printNode(q,'q');
r=paraList1;
printNode(r,'r');
free(paraList2);
while((p!=NULL)&&(q!= NULL))
{
if(p->exponent < q->exponent)
{
printf("case 1\r\n");
r = q;
printNode(r,'r');
p=p->next;
printNode(p,'p');
}
else if(p->exponent>q->exponent)
{
printf("case 2\r\n");
r->next = q;
r = q;
printNode(r,'r');
q=q->next;
printNode(q,'q');
}
else
{
printf("case 3\r\n");
p->coefficient = p->coefficient+q->coefficient;
printf("The coefficient if: %d.\r\n",p->coefficient);
if(p->coefficient==0)
{
printf("case 3.1\r\n");
s = p;
p = p->next;
printNode(p,'p');
free(s);
}
else
{
printf("case 3.2\r\n");
r=p;
printNode(r,'r');
p=p->next;
printNode(p,'p');
}
s=q;
q=q->next;
free(s);
}
}
printf("End of while\r\n");
if(p ==NULL)
{
while(q!=NULL)
{
r->next =q;
r=q;
q=q->next;
}
}
else
{
while(p!=NULL)
{
r->next = p;
r=p;
p=p->next;
}
}
}
6.测试
void additionTest()
{
LinkList tempList1=initLinkList();
appendElement(tempList1,6,0);
appendElement(tempList1,8,1);
appendElement(tempList1,9,6);
appendElement(tempList1,4,7);
printList(tempList1);
LinkList tempList2 = initLinkList();
appendElement(tempList2,8,1);
appendElement(tempList2,22,7);
appendElement(tempList2,-9,8);
printList(tempList2);
add(tempList1,tempList2);
printList(tempList1);
}
二.总代码,运行结果,图表说明
#include<stdio.h>
#include<malloc.h>
typedef struct LinkNode{
int coefficient;
int exponent;
struct LinkNode *next;
}*LinkList,*NodePtr;
LinkList initLinkList()
{
LinkList tempHeader = (LinkList)malloc(sizeof(struct LinkNode));
tempHeader->coefficient = 0;
tempHeader->exponent = 0;
tempHeader->next = NULL;
return tempHeader;
}
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)",paraChar,paraPtr->coefficient,paraPtr->exponent);
}
}
void appendElement(LinkList paraHeader, int paracoefficient,int paraExponent)
{
NodePtr q,p;
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;
}
void add(NodePtr paraList1,NodePtr paraList2)
{
NodePtr p,q,r,s;
p=paraList1->next;
printNode(p,'p');
q=paraList2->next;
printNode(q,'q');
r=paraList1;
printNode(r,'r');
free(paraList2);
while((p!=NULL)&&(q!= NULL))
{
if(p->exponent < q->exponent)
{
printf("case 1\r\n");
r = q;
printNode(r,'r');
p=p->next;
printNode(p,'p');
}
else if(p->exponent>q->exponent)
{
printf("case 2\r\n");
r->next = q;
r = q;
printNode(r,'r');
q=q->next;
printNode(q,'q');
}
else
{
printf("case 3\r\n");
p->coefficient = p->coefficient+q->coefficient;
printf("The coefficient if: %d.\r\n",p->coefficient);
if(p->coefficient==0)
{
printf("case 3.1\r\n");
s = p;
p = p->next;
printNode(p,'p');
free(s);
}
else
{
printf("case 3.2\r\n");
r=p;
printNode(r,'r');
p=p->next;
printNode(p,'p');
}
s=q;
q=q->next;
free(s);
}
}
printf("End of while\r\n");
if(p ==NULL)
{
while(q!=NULL)
{
r->next =q;
r=q;
q=q->next;
}
}
else
{
while(p!=NULL)
{
r->next = p;
r=p;
p=p->next;
}
}
}
void additionTest()
{
LinkList tempList1=initLinkList();
appendElement(tempList1,6,0);
appendElement(tempList1,8,1);
appendElement(tempList1,9,6);
appendElement(tempList1,4,7);
printList(tempList1);
LinkList tempList2 = initLinkList();
appendElement(tempList2,8,1);
appendElement(tempList2,22,7);
appendElement(tempList2,-9,8);
printList(tempList2);
add(tempList1,tempList2);
printList(tempList1);
}
void main()
{
additionTest();
printf("Finish.\r\n");
}
1.
2.
3.
4.
5.
6.
7.