1.定义结构体
typedef struct LinkNode{
int coefficient;
int exponent;
struct LinkNode* next;
} *LinkList, *NodePtr;
2.初始化链表
LinkList initLinkList(){
LinkList tempHeader=(NodePtr)malloc(sizeof(struct LinkNode));
tempHeader->coefficient=0;
tempHeader->exponent=0;
tempHeader->next=NULL;
return tempHeader;
}// Of initLinkList
3.打印链表
void printList(LinkList paraHeader){
NodePtr p=paraHeader->next;
while(p!=NULL){
printf("%d * 10^%d + ",p->coefficient,p->exponent);
p=p->next;
};//Of while
printf("\r\n");
} //printList
4.打印结点(测试)
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);
}
}//printNode
5. 在表尾添加元素
void appendElement(LinkList paraHeader,int paraCoefficient,int paraExponent){
NodePtr p,q;
//Step 1.Construct a new node.
q=(NodePtr)malloc(sizeof(struct LinkNode));
q->coefficient=paraCoefficient;
q->exponent=paraExponent;
q->next=NULL;
//Step 2.Search to the tail.
p=paraHeader;
while(p->next!=NULL){
p=p->next;
}//Of while
//Step 3.Linking.
p->next=q;
}//Of appendElement
6.多项式相加
void add(LinkList paraList1,LinkList paraList2){
NodePtr p,q,r,s;
//Step 1. Search the position.
p=paraList1->next;
printNode(p,'p');
q=paraList2->next;
printNode(q,'q');
r=paraList1;// Previous pointer for inserting.
printNode(r,'r');
free(paraList2);// The second list is destroyed. 不毁坏也不会怎样?
while((p!=NULL) && (q!=NULL)){
if( p->exponent < q->exponent ){
//Link the current node of the first list.
printf("case 1\r\n");
r=p;
printNode(r,'r');
p=p->next;
printNode(p,'p');
}else if( p->exponent > q->exponent ){
//Link the current node of the second list.
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");
//Change the current node of the first list.
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;
//printNode(s,'s');
p=p->next;
printNode(p,'p');
//free(s);//老师为什么不free?
}else{
printf("case 3.2\r\n");
r=p;
printNode(r,'r');
p=p->next;
printNode(p,'p');
}//Of if
s=q;
q=q->next;
free(s);//如果不free会怎么样?
}//Of if
printf("p = %ld, q = %ld \r\n", p, q);
}//Of while
printf("End of while.\r\n");
if(p==NULL){
r->next=q;
}else{
r->next=p;
}//Of if
printf("Addition ends.\r\n");
}//Of add
7.多项式相加函数测试
/**
* Unit test.
*/
void additionTest(){
// Step 1. Initialize the first polynomial.
LinkList tempList1=initLinkList();
appendElement(tempList1,7,0);
appendElement(tempList1,3,1);
appendElement(tempList1,9,8);
appendElement(tempList1,5,17);
printList(tempList1);// Step 2. Initialize the second polynomial.
LinkList tempList2=initLinkList();
appendElement(tempList2,8,1);
appendElement(tempList2,22,7);
appendElement(tempList2,-9,8);
printList(tempList2);// Step 3. Add them to the first.
add(tempList1,tempList2);
printList(tempList1);
}//Of additionTest
8.函数入口
/**
* The entrance.
*/
void main(){
additionTest();
printf("Finish.\r\n");
}// Of main
图解多项式相乘:
Step 1:
tips:合适的细节注释,printf(""),有助于测试正确性和找到Bug,其次画图跟踪,打印跟踪也很重要