数据结构 C 多项式相加

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,其次画图跟踪,打印跟踪也很重要

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值