2017-10-05 257 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; 
    } 
}