一元稀疏多项式求解问题中如何实现乘法?

LZSES 2016-01-05 09:28:22
1. 一元稀疏多项式求解问题. 使用链式存储结构(带表头结点的单链表)和顺序存储结构存储一稀疏元多项式,主要功能有:输入并建立多项式、输出多项式、多项式a和b相加、多项式a和b相减、多项式a和b相乘等. 一元多项式的输入/输出形式为整数序列:n,c1,e1,c2,e2……cn,en,其中n是多项式的项数,ci,ei分别为第i项的系数和指数。序列按指数降序排列




代码如下:
#include<stdio.h>
#include<malloc.h>
typedef struct Polynomial{
int coef;
int expn;
struct Polynomial *next;
}*Polyn, Polynomial; //Polyn为结点指针类型
void Insert(Polyn p, Polyn h){
if (p->coef == 0) free(p); //系数为0的话释放结点
else{
Polyn q1, q2;
q1 = h; q2 = h->next;
while (q2&&p->expn<q2->expn){ //查找插入位置
q1 = q2;
q2 = q2->next;
}
if (q2&&p->expn == q2->expn){ //将指数相同相合并
q2->coef += p->coef;
free(p);
if (!q2->coef){ //系数为0的话释放结点
q1->next = q2->next;
free(q2);
}
}
else{ //指数为新时将结点插入
p->next = q2;
q1->next = p;
}
}
}//Insert
Polyn CreatePolyn(Polyn head, int m){//建立一个头指针为head、项数为m的一元多项式
int i;
Polyn p;
p = head = (Polyn)malloc(sizeof(struct Polynomial));
head->next = NULL;
for (i = 0; i<m; i++){
p = (Polyn)malloc(sizeof(struct Polynomial));//建立新结点以接收数据
printf("请输入第%d项的系数与指数:", i + 1);
scanf_s("%d %d", &p->coef, &p->expn);
Insert(p, head); //调用Insert函数插入结点
}
return head;
}//CreatePolyn
void DestroyPolyn(Polyn p){//销毁多项式p
Polyn q1, q2;
q1 = p->next;
q2 = q1->next;
while (q1->next){
free(q1);
q1 = q2;//指针后移
q2 = q2->next;
}
}
void PrintPolyn(Polyn P){
Polyn q = P->next;
int flag = 1;//项数计数器
if (!q) { //若多项式为空,输出0
putchar('0');
printf("\n");
return;
}
while (q){
if (q->coef>0 && flag != 1) putchar('+'); //系数大于0且不是第一项
if (q->coef != 1 && q->coef != -1){//系数非1或-1的普通情况
printf("%d", q->coef);
if (q->expn == 1) putchar('X');
else if (q->expn) printf("X^%d", q->expn);
}
else{
if (q->coef == 1){
if (!q->expn) putchar('1');
else if (q->expn == 1) putchar('X');
else printf("X^%d", q->expn);
}
if (q->coef == -1){
if (!q->expn) printf("-1");
else if (q->expn == 1) printf("-X");
else printf("-X^%d", q->expn);
}
}
q = q->next;
flag++;
}//while
printf("\n");
}//PrintPolyn
int compare(Polyn a, Polyn b){
if (a&&b){
if (!b || a->expn>b->expn) return 1;
else if (!a || a->expn<b->expn) return -1;
else return 0;
}
else if (!a&&b) return -1;//a多项式已空,但b多项式非空
else return 1;//b多项式已空,但a多项式非空
}//compare
Polyn AddPolyn(Polyn pa, Polyn pb){//求解并建立多项式a+b,返回其头指针
Polyn qa = pa->next;
Polyn qb = pb->next;
Polyn headc, hc, qc;
hc = (Polyn)malloc(sizeof(struct Polynomial));//建立头结点
hc->next = NULL;
headc = hc;
while (qa || qb){
qc = (Polyn)malloc(sizeof(struct Polynomial));
switch (compare(qa, qb)){
case 1:
{
qc->coef = qa->coef;
qc->expn = qa->expn;
qa = qa->next;
break;
}
case 0:
{
qc->coef = qa->coef + qb->coef;
qc->expn = qa->expn;
qa = qa->next;
qb = qb->next;
break;
}
case -1:
{
qc->coef = qb->coef;
qc->expn = qb->expn;
qb = qb->next;
break;
}
}//switch
if (qc->coef != 0){
qc->next = hc->next;
hc->next = qc;
hc = qc;
}
else free(qc);//当相加系数为0时,释放该结点
}//while
return headc;
}//AddPolyn
Polyn SubtractPolyn(Polyn pa, Polyn pb){//求解并建立多项式a+b,返回其头指针
Polyn h = pb;
Polyn p = pb->next;
Polyn pd;
while (p){ //将pb的系数取反
p->coef *= -1;
p = p->next;
}
pd = AddPolyn(pa, h);
for (p = h->next; p; p = p->next) //恢复pb的系数
p->coef *= -1;
return pd;
}//SubtractPolyn

