Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >C中利用链表相乘多项式的算法

C中利用链表相乘多项式的算法
EN

Stack Overflow用户
提问于 2020-12-06 03:43:17
回答 1查看 121关注 0票数 0

你能在不增加任何新函数的情况下对我的两个多项式的乘法函数提供一点帮助吗?我的程序工作,但它只将P的所有元素与Q的第一个元素相乘,然后,我想把q的指针移到第二个元素,直到最后一个,但我不知道怎么做。这是乘法的函数:

代码语言:javascript
运行
AI代码解释
复制
void multiply(Position Z, Position P, Position Q) {
    P = P->next;
    Q = Q->next;

    while (P != NULL&&Q!=NULL) {
        Z->coeff = P->coeff * Q->coeff;
        Z->exp = P->exp + Q->exp;
        sortedInput(Z, Z->coeff , Z->exp);
        P = P->next;
        
        while(Q!= NULL) {
            Z->coeff = P->coeff * Q->coeff;
            Z->exp = P->exp + Q->exp;
            sortedInput(Z, Z->coeff , Z->exp);
            Q = Q->next;
        }
    }
    
}

整个代码:

代码语言:javascript
运行
AI代码解释
复制
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>

typedef struct polinom* Pozicija;

struct polinom {
    int koef;
    int exp;
    Pozicija next;
};

void citaj(Pozicija, char*);

void ispis(Pozicija);
void sortUnos(Pozicija, int, int);
void zbroji(Pozicija, Pozicija, Pozicija);
void pomnozi(Pozicija, Pozicija, Pozicija);

int main() {
    struct polinom P1, P2, Z, U;
    P1.next = NULL;
    P2.next = NULL;
    Z.next = NULL;
    U.next = NULL;

    citaj(&P1, "P1.txt");
    printf("Prvi polinom: ");
    ispis(&P1);

    citaj(&P2, "P2.txt");
    printf("Drugi polinom: ");
    ispis(&P2);
    
    printf("\nZbroj:");
    zbroji(&Z, &P1, &P2);
    ispis(&Z);

    printf("\nUmnozak: ");
    pomnozi(&U, &P1, &P2);
    ispis(&U);
}
void citaj(Pozicija P, char* ime) {
    FILE* dat;
    int k, e;

    Pozicija q = NULL;
    q = (Pozicija)malloc(sizeof(struct polinom));
    
    dat = fopen(ime, "r");
    if (dat == NULL)
        printf("Greska!\n");
    else {
        while (feof(dat) == 0) {
            fscanf(dat, "%d %d", &k, &e);
            
            sortUnos(P, k, e);
            q->koef = k;
            q->exp = e;
        }
    }
    fclose(dat);
}
void ispis(Pozicija P) {
    P = P->next;
    while (P != NULL)
    {
        printf("%dx^%d", P->koef, P->exp);
        P = P->next;
        if (P != NULL)
            printf("+");
    }
    printf("\n");
}

