1.代码如下
#include <stdio.h>
#include <malloc.h>
/**
* identify the structure
*/
typedef struct LinkNode *LinkList;
typedef struct LinkNode *NodePtr;
struct LinkNode
{
int coefficient;
int exponent;
LinkList next;
};
/**
* initialize the list
*/
LinkList initLinkList()
{
LinkList tempHeader=(LinkList)malloc(sizeof(struct LinkNode));
tempHeader->coefficient=0;
tempHeader->exponent=0;
tempHeader->next=NULL;
return tempHeader;
}
/**
* print the list
*/
void printList(LinkList paraHeader)
{
LinkList p=paraHeader->next;
while(p)
{
printf("%d * x^%d + ",p->coefficient,p->exponent);
p=p->next;
}
printf("\r\n");
}
/**
* print one node
*/
void printNode(NodePtr paraPtr, char paraChar)
{
if(paraPtr==NULL)
{
printf("NULL\r\n");
}
else
{
printf("The element of %c is (%d * x^%d)\r\n",paraChar,paraPtr->coefficient,paraPtr->exponent);
}
}
/**
* link a node to the tail
*/
void appendElement(LinkList paraHeader, int paraCoefficient,int paraExponent)
{
NodePtr p,q;
// step 1.create a new node
q=(NodePtr)malloc(sizeof(struct LinkNode));
q->coefficient=paraCoefficient;
q->exponent=paraExponent;
q->next=NULL;
//step 2. search the tail
p=paraHeader;
while(p->next)
{
p=p->next;
}
//step 3. add the node to the tail
p->next=q;
}
/**
* polynomial addition
*/
void add(NodePtr paraList1, NodePtr paraList2)
{
NodePtr p,q,r,s;
//step1. point to the node with data
p=paraList1->next;
printNode(p,'p');
q=paraList2->next;
printNode(q,'q');
//the first pointer for inserting
r=paraList1;
printNode(r,'r');
free(paraList2);
while(p&&q)
{
if(p->exponent<q->exponent)
{
//link the node from the list1
printf("case 1\r\n");
r->next=p;
r=p;
printNode(r,'r');
p=p->next;
printNode(p,'p');
}
else if(p->exponent>q->exponent)
{
//link the node from the list2
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 is: %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("p=%p,q=%p\r\n",p,q);
}
printf("End of while.\r\n");
if(p==NULL)
{
r->next=q;
}
else
{
r->next=p;
}
printf("Addition ends.\r\n");
}
/**
* test the functions above
*/
void additionTest1()
{
//step1. initialize the list1
LinkList tempList1=initLinkList();
appendElement(tempList1,7,0);
appendElement(tempList1,3,1);
appendElement(tempList1,9,8);
appendElement(tempList1,5,17);
printList(tempList1);
//step2. initialize the list2
LinkList tempList2=initLinkList();
appendElement(tempList2,8,1);
appendElement(tempList2,22,7);
appendElement(tempList2,-9,8);
printList(tempList2);
//step3. add the list2 to the list1
add(tempList1,tempList2);
printf("The result is: ");
printList(tempList1);
printf("\r\n");
}
/**
* test the functions above
*/
void additionTest2()
{
//step1. initialize the list1
LinkList tempList1=initLinkList();
appendElement(tempList1,7,0);
appendElement(tempList1,3,1);
appendElement(tempList1,9,8);
appendElement(tempList1,5,17);
printList(tempList1);
//step2. initialize the list2
LinkList tempList2=initLinkList();
appendElement(tempList2,8,1);
appendElement(tempList2,22,7);
appendElement(tempList2,-9,10);
printList(tempList2);
//step3. add the list2 to the list1
add(tempList1,tempList2);
printf("The result is: ");
printList(tempList1);
printf("\r\n");
}
int main()
{
additionTest1();
additionTest2();
printf("Finish.\r\n");
return 0;
}
2.图示
3.代码说明
1)在进行appendElement函数时,让p=paraHeader ,需要判断p->next是否为NULL ,如果让p=paraHeader->next 或者让判断条件为p时 ,循环内条件不变,都会使出循环时p=NULL ,导致p->next语句出现问题,NULL是没有next的
2)在进行多项式加法时,一共有三种情况,p的指数大于q的指数,p的指数小于q的指数,p的指数等于q的指数其中,p的指数等于q的指数情况还需要判断系数是否为0的情况
3)在进行多项式加法时,让第二个链表的值加到第一个链表上面,并且及时用free()函数将部分节点删除可以节约空间
4.运行结果
7 * x^0 + 3 * x^1 + 9 * x^8 + 5 * x^17 +
8 * x^1 + 22 * x^7 + -9 * x^8 +
The element of p is (7 * x^0)
The element of q is (8 * x^1)
The element of r is (0 * x^0)
case 1
The element of r is (7 * x^0)
The element of p is (3 * x^1)
p=0000000000AA1420,q=0000000000AA6D20
case 3
The coefficient is: 11.
case 3.2
The element of r is (11 * x^1)
The element of p is (9 * x^8)
p=0000000000AA1440,q=0000000000AA6D40
case 2
The element of r is (22 * x^7)
The element of q is (-9 * x^8)
p=0000000000AA1440,q=0000000000AA6D60
case 3
The coefficient is: 0.
case 3.1
The element of p is (5 * x^17)
p=0000000000AA1460,q=0000000000000000
End of while.
Addition ends.
The result is: 7 * x^0 + 11 * x^1 + 22 * x^7 + 5 * x^17 +
7 * x^0 + 3 * x^1 + 9 * x^8 + 5 * x^17 +
8 * x^1 + 22 * x^7 + -9 * x^10 +
The element of p is (7 * x^0)
The element of q is (8 * x^1)
The element of r is (0 * x^0)
case 1
The element of r is (7 * x^0)
The element of p is (3 * x^1)
p=0000000000AA6D20,q=0000000000AA6DC0
case 3
The coefficient is: 11.
case 3.2
The element of r is (11 * x^1)
The element of p is (9 * x^8)
p=0000000000AA6D60,q=0000000000AA6DE0
case 2
The element of r is (22 * x^7)
The element of q is (-9 * x^10)
p=0000000000AA6D60,q=0000000000AA6E00
case 1
The element of r is (9 * x^8)
The element of p is (5 * x^17)
p=0000000000AA6D80,q=0000000000AA6E00
case 2
The element of r is (-9 * x^10)
NULL
p=0000000000AA6D80,q=0000000000000000
End of while.
Addition ends.
The result is: 7 * x^0 + 11 * x^1 + 22 * x^7 + 9 * x^8 + -9 * x^10 + 5 * x^17 +
Finish.
--------------------------------
Process exited after 0.1027 seconds with return value 0
请按任意键继续. . .