Назначение полинома через файл в C - PullRequest
0 голосов
/ 08 декабря 2018

Я хочу назначить входную информацию из показателя степени и коэффициента из файла в круговой связанный список.

файл "a.txt" выглядит следующим образом

8 3
7 2
3 0

Однако в выводе есть и странные значения, подобные этому.Я хотел сделать список круглым, но это не так.

coef    expon 
3       0
7       2
8       3
7887744 0
7900240 0
7864656 0
7869712 0
7900240 0
7864656 0
7869712 0

пожалуйста, я не могу найти решение.

#include <stdio.h>
#include <stdlib.h>
typedef struct polyNode* polyPointer;
typedef struct polyNode{
    int  coef;
    int expon;
    polyPointer link;
};

int main()  {
    polyPointer A, B, C = (polyPointer)malloc(sizeof(polyPointer)) ;
    FILE *fa, *fb ;
    int a;

    fa = fopen("a.txt", "r");
    if(fa==NULL){
        printf("file open error\n");
        return 1;
    }
    if(fb==NULL){
        printf("file open error\n");
        return 1;    
    }
    A = create_circle_linked_poly(fa);
    printf("coef        expon\n");
    int i;
    for(A; i<10; A=A->link, i++)
        printf("%d  %d\n", A->coef, A->expon); 
    return 0;
}

polyPointer create_circle_linked_poly(FILE *a){
    polyPointer head = malloc(sizeof(polyPointer));
    polyPointer temp = malloc(sizeof(polyPointer));
    first = head;
    int res;
    while(1){
        polyPointer p =(polyPointer) malloc(sizeof(polyPointer));
        res = fscanf(a, "%d %d", &p->coef, &p->expon);
        if(res==EOF)break;
        p->link = head;
        head = p;    
    }
    return head;   
}

1 Ответ

0 голосов
/ 08 декабря 2018

Ваш polyPointer, как следует из его названия, является указателем.Так что если вы malloc(sizeof(polyPointer)), вы выделяете только размер указателя.Но вы хотите выделить объект, так что
malloc(sizeof(*polyPointer)).

Далее вы проверяете, был ли fb открыт с if(fb==NULL){....К счастью, fb был инициализирован и пробал не будет NULL, но вы никогда не вызывали fopen для файла.

И я вижу в вашем цикле for, что вы повторяете, пока i не станет 10, но) i неинициализирован и может быть -123456 или около того, и b) вы никогда не проверяете, достигли ли вы конца списка ссылок.Таким образом, последние напечатанные элементы не определены (мусор).Поэтому измените цикл for на:
for(i=0; i<10 && A!=NULL; A=A->link, i++).

И не приводите результат malloc.Он возвращает указатель void, который совместим с любым типом указателя.

...