int main(){
int m, n, flag = 0;
Polyn pa = 0, pb = 0, pc,pd;//定义各式的头指针,pa与pb在使用前付初值NULL
printf("请输入a的项数:");
scanf_s("%d", &m);
pa = CreatePolyn(pa, m);//建立多项式a
printf("请输入b的项数:");
scanf_s("%d", &n);
pb = CreatePolyn(pb, n);//建立多项式a
//输出菜单
printf("**********************************************\n");
printf("操作提示:\n\t1.输出多项式a和b\n\t2.建立多项式a+b\n\t3.建立多项式a-b\n");
printf("\t4.退出\n**********************************************\n");
for (;; flag = 0){
printf("执行操作:");
scanf_s("%d", &flag);
if (flag == 1){
printf("多项式a:"); PrintPolyn(pa);
printf("多项式b:"); PrintPolyn(pb); continue;
}
if (flag == 2){
pc = AddPolyn(pa, pb);
printf("多项式a+b:"); PrintPolyn(pc);
DestroyPolyn(pc); continue;
}
if (flag == 3){
pd = SubtractPolyn(pa, pb);
printf("多项式a-b:"); PrintPolyn(pd);
DestroyPolyn(pd); continue;
}
if (flag == 4) break;
if (flag<1 || flag>4) printf("Error!!!\n"); continue;
}//for
DestroyPolyn(pa);
DestroyPolyn(pb);
return 0;
}


已实现加法与减法,求助在这个代码的基础上实现乘法功能
...全文
323 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-01-06
  • 打赏
  • 举报
