ccccorgi304 2023-10-09 22:59 采纳率: 88.2%
浏览 16
已结题

用链表封装多项式,并且实现其数学运算,求个代码

任务描述 本关任务:用链表封装多项式,并且实现其数学运算。 相关知识 为了完成本关任务,你需要掌握:1.封装特定类型的单链表,2.如何遍历链表和逐步产生新链表 封装特定类型的单链表结点 单链表的不同,在于数据成员的不同,在理论课教学时,我们的封装为: typedef struct Node{ ElemType data; Node* next; }Node; 在实际应用时,我们需要将ElemType替换成实际需要的数据类型。 对于多项式链表来说,我们需要替换成一个项的系数和指数 typedef struct Node{ double coef; int exp; Node* next }Node; 封装多项式链表 为了方便在链表尾部插入元素,我们可以设置尾指针tail typedef struct { //定义多项式 Node* head, * tail; }Poly; 创建多项式链表 创建多项式链表,需要创建头结点,并且将头尾指针均指向头结点 Poly* create_poly() { Poly* poly = (Poly*)malloc(sizeof(Poly)); poly->head = (Node*)malloc(sizeof(Node));//带头结点的链表 poly->head->next = NULL; poly->tail = poly->head; return Poly; } 添加单项(链表结点) 无论是创建输入对象,还是运算结果,都需要能够在链表尾部添加项。为此,需要实现多项式链表的添加项的功能。 void add_node(Poly* poly, int coef, int exp) {//增加一项 Node* node = (Node*)malloc(sizeof(Node)); node->coef = coef; node->exp = exp; node->next = NULL; poly->tail->next = node; poly->tail = node; } 通过解析输入字符串,创建多项式(链表) 本项目要求输入多项式的字符串,所以需要逐个字符读取,分解为系数、指数、底、连接符号。 通过观察和题目描述,我们可以在读入底x的时候,完成一个项的创建 Poly* create_poly_by(char* s) {//通过多项式式字符串,创建多项式 Poly* poly = create_poly(); int coef = 1; char ch; while (ch = (s++)) { //处理表达式每个字符,可能是+-,数字,或者x或者^ if (ch >= '0' && ch <= '9') coef *= ch - '0'; else if (ch == '-')//系数为负,取反 coef = -1; else if (ch == '^') { ch = *(s++); add_node(poly, coef, ch - '0');//指数读完即加入多项式 coef = 1; } } return poly; } 输出多项式 void print_poly(Poly* poly) {//输出多项式 struct Node* p = poly->head->next; if (p == NULL) printf("None"); while (p) {//遍历输出每一项 if (p->coef > 0 && p != poly->head->next) printf("+");//非第一项,系数非负,则用+连接 printf("%.f", p->coef); if (p->exp) printf("x^%d", p->exp); p = p->next; } printf("\n"); } 完成多项式运算 Poly add(Poly* A, Poly* B) { //TODO:在这里完成多项式加法 return NULL; } Poly* sub(Poly* A, Poly* B) { //TODO:在这里完成多项式减法 return NULL; } Poly* mul(Poly* A, Poly* B) { //TODO:在这里完成多项式乘法 return NULL; } 处理输入输出 int main() { char sa[100], sb[100], op; scanf("%s\n%s\n%c", sa, sb, &op); Poly* A = create_poly_by(sa); Poly* B = create_poly_by(sb); Poly* C = NULL; if (op=='+') C=add(A,B); //TODO:调用减法、乘法 print_poly(C); return 0; }

注意,指数升幂排序

  • 写回答

11条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2023-10-09 23:08
    关注

    引自强大而免费的微信小程序:皆我百晓生。如有帮助,还望采纳。


    以下为封装多项式链表并实现数学运算的代码:

    #include <stdio.h>
    #include <stdlib.h>
    
    // 定义多项式链表的结点
    typedef struct Node {
        double coef; // 系数
        int exp; // 指数
        struct Node* next;
    } Node;
    
    // 定义多项式链表
    typedef struct {
        Node* head; // 头结点
        Node* tail; // 尾指针
    } Poly;
    
    // 创建多项式链表
    Poly* create_poly() {
        Poly* poly = (Poly*)malloc(sizeof(Poly));
        poly->head = (Node*)malloc(sizeof(Node));
        poly->head->next = NULL;
        poly->tail = poly->head;
        return poly;
    }
    
    // 添加项
    void add_node(Poly* poly, double coef, int exp) {
        Node* node = (Node*)malloc(sizeof(Node));
        node->coef = coef;
        node->exp = exp;
        node->next = NULL;
        poly->tail->next = node;
        poly->tail = node;
    }
    
    // 根据输入字符串创建多项式链表
    Poly* create_poly_by(char* s) {
        Poly* poly = create_poly();
        double coef = 1;
        char ch;
        while ((ch = *s++)) {
            if (ch >= '0' && ch <= '9')
                coef *= ch - '0';
            else if (ch == '-')
                coef = -1;
            else if (ch == '^') {
                ch = *s++;
                add_node(poly, coef, ch - '0');
                coef = 1;
            }
        }
        return poly;
    }
    
    // 输出多项式
    void print_poly(Poly* poly) {
        Node* p = poly->head->next;
        if (p == NULL)
            printf("None");
        while (p) {
            if (p->coef > 0 && p != poly->head->next)
                printf("+");
            printf("%.f", p->coef);
            if (p->exp)
                printf("x^%d", p->exp);
            p = p->next;
        }
        printf("\n");
    }
    
    // 多项式加法
    Poly* add(Poly* A, Poly* B) {
        Poly* C = create_poly();
        Node* p = A->head->next;
        Node* q = B->head->next;
        while (p && q) {
            if (p->exp < q->exp) {
                add_node(C, p->coef, p->exp);
                p = p->next;
            } else if (p->exp > q->exp) {
                add_node(C, q->coef, q->exp);
                q = q->next;
            } else {
                double sum = p->coef + q->coef;
                if (sum)
                    add_node(C, sum, p->exp);
                p = p->next;
                q = q->next;
            }
        }
        while (p) {
            add_node(C, p->coef, p->exp);
            p = p->next;
        }
        while (q) {
            add_node(C, q->coef, q->exp);
            q = q->next;
        }
        return C;
    }
    
    // 多项式减法
    Poly* sub(Poly* A, Poly* B) {
        Poly* C = create_poly();
        Node* p = A->head->next;
        Node* q = B->head->next;
        while (p && q) {
            if (p->exp < q->exp) {
                add_node(C, p->coef, p->exp);
                p = p->next;
            } else if (p->exp > q->exp) {
                add_node(C, -q->coef, q->exp);
                q = q->next;
            } else {
                double diff = p->coef - q->coef;
                if (diff)
                    add_node(C, diff, p->exp);
                p = p->next;
                q = q->next;
            }
        }
        while (p) {
            add_node(C, p->coef, p->exp);
            p = p->next;
        }
        while (q) {
            add_node(C, -q->coef, q->exp);
            q = q->next;
        }
        return C;
    }
    
    // 多项式乘法
    Poly* mul(Poly* A, Poly* B) {
        Poly* C = create_poly();
        Node* p = A->head->next;
        while (p) {
            Node* q = B->head->next;
            while (q) {
                double coef = p->coef * q->coef;
                int exp = p->exp + q->exp;
                add_node(C, coef, exp);
                q = q->next;
            }
            p = p->next;
        }
        return C;
    }
    
    int main() {
        char sa[100], sb[100], op;
        scanf("%s\n%s\n%c", sa, sb, &op);
        Poly* A = create_poly_by(sa);
        Poly* B = create_poly_by(sb);
        Poly* C = NULL;
        if (op == '+')
            C = add(A, B);
        else if (op == '-')
            C = sub(A, B);
        else if (op == '*')
            C = mul(A, B);
        print_poly(C);
        return 0;
    }
    

    注意事项:

    1. 代码中的注释为中文。
    2. 该代码实现了多项式的加法、减法和乘法,可以根据具体需求进行调用。
    3. 在考虑鲁棒性时,输入的多项式字符串需要保证合法。
    4. 添加了足够的注释以便理解,如需更详细解释请留言。
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(10条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 10月10日
  • 已采纳回答 10月10日
  • 修改了问题 10月10日
  • 修改了问题 10月10日
  • 展开全部

悬赏问题

  • ¥15 我想在WPF的Model Code中获取ViewModel Code中的一个参数
  • ¥15 arcgis处理土地利用道路 建筑 林地分类
  • ¥30 java 项目中同包中,无法在子文件中引用
  • ¥20 使用visual studio 工具用C++语音,调用openslsx库读取excel文件的sheet问题
  • ¥100 寻会做云闪付tn转h5支付链接的技术
  • ¥15 DockerSwarm跨节点无法访问问题
  • ¥15 使用dify通过OpenAI 的API keys添加OpenAI模型时报了“Connection Error”错误
  • ¥40 想找个软件,但我不知道怎么找到它,我甚至不知道有没有
  • ¥15 怎么把60秒的视频时长改成显示0秒?且视频内容没有任何变化的正常播放?目的是为了解决一些平台对视频时长的要求,最好有自动处理的工具!
  • ¥15 累加器设初值为00H