【C 数据结构】 用单链表存储一元多项式,并实现两个多项式相加运算。

本次代码纯c语言,可以支持输入两个多项式的项式、系数、指数。

实验目的:
1 掌握单链表的基本工作原理;
2 实现链式存储下的两个多项式的相加。
实验步骤
1 定义链式存储的数据结构
2 完成多项式的初始化,即给多项式赋初值
3 完成多项式的输出
4 实现多项式的相加及结果输出。

/* 采用CLion的外部控制台运行*/
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include <windows.h>

#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE 100    //最大长度


// 单链表的定义
typedef struct PNode {
    int coef;           //系数
    int expn;           //指数
    struct PNode *next; //节点的指针域
} PNode, *Polynomial;

void greatePolyn(Polynomial p, int num);            // 链表的初始化
void printout(Polynomial p, char num[]);            // 打印多项式
Polynomial AddPolyn(Polynomial ha, Polynomial hb);  //多项式相加
void returnMenu();                                  // 返回主界面
int menu();

PNode L1, L2;


// 链表的初始化
void greatePolyn(Polynomial p, int num) {
    Polynomial s;
    Polynomial pre, q;
    int n;
    printf("请输入第%d个多项式的项数:", num);
    scanf("%d", &n);
    p->next = NULL;
    pre = p;
    // 依次输入n个非零项
    for (int i = 1; i <= n; ++i) {
        s = (Polynomial) malloc(sizeof(PNode));
        s->next = NULL;
        printf("输入系数与指数");
        scanf("%d%d", &s->coef, &s->expn);

        q = p->next;
        while (q && q->expn < s->expn) {
            //通过比较指数找到第一个大于输入项指数的项*q
            pre = q;
            q = q->next;
        }
        s->next = q; //将输入项插入*q和其前驱节点pre之间
        pre->next = s;
        pre = s;
    }
    printf("第%d个多项式输入结束\n\n", num);
}


// 打印多项式
void printout(Polynomial p, char num[]) {
    int n = 0;
    Polynomial t = p;
    printf("\n%s\n", num);
    while ((t = t->next)) {
        n++;
    }
    p = p->next;
    for (int i = 1; i < n; i++) {
        if (p->coef != 0 && p->expn == 0)
            printf("%d+", p->coef);
        else if (p->coef < 0) {
            printf("\b%dx^%d+", p->coef, p->expn);
        } else
            printf("%dx^%d+", p->coef, p->expn);
        p = p->next;
    }

    if (p->coef < 0) {
        printf("\b%dx^%d", p->coef, p->expn);
    } else
        printf("%dx^%d", p->coef, p->expn);

    printf("\n");
}


// 两个多项式相加
Polynomial AddPolyn(Polynomial ha, Polynomial hb) {
    int c;
    Polynomial pa = ha->next, pb = hb->next, s, tc, hc;//将两个指针指向两个链表
    hc = (Polynomial) malloc(sizeof(PNode));//创建个新链表
    hc->next = NULL;
    tc = hc;//指针指向新链表
    while (pa != NULL && pb != NULL) {
        if (pa->expn > pb->expn) {
            s = (Polynomial) malloc(sizeof(PNode));
            s->expn = pb->expn;
            s->coef = pb->coef;
            tc->next = s;
            tc = s;
            pb = pb->next;
        } else if (pa->expn < pb->expn) {
            s = (Polynomial) malloc(sizeof(PNode));
            s->expn = pa->expn;
            s->coef = pa->coef;
            tc->next = s;
            tc = s;
            pa = pa->next;
        } else//遇到相同的指数,开始运算

        {
            c = pa->coef + pb->coef;
            if (c != 0) {
                s = (Polynomial) malloc(sizeof(PNode));
                s->expn = pa->expn;
                s->coef = c;
                tc->next = s;
                tc = s;
            }//c=0,就是直接跳下去
            pa = pa->next;
            pb = pb->next;
        }
    }
    if (pb != NULL)pa = pb;
    while (pa != NULL) {
        s = (Polynomial) malloc(sizeof(PNode));
        s->expn = pa->expn;
        s->coef = pa->coef;
        tc->next = s;
        tc = s;
        pa = pa->next;
    }
    tc->next = NULL;
    return hc;
}

// 返回主界面
void returnMenu() {
    printf("\n\n是否返回主界面?(y/n)\n");
    getchar();
    if (getchar() == 'y') {
        system("cls");
        menu();
    }
}


