多项式加法

用链表来实现多项式加法。

代码如下:

#include 
#include 

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 * x^%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 * x^%d)\r\n",paraChar,paraPtr->coefficient,paraPtr->exponent);
    }
}

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;
}

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->exponentexponent){
            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){
           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;
           }
           s = q;
           q = q->next;
           printf("q is pointing to (%d,%d)\r\n",q->coefficient,q->exponent);
           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");
}
void additionTest1(){
	LinkList tempList1 = initLinkList();
	appendElement(tempList1, 7, 0);
	appendElement(tempList1, 3, 1);
	appendElement(tempList1, 9, 8);
	appendElement(tempList1, 5, 17);
	printList(tempList1);
	LinkList tempList2 = initLinkList();
	appendElement(tempList2, 8, 1);
	appendElement(tempList2, 22, 7);
	appendElement(tempList2, -9, 8);
	printList(tempList2);
	add(tempList1, tempList2);
	printf("The result is: ");
	printList(tempList1);
	printf("\r\n");
}
void additionTest2(){
	LinkList tempList1 = initLinkList();
	appendElement(tempList1, 7, 0);
	appendElement(tempList1, 3, 1);
	appendElement(tempList1, 9, 8);
	appendElement(tempList1, 5, 17);
	printList(tempList1);
	LinkList tempList2 = initLinkList();
	appendElement(tempList2, 8, 1);
	appendElement(tempList2, 22, 7);
	appendElement(tempList2, -9, 10);
	printList(tempList2);
	add(tempList1, tempList2);
	printf("The result is: ");
	printList(tempList1);
	printf("\r\n");
}
int main(){
	additionTest1();
	additionTest2();
	printf("Finish.\r\n");
	return 0;
}

结果如下:

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 = 00000000001E1430, q = 00000000001E14B0
case 3
The coefficient is: 11
case 3.2
The element of r is (11 * x^1)
q is pointing to (22,7)
p = 00000000001E1450, q = 00000000001E14D0
case 2
The element of r is (22 * x^7)
The element of q is (-9 * x^8)
p = 00000000001E1450, q = 00000000001E14F0
case 3
The coefficient is: 0
case 3.1
The element of p is (5 * x^17)

体会:

1.在加减过程中需要注意前面,所以需要一个指针来指示前面.

你可能感兴趣的:(算法)