a905448839 发表于 2023-6-25 23:03:47

C语言实现一元多项式的乘法与加法运算(求告知错误原因)

求告知求乘积出错原因 谢谢!

设计函数分别求两个一元多项式的乘积与和。

输入格式:
输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。

输出格式:
输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0。

输入样例:
4 3 4 -5 26 1-2 0
3 5 20-7 43 1
输出样例:
15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
5 20 -4 4 -5 2 9 1 -2 0

我的代码:
#include <stdio.h>
#include <stdlib.h>

typedef struct Node *node;
struct Node
{
    int x;
    int z;
    node next;
};

node read();
void print(node lsit);
node he(node list1,node list2);
node ji(node list1,node list2);

node read()
{
        int i;
        scanf("%d",&i);
        node head = (node)malloc(sizeof(node));
        head->next = NULL;
        node p = head;
       
        while(i--)
        {
                node temp = (node)malloc(sizeof(node));
                scanf("%d %d",&temp->x,&temp->z);
                p->next = temp;
                p = p->next;
        }
        p->next = NULL;
       
        return head;
}

node he(node list1,node list2)
{
        node temp;
        node head = (node)malloc(sizeof(node));
        head->next = NULL;
        node p = head;
       
        if(list2->next == NULL)
                return list1;
        else
        {
                list1 = list1->next;
                list2 = list2->next;

                while(list1 && list2)
                {
                       
                        temp = (node)malloc(sizeof(node));
                        if(list1->z == list2->z)
                        {       
                                temp->x = list1->x + list2->x;
                                temp->z = list1->z;
                                list1 = list1->next;
                                list2 = list2->next;
                        }
                        else if(list1->z > list2->z)
                        {
                                temp->x = list1->x;
                                temp->z = list1->z;
                                list1 = list1->next;
                        }
                        else
                        {
                                temp->x = list2->x;
                                temp->z = list2->z;
                                list2 = list2->next;
                        }
                        p->next = temp;
                        p = p->next;                       
                }
                for(;list1;list1 = list1->next)temp = (node)malloc(sizeof(node)),temp->x = list1->x,temp->z = list1->z,p->next = temp,p = p->next;
                for(;list2;list2 = list2->next)temp = (node)malloc(sizeof(node)),temp->x = list2->x,temp->z = list2->z,p->next = temp,p = p->next;
                p->next = NULL;
        return head;
        }
}

node ji(node list1,node list2)
{
       
        node t;
        node OK = (node)malloc(sizeof(node));
        OK->next = NULL;
        node L = OK;

        list1 = list1->next;
        list2 = list2->next;
               
        for(list1;list1;list1=list1->next)
        {
                node temp;
                node head = (node)malloc(sizeof(node));
                head->next = NULL;
                node p = head;
                for(t = list2;t;t=t->next)
                {
                        temp = (node)malloc(sizeof(node));
                        temp->x = list1->x * t->x;
                        temp->z = list1->z + t->z;

                        p->next = temp;
                        p = p->next;
                }
                p->next = NULL;
                L = he(head,L);
        }
        L->next = NULL;
        return OK;
               
}



void print(node list)
{
        if(list->next)
        {
                list = list->next;
                while(list)
                {
                        printf("%d %d",list->x,list->z);
                        list = list->next;
                        if(list)
                        printf(" ");

                }
        }
        else
        printf("0 ");
}



int main()
{
    node list1,list2;
    list1 = read();
    list2 = read();

//   print(list1);
//   print(list2);
        print(he(list1,list2));
        print(ji(list1,list2));
return 0;
}

isdkz 发表于 2023-6-25 23:29:38

您的代码存在一些错误。首先,您在申请新的节点时大小应该为sizeof(struct Node)而不是sizeof(node) 。其次,您在乘法函数ji中初始化L节点的时候, OK节点的next未置为NULL ,这会导致在乘法结果累加时出错。

以下是修改后的代码:

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

typedef struct Node *node;
struct Node
{
    int x;
    int z;
    node next;
};

node read();
void print(node list);
node he(node list1,node list2);
node ji(node list1,node list2);

node read()
{
    int i;
    scanf("%d",&i);
    node head = (node)malloc(sizeof(struct Node));
    head->next = NULL;
    node p = head;
   
    while(i--)
    {
      node temp = (node)malloc(sizeof(struct Node));
      scanf("%d %d",&temp->x,&temp->z);
      temp->next = NULL;
      p->next = temp;
      p = p->next;
    }
   
    return head;
}