int menu() {
    Polynomial L;
    printf("\t多项式相加运算\t\n");
    printf("\t     1.多项式的创建\t\n");
    printf("\t     2.多项式的打印 \t\n");
    printf("\t     3.多项式的相加 \t\n");
    printf("=================================\n");
    printf("请输入要执行的操作: ");
    int l;
    scanf("%d", &l);
    switch (l) {
        case 1:
            system("cls");
            printf("请输入分别输入两个多项式:\n\n");
            for (int i = 1; i < 3; i++) {
                if (i == 1)
                    greatePolyn(&L1, i);
                else
                    greatePolyn(&L2, i);
            }
            returnMenu();
            break;
        case 2:
            system("cls");
            for (int i = 1; i < 3; i++) {
                if (i == 1)
                    printout(&L1, "第1个多项式如下");
                else
                    printout(&L2, "第2个多项式如下");
            }
            returnMenu();
            break;
        case 3:
            system("cls");
            L = AddPolyn(&L1, &L2);
            printout(L, " 相加后的多项式如下");
            returnMenu();
            break;
        default:
            printf("[输入错误]请重新输入有效数字!\n");
            Sleep(1000);
            system("cls");
            menu();
            break;
    }
}

int main() {
    menu();
}

 多项式的创建

多项式的打印

 多项式的相加

 

  • 8
    点赞
  • 105
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,以下是一个基于单链表储存一元多项式C语言程序,并实现两个多项式相加运算: ```c #include <stdio.h> #include <stdlib.h> // 定义多项式结构体 typedef struct PolyNode { int coef; // 系数 int expon; // 指数 struct PolyNode* next; // 指向下一个结点的指针 } PolyNode, *Polynomial; // 创建一个空的多项式 Polynomial CreatePoly() { Polynomial P = (Polynomial)malloc(sizeof(PolyNode)); if (!P) { printf("内存分配失败!\n"); exit(1); } P->next = NULL; return P; } // 释放多项式所占用的内存 void DestroyPoly(Polynomial P) { Polynomial temp; while (P) { temp = P; P = P->next; free(temp); } } // 将项插入多项式 void InsertItem(Polynomial P, int coef, int expon) { Polynomial temp, pre, newnode; pre = P; temp = pre->next; while (temp && temp->expon > expon) { pre = temp; temp = pre->next; } if (temp && temp->expon == expon) { temp->coef += coef; if (temp->coef == 0) { pre->next = temp->next; free(temp); } } else { newnode = (Polynomial)malloc(sizeof(PolyNode)); if (!newnode) { printf("内存分配失败!\n"); exit(1); } newnode->coef = coef; newnode->expon = expon; newnode->next = temp; pre->next = newnode; } } // 读入多项式 Polynomial ReadPoly() { Polynomial P = CreatePoly(); int n, coef, expon; scanf("%d", &n); while (n--) { scanf("%d %d", &coef, &expon); InsertItem(P, coef, expon); } return P; } // 两个多项式的和 Polynomial AddPoly(Polynomial P1, Polynomial P2) { Polynomial P = CreatePoly(); Polynomial temp1 = P1->next, temp2 = P2->next; while (temp1 && temp2) { if (temp1->expon > temp2->expon) { InsertItem(P, temp1->coef, temp1->expon); temp1 = temp1->next; } else if (temp1->expon < temp2->expon) { InsertItem(P, temp2->coef, temp2->expon); temp2 = temp2->next; } else { InsertItem(P, temp1->coef + temp2->coef, temp1->expon); temp1 = temp1->next; temp2 = temp2->next; } } while (temp1) { InsertItem(P, temp1->coef, temp1->expon); temp1 = temp1->next; } while (temp2) { InsertItem(P, temp2->coef, temp2->expon); temp2 = temp2->next; } return P; } // 输出多项式 void PrintPoly(Polynomial P) { Polynomial temp = P->next; int flag = 0; // 标记是否为第一项 if (!temp) { printf("0 0\n"); return; } while (temp) { if (!flag) { flag = 1; } else { printf(" "); } printf("%d %d", temp->coef, temp->expon); temp = temp->next; } printf("\n"); } int main() { Polynomial P1, P2, P; P1 = ReadPoly(); P2 = ReadPoly(); P = AddPoly(P1, P2); PrintPoly(P); DestroyPoly(P1); DestroyPoly(P2); DestroyPoly(P); return 0; } ``` 上述程序中,我们定义了一个多项式结构体,并实现了创建一个空的多项式、将项插入多项式、读入多项式、释放多项式、两个多项式的和、输出多项式等基本操作。在主函数中,我们读入两个多项式,并通过AddPoly函数它们的和,最后输出结果并释放内存。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汐ya~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值