在 C 中以指数形式添加两个多项式

问题描述 投票:0回答:2

问题是添加两个用户定义的多项式数据类型。我的代码如下。我尝试编写一个代码,通过使用 malloc 创建动态数组,只占用必要的内存。

请帮我更正此代码。我对双指针和动态数组的概念很陌生。

#include <stdio.h>

#include <stdlib.h>

typedef struct Polynomial {
    int numTerms;
    int ** expo;
    int ** coff;
}
polynomial;

void polyInput(polynomial poly) {
    int i;
    int * ptr1;
    int * ptr2;
    ptr1 = (int * ) malloc(sizeof(int) * poly.numTerms);
    ptr2 = (int * ) malloc(sizeof(int) * poly.numTerms);

    printf("Enter the pair of exponent and coefficient:\n");
    for (i = 0; i < poly.numTerms; i++)
        scanf("%d %d", & ptr1[i], & ptr2[i]);

    poly.expo = & ptr1;
    poly.coff = & ptr2;
}

void polyPrint(polynomial poly) {
    int i;
    for (i = 0; i < poly.numTerms; i++)
        printf("(%d, %d) ", ( * poly.expo)[i], ( * poly.coff)[i]);
}

polynomial polySum(polynomial poly1, polynomial poly2) {
    int n1 = poly1.numTerms;
    int n2 = poly2.numTerms;
    if (( * poly1.expo)[n1 - 1] > ( * poly2.expo)[n2 - 1]) {}
    return polySum(poly2, poly1);

    int i = 0, j = 0, k = 0;
    polynomial sumOfPoly;
    * sumOfPoly.coff = (int * ) malloc(50 * sizeof(int));
    * sumOfPoly.expo = (int * ) malloc(50 * sizeof(int));
    while (i < n1 && j < n2) {
        if (( * poly1.expo)[i] < ( * poly2.expo)[j]) {
            ( * sumOfPoly.expo)[k] = ( * poly2.expo)[j];
            ( * sumOfPoly.coff)[k] = ( * poly2.expo)[j];
            k++;
            j++;
        } else if ( * poly1.expo[i] > * poly2.expo[i]) {
            ( * sumOfPoly.expo)[k] = ( * poly1.expo)[i];
            ( * sumOfPoly.coff)[k] = ( * poly1.coff)[i];
            k++;
            i++;
        } else {
            // Check for special case
            if (( * poly1.coff)[i] + ( * poly2.coff)[j] != 0) {
                ( * sumOfPoly.expo)[k] = ( * poly1.expo)[i];
                ( * sumOfPoly.coff)[k] = ( * poly1.coff)[i] + ( * poly2.coff)[j];
                k++;
            }
            i++;
            j++;
        }
    }

    while (i < n1) {
        ( * sumOfPoly.expo)[k] = ( * poly1.expo)[i];
        ( * sumOfPoly.coff)[k] = ( * poly1.coff)[i];
        k++;
        i++;
    }

    sumOfPoly.numTerms = k;

    return sumOfPoly;
}

int main() {
    polynomial poly1, poly2;
    int i;

    printf("Enter the number of terns in 1st polynomial: ");
    scanf("%d", & poly1.numTerms);
    polyInput(poly1);

    printf("Enter the number of terms in 2nd polynomial: ");
    scanf("%d", & poly2.numTerms);
    polyInput(poly2);

    polynomial sumOfPoly;
    sumOfPoly = polySum(poly1, poly2);

    polyPrint(sumOfPoly);

    return 0;
}

上面的代码应该从用户那里获取两个多项式,然后返回并打印多项式的和。

输入数据后我没有得到任何输出。我只遇到了分段错误。输出是:

Enter the number of terns in 1st polynomial: 3
Enter the pair of exponent and coefficient:
2 1
1 5
0 -3
Enter the number of terms in 2nd polynomial: 3
Enter the pair of exponent and coefficient:
3 2
2 -3
0 6
Segmentation fault

