使用链表IN C表示和排序多项式

时间:2016-09-26 14:02:32

标签: c

请帮帮我。下面的代码用于表示多项式函数并对多项式进行排序:

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

typedef struct PolyNode *pnode;
typedef struct PolyNode {
    float coef;
    int expon;
    pnode next;
};

pnode Make_Node(pnode ptr, float coef, int expon) {
    ptr->coef = coef;
    ptr->expon = expon;
    ptr->next = NULL;
    return ptr;
}

pnode Input_Node(pnode ptr, float coef, int expon) {
    if (ptr->expon < expon || ptr) {
        pnode temp = NULL;
        temp = malloc(sizeof(pnode));
        temp = Make_Node(temp, coef, expon);
        temp->next = ptr;
        ptr = temp;
        return ptr;
    } else {
        pnode temp = NULL;
        temp = malloc(sizeof(pnode));
        temp = Make_Node(temp, coef, expon);
        pnode pol;
        pol = ptr;
        while (pol->next && pol->next->expon > expon) {
            pol = pol->next;
        }
        temp->next = pol->next;
        pol->next = temp;
        return ptr;
    }
}

void Print_Pol(pnode ptr) {
    pnode temp;
    temp = ptr;
    while (temp) {
        printf("%gx^%d", temp->coef, temp->expon);
        if (temp->next != NULL) {
            printf(" + ");
        }
        temp = temp->next;
    }
}

int main() {
    pnode ptr;
    ptr = (pnode)malloc(sizeof(pnode));
    ptr = Make_Node(ptr, 2, 3);
    ptr->next = NULL;
    ptr = Input_Node(ptr, 2, 4);
    printf("%s%d\n", &ptr, ptr->expon);
    ptr = Input_Node(ptr, 3, 6);
    printf("%s%d\n", &ptr, ptr->expon);
    // ptr = Input_Node(ptr, 3, 7);

    Print_Pol(ptr);
    return 0;
}

帮助我!当我删除&#34; //&#34;在// ptr = Input_Node之前(ptr,3,7);程序没有运行。

2 个答案:

答案 0 :(得分:2)

您的问题似乎是您没有为每个节点分配足够的空间。鉴于此代码:

pnode ptr;
ptr = (pnode) malloc(sizeof(pnode));

类型pnode指针类型,因此您为指针分配了足够的空间。你需要的是struct PolyNode足够的空间,它必须大于pnode,因为它包含几个成员中的一个。我建议以这种形式编写分配:

ptr = malloc(sizeof(*ptr));

关键点是要分配的空间量是根据所需结果的参考大小来定义的,而不是根据显式类型来定义的。这可以保护您不会指定错误的类型,如果更改指针所指向的类型,则不需要更改它。

其次,您不需要在C中转换malloc()的返回值(尽管您使用的是C ++),但您不应该这样做。

请注意您在所提供的代码中的多个位置都有错误的分配。确保修复所有这些。

答案 1 :(得分:0)

您没有为malloc(sizeof(nodep))分配足够的内存:sizeof(nodep)是指针的大小,而不是结构的大小。您应该使用malloc(sizeof(struct PolyNode))

考虑通过在Input_Node()中分配内存来简化代码:

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

typedef struct PolyNode *pnode;
struct PolyNode {
    float coef;
    int expon;
    pnode next;
};

pnode Input_Node(pnode ptr, float coef, int expon) {
    pnode temp = malloc(sizeof(*ptr));
    if (temp == NULL)
        return NULL;
    temp->coef = coef;
    temp->expon = expon;
    temp->next = NULL;

    if (ptr == NULL || ptr->expon < expon) {
        temp->next = ptr;
        ptr = temp;
    } else {
        pnode pol = ptr;
        while (pol->next && pol->next->expon > expon) {
            pol = pol->next;
        }
        temp->next = pol->next;
        pol->next = temp;
    }
    return ptr;
}

void Print_Pol(pnode ptr) {
    pnode temp = ptr;
    while (temp) {
        printf("%gx^%d", temp->coef, temp->expon);
        if (temp->next != NULL) {
            printf(" + ");
        }
        temp = temp->next;
    }
    printf("\n");
}

int main(void) {
    pnode ptr = Input_Node(NULL, 2, 3);
    ptr = Input_Node(ptr, 2, 4);
    ptr = Input_Node(ptr, 3, 6);
    ptr = Input_Node(ptr, 3, 7);
    Print_Pol(ptr);
    return 0;
}