void sortUnos(Pozicija P, int k, int e) {
    Pozicija q;
    
    while (P->next != NULL && P->next->exp > e)
        P = P->next;
    q = (Pozicija)malloc(sizeof(struct polinom));

    q->exp = e;
    q->koef = k;

    q->next = P->next;
    P->next = q;
}
void zbroji(Pozicija Z, Pozicija P, Pozicija Q) {
    P = P->next;
    Q = Q->next;
    while (P != NULL && Q != NULL) {
        if (P->exp == Q->exp)
        {
            Z->koef = P->koef + Q->koef;
            Z->exp = P->exp;
            sortUnos(Z, Z->koef, Z->exp);
            P = P->next;
            Q = Q->next;
        }
        else if (P->exp < Q->exp) {
            Z->koef = Q->koef;
            Z->exp = Q->exp;
            sortUnos(Z, Z->koef, Z->exp);
            Q = Q->next;
        }
        else if (P->exp > Q->exp) {
            Z->koef = P->koef;
            Z->exp = P->exp;
            sortUnos(Z, Z->koef, Z->exp);
            P = P->next;
        }
        
        
    }
    if (P == NULL) {
        while (Q != NULL) {
            Z->koef = Q->koef;
            Z->exp = Q->exp;
            sortUnos(Z, Z->koef, Z->exp);
            Q = Q->next;
        }
    }
    else if (Q == NULL) {
        while (P != NULL)
        {
            Z->koef = P->koef;
            Z->exp = P->exp;
            sortUnos(Z, Z->koef, Z->exp);
            P = P->next;
        }
    }   
}
void pomnozi(Pozicija Z, Pozicija P, Pozicija Q) {
    P = P->next;
    Q = Q->next;

    while (P != NULL&&Q!=NULL) {
        Z->koef = P->koef * Q->koef;
        Z->exp = P->exp + Q->exp;
        sortUnos(Z, Z->koef, Z->exp);
        P = P->next;
        
        while(Q!= NULL) {
            Z->koef = P->koef * Q->koef;
            Z->exp = P->exp + Q->exp;
            sortUnos(Z, Z->koef, Z->exp);
            Q = Q->next;
        }
    }
    
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-06 04:26:29

这段代码有一些相当严重的问题。

  1. pomnozi在多个方面被打破了。外部循环首先将P的第一个成员乘以Q的第一个成员,然后立即推进P,这样就再也看不到第一个成员了。但是,您需要将Q.
  2. But的第一个成员乘以Q的所有成员,因此,只有在P的所有成员乘以P = P->next之后,才能推进P = P->next,如果在内环后将P = P->next移动到一个位置,则P的成员将被Q的第一个成员乘以两次。你根本不需要外乘。所有的工作都应该在内部循环中完成,
  3. 给出了P的一个成员,pomnozi的内环超过了Q的成员。一旦Q耗尽,代码应该返回,并将Q乘以P的下一个成员,但是它不能,因为Q现在是NULL,没有办法恢复它。您需要记住Q是什么,并且在外部Q的每一次迭代中重新初始化它,都不会检查多项式是否已经有一个具有给定指数的成员,因此,试图乘以例如(x+1) * (x+1) (假设pomnozi是固定的)将导致在结果中插入两次x

通过使用交互式调试器,您应该能够自己找到这些东西。

还有其他问题。例如,第一个节点实际上不包含任何有意义的数据的链接列表的表示非常容易出错并具有误导性。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65167635

复制
相关文章
为什么我选择使用原型工具来代替纸原型
从毕业到现在的三年设计生涯中,对于设计我有自己的理解。从一开始的伟大梦想——通过我的设计改变世界,到现在的现实需求——设计得让人觉得有用,易用,好用。在大学的时候,导师会叫我们只用纸笔来做原型图,这样能更直观地看出我们的想法和信息架构。刚工作的时候,我也习惯只用纸笔来画原型图,这样能快速地表达我的想法。 纸笔原型毕竟使用的工具很简单,人人都有,只需要纸笔即可。纸原型关注的是流程而不是具体的细节,构建原型很快速,也并不用画的很精美只需要表达出界面的流程和关健信息。纸原型的好处就在于与他人沟通的时候可以进行
奔跑的小鹿
2018/03/16
8030
为什么我选择使用原型工具来代替纸原型
为什么我选择使用原型工具来代替纸原型
从毕业到现在的三年设计生涯中,对于设计我有自己的理解。从一开始的伟大梦想——通过我的设计改变世界,到现在的现实需求——设计得让人觉得有用,易用,好用。在大学的时候,导师会叫我们只用纸笔来做原型图,这样能更直观地看出我们的想法和信息架构。刚工作的时候,我也习惯只用纸笔来画原型图,这样能快速地表达我的想法。
奔跑的小鹿
2019/01/31
7220
为什么我选择使用原型工具来代替纸原型
为什么SQL优化中建议用UNION来代替OR
在SQL优化相关资料中,通常可以看到一个建议:用UNION来代替OR 举例 采用 OR 语句: SELECT * FROM a, b WHERE a.p = b.q or a.x = b.y; 采用 UNION 语句,返回的结果同上面的一样,但是速度要快些: SELECT * FROM a, b WHERE a.p = b.q UNION SELECT * FROM a, b WHERE a.x = b.y UNION 语句中明明是会执行两次查询操作,而 OR语句只有一次查询,OR语句反而
dys
2018/04/02
6.2K0
为什么SQL优化中建议用UNION来代替OR
电脑的 ip 是怎么来的呢?我又没有配置过
显然,这里有两种配置方式,一种是自动获取 ip 地址,一种是我们手动来设置,我相信大部分人都是通过自动获取的方式来得到 ip 的,那么问题来了,它是如何自动获得到的呢?
帅地
2019/06/06
1.3K0
电脑的 ip 是怎么来的呢?我又没有配置过
html是什么?如何正确使用html呢?
html的格式相信大家都经常见到过,但是对html的用途和使用估计有部分的朋友会不了解,html常用于程序编程,静态网页,网页链接等作为标记符号使用,那么具体的html是什么?如何正确使用html呢?对此问题,接下来就为大家做出简单易懂的介绍,想要了解的朋友就过来了解一下吧。
用户8715145
2021/06/17
2.1K0
CPS推广:为什么我的佣金还没有到账呢
CPS推广奖励的佣金,目前无法直接后台提现,需要在次月月结之后,由财务系统统一打款到银行,即推广者后台所填写的银行账号,一般上月佣金,次月月末到账,具体时间以银行到账为准。
腾讯云-推广奖励
2019/11/28
10.8K0
CPS推广:为什么我的佣金还没有到账呢
copykat为什么没有infercnv直观呢
其实 copykat 仅仅是算法判别的时候不如人意,但是可视化的时候仍然是肉眼可以明显区分二倍体正常细胞和非整倍体的癌症细胞,所以我们想看看具体做什么改进,可以绕过这个bug,首选项我们把全部的上皮细胞按照病人进行了拆分,得到如下所示 的每个病人独立的文件夹以及每个文件夹下面的expFile.txt !
生信技能树jimmy
2021/12/04
2.2K0
copykat为什么没有infercnv直观呢
unicloud进阶uni-id入门(一)---uni-id能做什么?
这个专栏就带大家使用uni-id 由于要写毕设和论文 所以会更新很慢 如果你对云开发感兴趣 可以加入交流群 974178910 535620886
代码哈士奇
2021/10/25
7640
unicloud进阶uni-id入门(一)---uni-id能做什么?
为何cytoscape总是说我没有java呢
因为最近自己购置了一个全新的Windows电脑,所以就系统性的配置了全部的生物信息学相关软件,当然是也包括cytoscape啦。但是遇到了报错,如下:
生信技能树
2020/07/30
2.3K0
为何cytoscape总是说我没有java呢
为什么 MyBatis 源码中,没有我那种 if···else
在MyBatis的两万多行的框架源码中,使用了大量的设计模式对工程架构中的复杂场景进行解耦,这些设计模式的巧妙使用是整个框架的精华。
搜云库技术团队
2023/10/21
2210
为什么 MyBatis 源码中,没有我那种 if···else
为什么 MyBatis 源码中,没有我那种 if···else
在MyBatis的两万多行的框架源码中,使用了大量的设计模式对工程架构中的复杂场景进行解耦,这些设计模式的巧妙使用是整个框架的精华。
一行Java
2023/09/19
2500
为什么 MyBatis 源码中,没有我那种 if···else
HTML中id、name、class 区别
id的用途  1) id是HTML元素的Identity,主要是在客户端脚本里用。
阳光岛主
2019/02/19
2.6K0
hdp 不更新了,有没有办法将 Apache Hadoop 代替 hdp 并集成到 Ambari 中呢?
今天咱来聊一聊 Ambari 如何集成 Apache Hadoop 哈,自从 cloudera 公司将 hortonworks 公司收购后,hdp 就不迭代更新了,这对 Apache Ambari 也产生了很大影响,毕竟 Ambari 与 hdp 耦合性很强。
create17
2022/11/17
3.5K1
使用LocalDateTime来代替Date
在我们使用Date的时候,会发现很多无法理解的返回值,而且有很多方法是已经被弃用了的
挨踢小子部落阁
2020/01/02
1.6K0
Postgre中FDW能做什么?
什么是FDW? FDW是外部数据包装器,早在2003年SQL标准中添加一个访问远程数据的规范,这个称为SQL外部数据管理。PostgreSQL从9.1版本已经开发出了FDW.在PostgreSQL中配
用户4700054
2022/08/17
1.6K0
Postgre中FDW能做什么?
selenium定位元素报错:‘WebDriver‘ object has no attribute ‘find_element_by_id‘
pycharm新建了一个项目,用于做web自动化测试,直接安装了selenium这个库,发现之前写的Selenium元素定位的代码运行之后会报错,发现是Selenium更新到新版本(4.x版本)后,以前的一些常用的代码的语法发生了改变,当然如果没有更新过或是下载最新版本的Selenium是不受到影响的,还可以使用以前的写法。接下来就是讨论有关于新版本后Selenium定位元素代码的新语法,大家后面别再踩这个坑了。
霍格沃兹测试开发Muller老师
2022/12/01
5.2K0
python中利用try..except来代替if..else
在有些情况下,利用try…except来捕捉异常可以起到代替if…else的作用。 比如在判断一个链表是否存在环的leetcode题目中,初始代码是这样的
用户7886150
2020/12/20
5630
为什么不用Preact或者Fast-React来代替React ?
戳蓝字“IMWeb前端社区”关注我们哦! 1写在前面 生命在于折腾,Coder的折腾就在于造各种轮子。 React在前端圈大火之后,轮子层出不穷。而其中的一些轮子,由于专注于解决很多人诟病的React过大、过慢的问题(然而不并不觉得),也相当出名。关注最多的莫过于Preact、Inferno等以「轻量化」为特色的库了,Github Star数也超过10000。另外由于React广泛应用于同构应用上,并且 rendertoString,renderToStaticMarkup 也存在同步执行、速度慢等问题,一
用户1097444
2022/06/29
3940
为什么不用Preact或者Fast-React来代替React ?
为什么AlertDialog要使用Builder来构建呢
首先说句废话,因为 AlertDialog 太过复杂,内部参数太多,然后不使用构建者模式那么 AlertDialog 的构造方法就可能是:
开发者
2019/12/26
5330
文章是原创的,为什么网站没有收录呢?
刚进入seo领域就知道原创文章对于网站的收录、展现量、权重等的影响,所以保证网站内容的原创度是seoer的基本功,但往往你的内容是原创的,但网站迟迟没有收录,让很多seoer感到迷茫,其实问题不一定只出现在文章上,你还应做以下分析:
蝙蝠侠IT
2021/05/19
6560
文章是原创的,为什么网站没有收录呢?

相似问题

在派生类C++中访问受保护成员

10

如何延迟C++基类中成员的初始化,直到执行派生类的ctor?

20

派生类中基类委托ctor的c++使用

10

访问派生类中类的受保护成员

24

C++:无法从派生类访问受保护成员

14
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档