回 帖 发 新 帖 刷新版面

主题:求助一道关于一元多项式的设计

大哥大姐:
    小弟有一道题目关于一元多项式的,老师布置的课程设计,快交了,有点急,拜托。
题目要求:
   一元多项式计算要求:能够按照指数降序排列建立并输出多项式;能够完成两个多项式的相加。相减。相乘,并将结果输出 。
    谢谢各位了!!

回复列表 (共2个回复)

沙发

没看到链表排序前做的
////////////////////////////////////////////////////////////////////////////////
//
// 43. 44. 实现两个整系数一元多项式的加法与乘法。例如, 对于多项式
//     5*X^6+4*X^3-7*X^4+1 与多项式 50*X^2+4*X, 运算结果为:
//                   5*X^6-7*X^4+4*X^3+50*X^2+4*X+1。
//                   250*x^8+20*x^7-350*x^6+172*x^5+16*x^4+50*x^2+4*x
//
//     程序要求:键盘输入多项式的各项系数及指数,每项系数及指数为一组数据(系
//     数及指数之一可为零),以'0 0'结束一个多项式的输入,结果按降幂排列,同类
//     项要合并(指数最大不超过30)。
//     上例第一式的输入为:    5 6
//                             4 3
//                            -7 4
//                             1 0
//                             0 0
//     输出结果应为:5*x^6-7*x^4+4*x^3+50*x^2+4*x+1.
//                   250*x^8+20*x^7-350*x^6+172*x^5+16*x^4+50*x^2+4*x.
////////////////////////////////////////////////////////////////////////////////
#include "stdio.h"
#include "malloc.h"
#include "memory.h"
#include "process.h"
typedef struct
{
    int coe;
    int exp;
}elem;

typedef struct node
{
    elem data;
    node *next;
}node;

typedef struct link
{
    node *head, *tail;
    int length;
}link;

bool initial(link &l)
{
    if(!(l.head = (node *)malloc(sizeof(node))))
        return false;
    l.tail = l.head;
    l.length = 0;
    return true;
}

void makenode(link &l, int coe, int exp)
{
    l.tail->next = (node *)malloc(sizeof(node));
    l.tail = l.tail->next;
    l.tail->data.coe  = coe;
    l.tail->data.exp  = exp;
    l.tail->next = NULL;
    ++l.length;
}

void print(link l)
{
    node *p = l.head->next;
    char *s;
    if(!p)
        return;    
    while(p)
    {
        s = (p == l.head->next)? ""
            :((p->data.coe > 0)?" +":" ");
        if(p->data.coe == 1)
        {
            if(p->data.exp == 1)
                printf("%sx", s);
            else if(p->data.exp == 0)
                printf("%s%d", s, p->data.coe);
            else
                printf("%sx^%d", s, p->data.exp);            
        }
        else
        {
            if(p->data.exp == 1)
                printf("%s%d*x", s, p->data.coe);
            else if(p->data.exp == 0)
                printf("%s%d", s, p->data.coe);
            else
                printf("%s%d*x^%d", s, p->data.coe, p->data.exp);
        }

        p = p->next;
    }
    printf("\t length = %d\n", l.length);
}

void create(link &l, char *s)
{
    int coe, exp;
    printf("\ninput the coefficient and exponential of the %s polynomial:\n", s);
    scanf("%d %d", &coe, &exp);
    while(coe)
    {
        makenode(l, coe, exp);
        scanf("%d %d", &coe, &exp);
    }
    printf("the %s polynomial is :\n", s);
    print(l);
}

void sort(elem *a, int size)
{
    elem *p, *q, temp;
    for(p = a; p< a +size -1; p++)
        for(q = p; q < a +size; q++)
            if(q->exp > p->exp)
            {
                temp = *q;
                *q   = *p;
                *p   = temp;
            }
}

void combine(elem *a, int size)
{
    int i, j;
    for(i = 0; i < size; i = j)
    {
        for(j = i+1; a[j].exp == a[i].exp && j < size; j++)
        {
            a[i].coe += a[j].coe;
            a[j].coe =  0;
        }
    }
}

板凳


void clearlink(link &l)
{
    node *p = l.head->next, *temp;
    while(p)
    {
        temp = p->next;
        free(p);
        p    = temp;
    }
    l.length = 0;
    l.head->next = NULL;
    l.tail = l.head;
}

void tidy(link &l)
{
    int size = l.length, i;
    elem *a  = new elem[size];
    memset(a, 0, size*sizeof(elem));

    node *p = l.head->next;
    for(i = 0; p; i++, p = p->next)
    {
        a[i].coe = p->data.coe;
        a[i].exp = p->data.exp;
    }

    sort(a, size);
    combine(a, size);
    clearlink(l);

    for(i = 0; i < size; i++)
    {
        if(a[i].coe == 0)
            continue;
        makenode(l, a[i].coe, a[i].exp);
    }
}

void multiply(link la, link lb)
{
    node *p, *q;
    link lc;
    if(!initial(lc))
    {
        printf("Initial false...\n");
        exit(-1);
    }

    for(p = la.head->next; p; p = p->next)
    {
        for(q = lb.head->next; q; q = q->next)
            makenode(lc, p->data.coe *q->data.coe, p->data.exp +q->data.exp);
    }
    printf("\nthe multi-polynomial is :\n");
    tidy(lc);
    print(lc);
    clearlink(lc);
}

void merge(link &la, link &lb)
{
    node *p;
    link lc;
    if(!initial(lc))
    {
        printf("Initial false...\n");
        exit(-1);
    }

    for(p = la.head->next; p; p = p->next)
        makenode(lc, p->data.coe, p->data.exp);
    for(p = lb.head->next; p; p = p->next)
        makenode(lc, p->data.coe, p->data.exp);
    printf("\nthe merge-polynomial is :\n");
    tidy(lc);
    print(lc);
    clearlink(lc);
}

void main()
{
    link la, lb;
    if(!initial(la) || !initial(lb))
    {
        printf("Initial false...\n");
        exit(-1);
    }
    create(la, "first");
    create(lb, "second");
    merge(la, lb);
    multiply(la, lb);
}

减法没有,重载下加法的就可以了

我来回复

您尚未登录,请登录后再回复。点此登录或注册