回复
仅供参考:
//链表实现一元多项式的加法减法乘法
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
    float coef;   //系数
    int expn;     //指数
    struct node *next;
}
PolyNode;      //多项式节点 polynomial node
typedef PolyNode* Polynomial;
Polynomial createPolynomial() {  //创建多项式
    PolyNode *p, *q, *head = (PolyNode *)malloc(sizeof(PolyNode));   //头节点
    head->next = NULL;
    float coef;
    int expn;
    printf("输入该多项式每一项的系数和指数,每项一行,输入0 0结束!\n");
    while (scanf("%f %d", &coef, &expn) && coef) {   // 默认,按指数递减排列
        if (head->next) {
            p = head;
            while (p->next && expn < p->next->expn)
                p = p->next;
            if (p->next) {
                if (expn == p->next->expn) { //有相同指数的直接把系数加到原多项式
                    p->next->coef += coef;
                    if (p->next->coef > -0.000001 && p->next->coef < 0.000001) { //若是相加后系数为0,则舍弃该节点
                        q = p->next;
                        p->next = q->next;
                        free(q);
                    }
                } else {
                    q = (PolyNode*)malloc(sizeof(PolyNode));
                    q->coef = coef;
                    q->expn = expn;
                    q->next = p->next;
                    p->next = q;
                }
            } else {
                p->next = (PolyNode*)malloc(sizeof(PolyNode));
                p = p->next;
                p->coef = coef;
                p->expn = expn;
                p->next = NULL;
            }
        } else {
            head->next = (PolyNode*)malloc(sizeof(PolyNode));
            head->next->coef = coef;
            head->next->expn = expn;
            head->next->next = NULL;
        }
    }
    return head;
}
Polynomial multiply(Polynomial poly, float coef, int expn) {  //多项式与指定单项式相乘,该单项式为 coefx^expn
    PolyNode *p, *q, *Poly = (PolyNode*)malloc(sizeof(PolyNode));
    p = Poly;
    q = poly->next;
    while (q) {
        p->next = (PolyNode*)malloc(sizeof(PolyNode));
        p = p->next;
        p->coef = (q->coef*coef);
        p->expn = (q->expn + expn);
        q = q->next;
    }
    p->next = NULL;
    return Poly;
}
void add(Polynomial poly1, Polynomial poly2) {  //把 poly2 加到 poly1 上
    PolyNode *p, *q, *r;
    r = poly1;
    p = poly1->next;  //指向第一个节点
    q = poly2->next;
    poly2->next = NULL;
    while (p && q) {
        if (p->expn > q->expn) {
            r->next = p;
            p = p->next;
            r = r->next;
        } else if (p->expn < q->expn) {
            r->next = q;
            q = q->next;
            r = r->next;
        } else {
            PolyNode *t;
            p->coef += q->coef;
            if (!(p->coef > -0.000001 && p->coef < 0.000001)) //系数不为0
            {
                r->next = p;
                r = r->next;
                p = p->next;
            } else {
                t = p;
                p = p->next;
                free(t);
            }
            t = q;
            q = q->next;
            free(t);
        }
    }
    if (p)
        r->next = p;
    if (q)
        r->next = q;
}
Polynomial polySubtract(Polynomial poly1, Polynomial poly2) {  //多项式减法 poly1-poly2形成一个新的多项式
    //把poly2的系数取相反数,形成一个新的多项式
    Polynomial poly = (PolyNode*)malloc(sizeof(PolyNode)); //构造头节点
    PolyNode *p, *q;
    p = poly;
    q = poly2->next;
    while (q) {
        p->next = (PolyNode*)malloc(sizeof(PolyNode));
        p = p->next;
        p->coef = -(q->coef);  //系数取反
        p->expn = q->expn;
        q = q->next;
    }
    p->next = NULL;
    add(poly, poly1);  //利用加法
    return poly;
}
Polynomial polyAdd(Polynomial poly1, Polynomial poly2) { //多项式相加 poly1+poly2形成一个新的多项式
    Polynomial poly = (PolyNode*)malloc(sizeof(PolyNode));  //和多项式的头节点
    poly->next = NULL;
    PolyNode *p, *q, *r;
    r = poly;
    p = poly1->next;
    q = poly2->next;
    while (p&&q) {
        if (p->expn > q->expn) {
            r->next = (PolyNode*)malloc(sizeof(PolyNode));
            r = r->next;
            r->coef = p->coef;
            r->expn = p->expn;
            p = p->next;
        } else if (p->expn < q->expn) {
            r->next = (PolyNode*)malloc(sizeof(PolyNode));
            r = r->next;
            r->coef = q->coef;
            r->expn = q->expn;
            q = q->next;
        } else {
            float m = p->coef + q->coef;
            if (!(m > -0.000001 && m < 0.000001)) {
                r->next = (PolyNode*)malloc(sizeof(PolyNode));
                r = r->next;
                r->coef = m;
                r->expn = p->expn;
            }
            q = q->next;
            p = p->next;
        }
    }
    while (p) {
        r->next = (PolyNode*)malloc(sizeof(PolyNode));
        r = r->next;
        r->coef = p->coef;
        r->expn = p->expn;
        p = p->next;
    }
    while (q) {
        r->next = (PolyNode*)malloc(sizeof(PolyNode));
        r = r->next;
        r->coef = q->coef;
        r->expn = q->expn;
        q = q->next;
    }
    r->next = NULL;
    return poly;
}
Polynomial polyMultiply(Polynomial poly1, Polynomial poly2) {  //多项式相乘
    Polynomial poly = (PolyNode*)malloc(sizeof(PolyNode));  //创建多项式和的头节点
    poly->next = NULL;
    PolyNode *p;
    p = poly2->next;
    while (p) {
        add(poly, multiply(poly1, p->coef, p->expn));
        p = p->next;
    }
    return poly;
}
void printPoly(Polynomial poly) {  //打印多项式
    if (poly && poly->next) {
        PolyNode *p = poly->next;  //p指向第一个节点
        while (p->next) {
            printf("%gx^%d", p->coef, p->expn);
            p = p->next;
            if (p && (p->coef > 0))
                printf("+");
        }
        if (p->expn == 0)
            printf("%g", p->coef);   //打印常数项
        else
            printf("%gx^%d", p->coef, p->expn);
        printf("\n");
    }
}
void freePoly(Polynomial poly) {  //释放内存
    if (poly && poly->next) {
        PolyNode *p, *q;
        p = poly;
        while (p) {
            q = p->next;
            free(p);
            p = q;
        }
    }
    poly = NULL;
}
int main() {
    printf("用链表实现多项式的加减法\n");
    Polynomial poly1, poly2, poly3;
    printf("创建多项式一\n");
    poly1 = createPolynomial();
    printf("多项式一:\n");
    printPoly(poly1);
    printf("创建多项式二\n");
    poly2 = createPolynomial();
    printf("多项式二:\n");
    printPoly(poly2);
    printf("两多项式相加,和为:\n");
    poly3 = polyAdd(poly1, poly2);
    printPoly(poly3);
    freePoly(poly3);
    printf("两个多项式相乘,积为:\n");
    poly3 = polyMultiply(poly1, poly2);
    printPoly(poly3);
    freePoly(poly3);
    printf("两多项式相减,差为:\n");
    poly3 = polySubtract(poly1, poly2);
    printPoly(poly3);
    freePoly(poly1);
    freePoly(poly2);
    freePoly(poly3);
    system("pause");
    return 0;
}

69,337

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