-1
#include<stdio.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0

typedef struct polynomial{
    int coeff;
    char var;
    int exp;
    struct polynomial *link;
} poly;

poly* decode(char*);

main()
{
    char polynomial[100];
    poly *first, *second;

    printf("\n---Enter 1st polynomial---\n\n");
    scanf("%s",polynomial);
    first=decode(polynomial);

    printf("\n---Enter 2nd polynomial---\n\n");
    scanf("%s",polynomial);
    second=decode(polynomial);

    //More statements further

return 0;
}

/*--- Decoding Polynomial ---*/

poly* decode(char *polynomial)
{
    poly *p=NULL, *q=NULL, *temp=NULL;
    int i=0, sign;
    short coeff_entry=TRUE, exp_entry=FALSE, var_visited=FALSE, exp_visited=FALSE, coeff_visited=FALSE;

    while(polynomial[i]!='\0') 
    {

        temp=(poly*)malloc(sizeof(poly));
        if(!temp)
        {
            printf("Error! Memory not allocated\n");
            exit(1);
        }

        if(polynomial[i]==43) {i++; sign=1;}
        if(polynomial[i]==45) {i++; sign=-1;}
        while(1)
        {
            if((polynomial[i]>=48&&polynomial[i]<=57)&&coeff_entry==TRUE)
            {
                temp->coeff=10*(temp->coeff)+(polynomial[i]-48);
                coeff_visited=TRUE;
            }
            else if((polynomial[i]>=65&&polynomial[i]<=90)||(polynomial[i]>=97&&polynomial[i]<=122))
            {
                temp->var=polynomial[i];
                coeff_entry=FALSE;
                exp_entry=TRUE;
                var_visited=TRUE;
            }
            else if((polynomial[i]>=48&&polynomial[i]<=57)&&exp_entry==TRUE)
            {
                temp->exp=10*(temp->exp)+(polynomial[i]-48);
                exp_visited=TRUE;
            }
            else if(polynomial[i]==43||polynomial[i]==45||polynomial[i]=='\0')
            {
                exp_entry=FALSE;
                coeff_entry=TRUE;
                if(var_visited&&!exp_visited)
                {
                    temp->exp=1;
                    !var_visited;
                    !exp_visited;
                }
                if(!coeff_visited)
                {
                    !coeff_visited;
                    temp->coeff=1;
                }
                temp->coeff*=sign;              
                break;
            }
            i++;
        }

        //These lines are for debugging purpose only
        printf("\nCoefficient of the term is: %d\n",temp->coeff);
        printf("Variable of the term is: %c\n",temp->var);
        printf("Exponent of the term is: %d\n",temp->exp);

        temp->link=NULL;
        if(p==NULL)     p=q=temp;
        else
        {
            q->link=temp;
            q=q->link;
        }
    }

return p;
}


私のコードでは、次のような形式で多項式を入力するようユーザーに求めています: -5x ^2+7y^3-19z+5 すべて問題ないように見えますが、この多項式をデコードして連結リスト形式に格納する際

に 2 つの問題があります。最初の係数は、17 x^3-13z+5のような多項式で正です 。この場合、非常に長い整数値 (ほとんどの場合、ガベージ値) がリンク リストの該当するノードに格納されます。2 番目のバグは、 x ^7-18y^3+z-13 のような最初の係数がない場合です。 この場合、 0はリンク リストの該当するノードに格納されます。上記の例のzのように、多項式の他の項では、係数がない場合は1





ノードの係数部分に格納されます。

そのため、最初の係数だけで問題が発生し、それも「正の係数」または「係数なし」です。

4

1 に答える 1

0

コードには多くのエラーがあります。最も重要なのは次のような式です

!value;

それに割り当てる必要があります。

value = !value;

また、次のトークンの前に符号signがない場合は初期化していません。 に初期化し、 があるかどうかを確認し、それ以外の場合は を無視するように設定する必要があります。'+'1'-'-1'+'

今、固定コードを追加しました。試してみてください

#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0

typedef struct _polynomial {
    int coeff;
    char var;
    int exp;
    struct _polynomial *link;
} poly;

poly *decode(char*);

int
main()
{
    char string[100];

    printf("\n---Enter 1st polynomial---\n\n");
    scanf("%99s", string);
    decode(string);

    printf("\n---Enter 2nd polynomial---\n\n");
    scanf("%99s", string);
    decode(string);

    //More statements further

    return 0;
}

/*--- Decoding Polynomial ---*/

poly* decode(char *polynomial)
{
    poly *p = NULL, *q = NULL, *temp = NULL;
    int   i = 0, sign;
    short coeff_entry=TRUE, exp_entry=FALSE, var_visited=FALSE, exp_visited=FALSE, coeff_visited=FALSE;

    while (polynomial[i] != '\0')
    {
        temp = malloc(sizeof(poly));
        if (temp == NULL)
        {
            printf("Error! Memory not allocated\n");
            exit(1);
        }

        sign = 1;
        if (polynomial[i] == 43)
            i++;
        if (polynomial[i] == 45)
        {
            i++;
            sign=-1;
        }

        while (1)
        {
            if ((polynomial[i] >= 48 && polynomial[i] <= 57) && coeff_entry == TRUE)
            {
                temp->coeff   = 10 * temp->coeff + polynomial[i] - 48;
                coeff_visited = TRUE;
            }
            else if ((polynomial[i] >= 65 && polynomial[i] <= 90) || (polynomial[i] >= 97 && polynomial[i] <= 122))
            {
                temp->var   = polynomial[i];
                coeff_entry = FALSE;
                exp_entry   = TRUE;
                var_visited = TRUE;
            }
            else if ((polynomial[i] >= 48 && polynomial[i] <= 57) && exp_entry == TRUE)
            {
                temp->exp=10*(temp->exp)+(polynomial[i]-48);
                exp_visited=TRUE;
            }
            else if (polynomial[i] == 43 || polynomial[i] == 45 || polynomial[i] == '\0')
            {
                exp_entry=FALSE;
                coeff_entry=TRUE;
                if (var_visited && !exp_visited)
                {
                    temp->exp   = 1;
                    var_visited = !var_visited;
                    exp_visited = !exp_visited;
                }
                if (!coeff_visited)
                {
                    coeff_visited = !coeff_visited;
                    temp->coeff   = 1;
                }
                temp->coeff *= sign;

                break;
            }
            i++;
        }

        printf("\nCoefficient of the term is: %d\n", temp->coeff);
        printf("Variable of the term is: %c\n", temp->var);
        printf("Exponent of the term is: %d\n", temp->exp);

        temp->link = NULL;
        if (p == NULL)
            p = q = temp;
        else
        {
            q->link = temp;
            q       = q->link;
        }
    }

    return p;
}
于 2015-02-25T17:57:25.367 に答える