2017-10-05 53 views
0

我试图从一组单项式中创建一个多项式,并且都有一个结构体。我有一个追加函数,由于无效的写入错误而失败,并且知道我需要为新单项分配空间,但不知道如何去处理它。任何帮助将不胜感激:在结构上写入无效

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度新的(空)多项式和无 单项式。

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内:多项式来修改 米:单项式添加 多项式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", &deg); 
    while(scanf("%d %d", &pow, &coef)){ 
    Mono * m = newMono(pow, coef); 
    appendMono(p, m); //ERROR CALLED FROM HERE 
    } 
    return p; 
} 
+1

这是做什么的,除了泄漏内存? 'Mono m = {c,k,(Mono *)malloc(sizeof(Mono))};'与此相同,尽管它不泄漏内存,但它立即超出范围。 'Poly p = {deg,first,last};' –

+0

'Poly * point =(Poly *)malloc(sizeof(Poly));' – YaatSuka

+0

这只是我分配内存的尝试。我对C非常陌生,所以我不知道应该在哪里放置malloc语句 – user8232299

回答

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。您显然正在尝试构建一个聚合,然后将其复制到内存中。这将起作用,但这是浪费的,除非你的编译器足够聪明以消除额外的副本。只要做到这一点直截了当的方式。

要追加,不需要分配任何新的存储。你只是在调整指针。

void appendMono(Poly *p, Mono *m) { 
    if (p->first) { 
    p->last->next = m; 
    p->last = m; 
    } else { 
    p->first = p->last = m; 
    } 
}