我正在尝试从一组单项式中创建一个多项式,其结构为两者。我有一个追加函数,由于无效的写入错误而失败,并知道我需要为新的单项式空间分配空间,但我不知道如何去做。任何帮助将不胜感激:
typedef struct Monomial {
typede Monomial {
int coeff; /* coefficient */
int exp; /* exponent */
struct Monomial *next; /* next monomial */
} Mono;
typedef struct Polynomial {
int deg; /* degree */
Mono* first; /* first monomial */
Mono* last; /* last monomial */
} Poly;
此函数创建具有给定系数和功率的新单项式。 c:系数 k:力量 该函数分配一个单项并初始化其属性。 返回值是指向新创建的单项式的指针。
Mono* newMono( int c, int k) {
Mono m = {c, k, (Mono*)malloc(sizeof(Mono)) };
Mono * mp = (Mono*)malloc(sizeof(m));
return mp;
}
此函数创建一个0(0)的新(空)多项式 单项式。
Poly* newPoly() {
int deg = 0;
Mono * first = NULL;
Mono * last = NULL;
Poly p = {deg, first, last};
Poly * point= (Poly*)malloc(sizeof(p));
return point;
}
}
此函数在多项式中添加单项式 p:要修改的多项式 m:要添加的单项式 多项式p预计是m的唯一所有者。 应该在列表的末尾添加新的单项式。 单项式的次数不应超过多项式的次数
void appendMono( Poly* p, Mono* m) {
if((*p).first){
Mono* l = (*p).last;
(*l).next = m; //ERROR IS HERE
(*p).last = m;
}
else {
(*m).next = (Mono*)malloc(sizeof(Mono));
(*p).first=m;
(*p).last=m;
}
}
此函数分配,读取和返回多项式。 它首先要求最高学位 然后它读取所有单项式(以增加的方式给出) 权力的顺序)作为整数对(空格分隔) 并将它们添加到多项式中。 它最终返回构造的poly。
Poly* readPoly() {
//TODO
Poly* p = newPoly;
int deg;
int pow, coef;
scanf("%d", °);
while(scanf("%d %d", &pow, &coef)){
Mono * m = newMono(pow, coef);
appendMono(p, m); //ERROR CALLED FROM HERE
}
return p;
}
答案 0 :(得分:0)
你离工作代码很远。
这不符合你的想法:
Mono* newMono( int c, int k) {
Mono m = {c, k, (Mono*)malloc(sizeof(Mono)) };
Mono * mp = (Mono*)malloc(sizeof(m));
return mp;
}
Malloc返回未初始化的存储空间,因此该函数返回垃圾邮件。转换malloc
的返回值也毫无用处。只需确保程序头中有#include <stdlib.h>
。
试试这个:
Mono *newMono(int coeff, int exp) {
Mono *p = malloc(sizeof *p); // Check for NULL return in production code
p->coeff = coeff;
p->exp = exp;
p->next = NULL;
return p;
}
遵循newPoly
的相同模式。您显然正在尝试构建聚合,然后将其复制到malloc
内存中。这样可行,但除非您的编译器足够聪明以消除额外的副本,否则它会浪费。就这么简单。
要追加,不需要分配任何新存储空间。你只是调整指针。
void appendMono(Poly *p, Mono *m) {
if (p->first) {
p->last->next = m;
p->last = m;
} else {
p->first = p->last = m;
}
}