小码过海 2023-10-23 20:51 采纳率: 85.7%
浏览 2

用C语言和单链表来复制多项式

为什么Multiply函数无法运行?p r结点增生找不到问题啊
主要问题是multiply函数那,其它部分之前运行过没问题了。
ChatGPT问过多次了得不到有效答案

#include <stdio.h>
#include <stdlib.h>
typedef struct pNode{
    int coef;           //x系数域
    int exp;            //指数域
    struct pNode* link;         //指针域
}PNode;
typedef struct polynominal{
    PNode *head;
}Polynominal;
void Creat(Polynominal *h);
void Multiply(Polynominal *h,Polynominal *j);
int main()
{
    Polynominal *p,*q;
    p=(Polynominal*)malloc(sizeof(Polynominal));
    q=(Polynominal*)malloc(sizeof(Polynominal));
    Creat(p);
    Creat(q);
    Multiply(p,q);
    return 0;
}
void Creat(Polynominal *h)
{
    ...
}
void Multiply(Polynominal *h,Polynominal *j)
{
    Polynominal *k;PNode *p,*q,*r;
    q=j->head->link;
    k=(Polynominal*)malloc(sizeof(Polynominal));
    k->head->exp=-1;
    k->head->link=k->head;
    p=k->head;
    do{
        r=(PNode*)malloc(sizeof(PNode));
        r->coef=q->coef;
        r->exp=q->exp;      //将q指向的值赋值给r
        r->link=p->link;
        p->link=r;
        q=q->link;
    }while(q->link!=j->head);
    printf("\n检查\n");
    p=k->head->link;
    do{
        printf("%d*x^%d",p->coef,p->exp);
        if(p->link->coef>0&&p->link!=k->head)
           printf("+");
        p=p->link;
    }while(p->link!=k->head);
    printf("\n");
}

  


  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-10-23 22:43
    关注

    【以下回答由 GPT 生成】

    在分析问题之前,我们先了解一下Multiply函数的作用。该函数的目的是将两个多项式相乘,并将结果存储在第一个多项式中。 在原始代码中,你已经进行了一些正确的操作,但是有几个问题导致Multiply函数无法正常运行: 1. 在Create函数中,你没有为链表的头节点分配内存空间,直接给头节点赋值。因此,在执行Multiply函数时,头节点的link字段为空,并且在执行t = (PNode*)malloc(sizeof(PNode))时,会出现错误。 2. 在Multiply函数中,有两个地方需要修改。首先,需要为结果链表的头节点分配内存,并将其link字段指向自身;其次,在插入新节点时,你没有正确地调整指针使其连续。因此,在每次添加新节点时,需要将其指向上一个节点,而不是头节点。 下面是经过修改的代码:

    void Multiply(Polynominal* h, Polynominal* j)
    {
        PNode* p, * q, * r, * t;
        int cmp, result;
        r = h->head;
        if (r == r->link || j->head == j->head->link) {
            printf("Empty!\n");
            return;
        }
        else {
            r->link = h->head;
            q = j->head;
            do {
                p = r->link;
                do {
                    t = (PNode*)malloc(sizeof(PNode));
                    if (!t)
                        exit(1);
                    result = p->coef * q->coef;
                    t->coef = result;
                    t->exp = p->exp + q->exp;
                    t->link = NULL; // 确保新节点的末尾指向空
                    p = p->link;
    
                    // 将新节点插入到结果链表中
                    if (r->link == NULL) { // 检查是否为第一个节点
                        r->link = t;
                        t->link = h->head;
                    }
                    else {
                        t->link = r->link->link;
                        r->link->link = t;
                    }
                    r = r->link;
                } while (p != h->head);
                q = q->link;
            } while (q != j->head);
            r->link = h->head;
            q = h->head->link;
            while (q->link != h->head) {
                r = q;
                p = q->link;
                while (p->link != h->head) {
                    if (q->exp == p->exp) {
                        q->coef += p->coef;
                        r->link = p->link;
                        free(p);
                        p = r->link;
                    }
                    r = p;
                    p = p->link;
                }
                q = q->link;
            }
        }
    }
    

    这些修改应该解决了你在Multiply函数中遇到的问题。希望这可以帮助到你!


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 修改了问题 10月23日
  • 修改了问题 10月23日
  • 创建了问题 10月23日

悬赏问题

  • ¥300 寻抓云闪付tn组成网页付款链接
  • ¥15 请问Ubuntu要怎么安装chrome呀?
  • ¥15 视频编码 十六进制问题
  • ¥15 Xsheii7我安装这个文件的时候跳出来另一个文件已锁定文件的无一部分进程无法访问。这个该怎么解决
  • ¥15 unity terrain打包后地形错位,跟建筑不在同一个位置,怎么办
  • ¥15 FileNotFoundError 解决方案
  • ¥15 uniapp实现如下图的图表功能
  • ¥15 u-subsection如何修改相邻两个节点样式
  • ¥30 vs2010开发 WFP(windows filtering platform)
  • ¥15 服务端控制goose报文控制块的发布问题