C语言 多项式计算 链表与栈的综合应用

本文介绍了一个使用C语言通过链表和栈实现多项式计算的程序,包括加、减、乘操作。程序首先读入多项式,然后利用栈进行计算,涉及链表节点定义、多项式运算函数的实现以及化简函数的细节。作者在编写过程中遇到了忘记设置链表指针为NULL的问题,并分享了调试经验。
摘要由CSDN通过智能技术生成

纪念一下,目前写过的最长的程序,比上次作业题airport还长(๑╹◡╹)ノ"""
现在写完了,回想一下也不难,比起难度还是繁琐多一点。
不过做程序员就是要细心啊,再繁琐也不能出错。
所以做完这个感觉自己离成为程序员又近了一步,撒花✿✿ヽ(°▽°)ノ✿

下面进入正题。

题目

写一个程序,功能如下:

输入下列一个指令,实现所描述的功能:
[ ? ] 读入一个多项式,这个多项式包含一个含x的单项式和一个常数项,常数项可以为0。
[ + ] 对栈中最上面的两个多项式做加法,并把结果再压入栈中。
[ - ] 对栈中最上面两个元素做减法,并把结果再压入栈中。
[ * ] 取出栈顶多项式,再输入一个多项式,做乘法,结果压入栈中。
[ = ] 展示栈顶元素。
[ q ] 退出程序。

运行示例:

①功能索引,我选择 [ ? ] —— 读入一个多项式。
②我在这里先输入了 x^2+3 。在这里插入图片描述
③ 再选择[ ? ] ,读入了 2x^2 。
在这里插入图片描述
④ 选择[ + ], 让刚读入的两个多项式做加法,把结果压入栈。
在这里插入图片描述
⑤ 选择[ * ],取出栈顶多项式,与我现在输入的 7x^3 做乘法,把结果压入栈。
在这里插入图片描述

代码&思路

一.从大方向上看,多项式的存储用链表。栈中元素类型是链表头指针。

多项式是由一个个单项式组成的,对于同一个未知数而言,单项式特征值只有倍数和指数。
所以链表结点定义如下:

struct xiang{
    double beishu;
    int degree;
    struct xiang * next;
};
二. 实现这个程序所示的功能,我用到了如下函数:

①打印索引,无需赘述。

void print_introductions();
void print_introduction_1();

②创建一个多项式。

struct xiang* creat_a_term();

③打印多项式。

void show_the_term(struct xiang *head);

④做运算的函数,返回值是储存计算结果多项式的链表的头指针。

struct xiang* add_two_terms(struct xiang *head1, struct xiang *head2);
struct xiang* minus_two_terms(struct xiang *head1, struct xiang *head2);
struct xiang* multiply_two_terms(struct xiang *head1, struct xiang *head2);

⑤用于化简多项式的函数,把指数相同的项合并。

void simplify(struct xiang *head);
三.函数具体讲解,以及我遇到的问题。

①创建一个多项式。
(因为题目中输入的多项式最多只有两项,所以这是个只有两个结点的链表)
注意不要忘记把后一个结点的next指针设置成NULL!
我一开始忘记了,结果后面调用show_the_term函数的时候程序会异常退出。找了好久才找到orz…

struct xiang * creat_a_term(){
   
    struct xiang *head=(struct xiang*)malloc(sizeof(struct xiang));
    printf("coefficient?");
    scanf("%lf",&head->beishu);
    printf("exponent?");
    scanf("%d",&head->degree);

    head->next=(struct xiang*)malloc(sizeof(struct xiang));

    printf("coefficient?");
    scanf("%lf",&head->next->beishu);

    if(head->next->beishu==0)
    {
   
        head->next->degree=0;
        head->next->next=NULL;	/**这个地方易出错**/
        return head;
    }
    else{
   
        printf("exponent?");
        scanf("%d",&head->next->degree);
        if((head->next->degree)!=0)
        {
   
            printf("Bad exponent: Polynomial terminates without its last term.\n")
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值