请指出我在这段代码中的错误以及我应该更改哪些内容来纠正它。

c pointers malloc dynamic-arrays
2个回答
0
投票

除了评论中提到的各种问题之外,导致分段错误的主要问题是您将

polynomial
结构体按值传递到
polyInput
函数中。因此,程序在调用该函数时会获取 poly1
poly2
对象的
copy
,因此该副本就是正在更新的内容,而不是原始对象。因此,由于它们没有初始化,所以它们包含当时内存中的任何内容,从而导致 UB(未定义行为),特别是当代码尝试访问指针时出现分段错误。 这是示例代码,基于您的代码,但做了一些更改,例如使用正确的转换和初始化

poly1

结构,因为如果我不这样做,我的编译器 VS 2017 会抱怨。

#include <stdio.h>
#include <stdlib.h>

typedef struct Polynomial {
    int numTerms;
    int ** expo;
    int ** coff;
}
polynomial;

void polyInput(polynomial poly) {
    poly.numTerms = 1;
    poly.expo = (int **) malloc(sizeof(int*) * poly.numTerms);;
    poly.coff = (int **) malloc(sizeof(int*) * poly.numTerms);;
}

void polyInput2(polynomial* poly) {
    poly->numTerms = 1;
    poly->expo = (int **) malloc(sizeof(int*) * poly->numTerms);;
    poly->coff = (int **) malloc(sizeof(int*) * poly->numTerms);;
}

int main()
{
    polynomial poly1 = {0, NULL, NULL}, poly2 = {0, NULL, NULL};

    polyInput(poly1);
    printf("%d %p %p\n", poly1.numTerms, poly1.expo, poly1.coff);

    polyInput2(&poly2);
    printf("%d %p %p\n", poly2.numTerms, poly2.expo, poly2.coff);

    return 0;
}

注意 
polyInput

polyInput2
基本上做同样的事情,但是第一个使用值传递,就像你的函数一样,而第二个则使用指针,所以任何更改也会在你传递给的对象中发生它。
运行它会产生以下输出:

0 00000000 00000000 1 00CE4918 00CE4928

如您所见,第一组值保留为我初始化时使用的 0 值,只有第二组值具有函数设置的值。


0
投票

局部变量保存地址

poly.expo = & ptr1;

保存局部变量

ptr1
的地址。稍后在其他例程中使用
.expo
的代码存在使用无效指针的风险。
相反,保存分配的指针。

poly.expo = anything;

是一个问题,因为它保存到本地参数

poly
中,这不会影响调用代码的参数。
相反,调用代码可以将 

polynomial

对象的地址传递给

polyInput()
//void polyInput(polynomial poly) {
void polyInput(polynomial *poly) {
    //int i;
    //int * ptr1;
    //int * ptr2;
    //ptr1 = (int * ) malloc(sizeof(int) * poly.numTerms);
    //ptr2 = (int * ) malloc(sizeof(int) * poly.numTerms);
    poly->expo = malloc(sizeof poly->expo[0] * poly.numTerms);
    poly->coff = malloc(sizeof poly->coff[0] * poly.numTerms);
    if (poly->expo == NULL || poly->coff == NULL) {
      Handle_error_with_TBD_code;
    }

    printf("Enter the pair of exponent and coefficient:\n");
    // for (i = 0; i < poly.numTerms; i++)
    for (int = 0; i < poly.numTerms; i++) {
        // scanf("%d %d", & ptr1[i], & ptr2[i]);
        scanf("%d %d", &poly->expo[i], &poly->coff[i]);
    }

    //poly.expo = & ptr1;
    //poly.coff = & ptr2;
}

// Calling code

    //polyInput(poly1);
    polyInput(&poly1);

其他

检查

scanf()

的返回值。

    

© www.soinside.com 2019 - 2024. All rights reserved.