多项式相加

#include<stdio.h>
#include<stdlib.h>
typedef struct node * polynomial;
struct node {
    int coef;        //系数    
    int index;        //指数
    polynomial next;
};
//读取函数
polynomial ReadPolynomial() {
    polynomial Rear,s,temp,p,cur;
    //Rear指向最后节点,s是建立链表时的节点,temp是为了free掉节点用的,p是头结点,cur是在冒泡排序时用的
    int N,c,i,tmp,tmp2,n;
    int j = 0;
    p = (polynomial)malloc(sizeof(struct node));//新建头结点
    p->next = NULL;
    Rear = p; //Rear指向最后一个节点,刚开始先指向头结点
    printf("输入多项式有几个项:\n");
    scanf("%d", &N);
    while (N--) {
        printf("分别输入系数和指数: ");
        scanf("%d %d", &c, &i);
        s = (polynomial)malloc(sizeof(struct node));//新建节点
        s->coef = c; //系数赋值
        s->index = i;//指数赋值
        s->next = NULL;
        Rear->next = s;//指向最后一个节点的Rear连新节点
        Rear = s;//Rear指向最后一个节点
    }
    temp = p;//temp指向头结点
    p = p->next;//头结点后移,现在p为第一个节点
    free(temp);//释放头结点
    
    n = CountList(p); //n是一个多项式有几项
    cur = p;//cur记录头结点
    //下边冒泡排序,将多项式从指数大到小排序
    for (i=1; i <n; i++) { //扫描n-1次
        cur = p;//下边for循环结束后,重新指向第一个节点
        for (j = 0; j < n-i; j++) {//交换次数
            if (cur->index < cur->next->index)//判断后交换赋值
            {
                tmp = cur->index;
                tmp2 = cur->coef;
                cur->index = cur->next->index;
                cur->coef = cur->next->coef;
                cur->next->index = tmp;
                cur->next->coef = tmp2;
            }
            cur = cur->next;//向后移一个
        }
        
    }
    return p;//返回排序后的链表的第一个节点地址
}

//比较大小
int CompareIndex(polynomial p1, polynomial p2) {
    if (p1->index > p2->index) {
        return 1;
    }
    else if (p1->index < p2->index) {
        return 2;
    }
    else if(p1->index == p2->index) {
        return 3;
    }
}
//读取多项式,尾插建立相加后的链表
void AttachPolynomial(int coef, int index, polynomial *pRear) {
    polynomial s;
    s = (polynomial)malloc(sizeof(struct node));
    s->coef = coef;
    s->index = index;
    s->next = NULL;
    (*pRear)->next = s; //pRear是指向最后的节点
    (*pRear) = s;
}
//相加
polynomial AddPolynomial(polynomial p1, polynomial p2) {
    polynomial P, Rear,temp;
    int sum;
    P = (polynomial)malloc(sizeof(struct node));//头结点
    Rear = P; //Rear指向最后一个结点
    /*p1和p2是根据读取的指数和系数建立的两个链表,两个链表已经从大到小排好序,如果p1的指数大于p2,
    那就将p1的那个节点连接到第三个节点,也就是相加后的节点,连完后p1=p1->next,向后移。其他同理。
    */
    while (p1&&p2) {
        switch (CompareIndex(p1, p2))//判断指数大小,根据CompareIndex函数返回的值执行switch
        {
        case 1:
            AttachPolynomial(p1->coef, p1->index, &Rear);//添加到相加链表的后边
            p1 = p1->next;//后移
            break;
        case 2:
            AttachPolynomial(p2->coef, p2->index, &Rear);
            p2 = p2->next;
            break;
        case 3:
            sum = p1->coef + p2->coef;
            AttachPolynomial(sum, p2->index, &Rear);
            p1 = p1->next;
            p2 = p2->next;
            break;
        }
    }
    for (; p1; p1 = p1->next) AttachPolynomial(p1->coef, p1->index, &Rear);//如果不为空,将剩下的节点连到相加节点
    for (; p2; p2 = p2->next) AttachPolynomial(p2->coef, p2->index, &Rear);
    Rear->next = NULL;
    temp = P;
    P = P->next;
    free(temp);//释放掉相加节点的头结点
    return P;

}
//计算链表长度
int CountList(polynomial p) {
    int i = 0;
    while (p != NULL) {
        i++;
        p = p->next;
    }
    return i;
}

//遍历输出
void PrintPoly(polynomial p) {
    int i,j;
    j = CountList(p);
    for (i = 1; i < j; i++) {
        printf("%dX^%d+", p->coef, p->index);
        p = p->next;
    }
    printf("%dX^%d", p->coef, p->index);
}


int main() {
    polynomial P1, P2,P3;
    P1 = ReadPolynomial();//读取并建立第一个链表
    P2 = ReadPolynomial();//读取并建立第二个链表
    P3=AddPolynomial(P1, P2);//读取前两个链表,建立第三个相加链表
    PrintPoly(P3);
    system("pause");
}

 

posted @ 2018-03-24 10:12  禹某  阅读(302)  评论(0编辑  收藏  举报