2017-10-05 8 views
0

구조체를 사용하여 단항 기호 그룹에서 다항식을 만들려고합니다. 잘못된 쓰기 오류로 인해 실패하고있는 append 함수가 있는데 새로운 monomial을위한 공간을 할당해야한다는 것을 알고 있지만 어떻게해야하는지 잘 모르겠습니다. 어떤 도움을 주시면 감사하겠습니다 :구조에 대한 쓰기가 올바르지 않습니다.

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으로 새로운 (빈) 다항식없고 monomials를 생성한다.

Poly* newPoly() { 
    int deg = 0; 
    Mono * first = NULL; 
    Mono * last = NULL; 
    Poly p = {deg, first, last}; 
    Poly * point= (Poly*)malloc(sizeof(p)); 
    return point; 
} 

    } 

이 함수는 다항식 페이지 내부 단항식을 추가 다항식이 m를 수정 :이게 된이 이 다항식 P는 m의 단독 소유자가 될 것으로 예상된다 추가 할 수 있습니다. 새로운 monomial이 목록의 끝에 추가되어야합니다. 이게 된 의 정도는 다항식

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* 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))};'이 함수는 메모리 누출이 없더라도 즉시 범위를 벗어난다. –

+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; 
    } 
} 
관련 문제