node he(node list1,node list2)
{
    node temp;
    node head = (node)malloc(sizeof(struct Node));
    head->next = NULL;
    node p = head;
   
    if(list2->next == NULL)
      return list1;
    else
    {
      list1 = list1->next;
      list2 = list2->next;
      while(list1 && list2)
      {
            temp = (node)malloc(sizeof(struct Node));
            if(list1->z == list2->z)
            {      
                temp->x = list1->x + list2->x;
                temp->z = list1->z;
                list1 = list1->next;
                list2 = list2->next;
            }
            else if(list1->z > list2->z)
            {
                temp->x = list1->x;
                temp->z = list1->z;
                list1 = list1->next;
            }
            else
            {
                temp->x = list2->x;
                temp->z = list2->z;
                list2 = list2->next;
            }
            temp->next = NULL;
            p->next = temp;
            p = p->next;                     
      }
      while(list1)
      {
            temp = (node)malloc(sizeof(struct Node));
            temp->x = list1->x;
            temp->z = list1->z;
            temp->next = NULL;
            p->next = temp;
            p = p->next;
            list1 = list1->next;
      }
      while(list2)
      {
            temp = (node)malloc(sizeof(struct Node));
            temp->x = list2->x;
            temp->z = list2->z;
            temp->next = NULL;
            p->next = temp;
            p = p->next;
            list2 = list2->next;
      }
      p->next = NULL;
      return head;
    }
}

node ji(node list1,node list2)
{
    node t;
    node OK = (node)malloc(sizeof(struct Node));
    OK->next = NULL;
    node L = OK;
    list1 = list1->next;
    list2 = list2->next;
         
    for(; list1; list1=list1->next)
    {
      node temp;
      node head = (node)malloc(sizeof(struct Node));
      head->next = NULL;
      node p = head;
      for(t = list2; t; t=t->next)
      {
            temp = (node)malloc(sizeof(struct Node));
            temp->x = list1->x * t->x;
            temp->z = list1->z + t->z;
            temp->next = NULL;
            p->next = temp;
            p = p->next;
      }
      L = he(head, L);
    }
    return L;
}

void print(node list)
{
    if(list->next)
    {
      list = list->next;
      while(list)
      {
            printf("%d %d",list->x,list->z);
            list = list->next;
            if(list)
                printf(" ");
      }
    }
    else
      printf("0 0");
}

int main()
{
    node list1,list2;
    list1 = read();
    list2 = read();
    print(ji(list1,list2));
    printf("\n");
    print(he(list1,list2));
    return 0;
}


注意:
· 你需要在新的node分配后立即将next指针设置为NULL 。这样可以防止你在后续代码中意外地访问到未初始化的内存。
· 你需要先打印乘法的结果,再打印加法的结果,以符合题目的输出顺序。
· 空的多项式应输出0 0 ,而非0 。

a905448839 发表于 2023-6-26 09:37:21

isdkz 发表于 2023-6-25 23:29
您的代码存在一些错误。首先,您在申请新的节点时大小应该为sizeof(struct Node)而不是sizeof(node)...

如要释放内存需要在何时释放呢?

isdkz 发表于 2023-6-26 09:39:47

a905448839 发表于 2023-6-26 09:37
如要释放内存需要在何时释放呢?

在C语言中,你需要在不再需要动态分配的内存时释放它,以防止内存泄露。在你的程序中,可能在main函数的末尾释放所有动态分配的内存。

你可以通过迭代链表,并对每个节点使用free函数来释放内存。然而,你需要注意,一旦一个节点被释放,你就不能再访问它的next指针。所以,你需要在释放节点前先保存下一个节点的指针。

下面是一个释放链表内存的函数示例:

void freeList(node head) {
    node temp;
    while (head != NULL) {
      temp = head;
      head = head->next;
      free(temp);
    }
}


然后在你的main函数中调用该函数:

int main() {
    node list1,list2;
    list1 = read();
    list2 = read();
    print(ji(list1,list2));
    printf("\n");
    print(he(list1,list2));

    // 释放链表内存
    freeList(list1);
    freeList(list2);

    return 0;
}


这样可以确保你的程序不会引起内存泄露。但请注意,如果你的程序在其他地方仍然保存有这些节点的指针,并试图在后续的代码中使用它们,那么就会导致未定义的行为。因此,你需要确保在释放内存后不再使用这些指针。

a905448839 发表于 2023-6-26 09:55:37

isdkz 发表于 2023-6-26 09:39
在C语言中,你需要在不再需要动态分配的内存时释放它,以防止内存泄露。在你的程序中,可能在main函 ...

我在ji函数里面分配的内存空间,创建的链表传入了he函数。而he函数又是新创建的链表,也分配了内存空间。,所以在最后只用free释放掉list1和list2吗?ji函数和he函数里分配的内存空间,创建的链表不用去管他吗?
页: [1]
查看完整版本: C语言实现一元多项式的乘法与加法运算(求告知错误原因)