gazhi_gazhi 2021-10-02 14:53 采纳率: 54.5%
浏览 88
已结题

引发了异常: 读取访问权限冲突

题目:

img


请问是哪有问题 救命 我真的好菜

#include<stdio.h>
#define MaxSize 100
typedef struct data {
    int coe;//系数
    int exp;//指数
}DATA;
typedef struct poly {
    DATA d[MaxSize];
    int length;
}POLY;

//初始化一元多项式(空表)
void InitPoly(POLY* p)
{
    p = (POLY*)malloc(sizeof(POLY));
    p->length = 0;
}

//销毁一元多项式
void DesPoly(POLY* p)
{
    free(p);
}

//输入一元多项式以输入0 0结束
void InputPoly(POLY* p) {
    int i = 0;
    printf("请输入一元多项式,以0 0结束:\n");
    //InitPoly(p);  //申请线性表空间
    scanf("%s", &p);
    if ((p->d[i - 1].exp != 0) || (p->d[i - 1].coe != 0))
    {
        p->d[i].exp;
        p->d[i].coe;
        i++;
    }    //注意:这里需要用或,而不是与,只要系数和指数有一个不等于0,就要循环    
    else
        p->length = i - 1;                           //注意:这里长度需要减1,因为最后输入的0 0不是一元多项式的项    
}

//打印输出一元多项式
void DisplayPoly(POLY* p)
{
    for (int i = 0; i < p->length; i++)
    {
        printf("%s", p->d[i].exp);
        printf("\t");
        printf("%s", p->d[i].coe);
        printf("\t\t\n");
    }
}

//加法一,结果存在e中
void Add1(POLY* p, POLY* q, POLY* e)
{
    int i = 0, j = 0, k = 0;
    //InitPoly(e);  //首先要申请空间,以存储相加后的结果
    while (i < p->length && j < q->length) {
        if (p->d[i].exp == q->d[j].exp)
        {    //如果指数相等,系数相加        
            e->d[k].coe = p->d[i].coe + q->d[j].coe;
            e->d[k].exp = p->d[i].exp;
            if (e->d[k].coe != 0)    //如果系数不等于0,此项才保留
                k++;
            i++;
            j++;
        }
        else if (p->d[i].exp < q->d[j].exp) {  //如果p表当前指数小,则将该项存入结果e中,i和k向前移动        
            e->d[k].coe = p->d[i].coe;
            e->d[k].exp = p->d[i].exp;
            i++;
            k++;
        }
        else {                //如果q表当前指数小,则将该项存入结果e中,j和k向前移动        
            e->d[k].coe = q->d[j].coe;
            e->d[k].exp = q->d[j].exp;
            j++;
            k++;
        }
    }
    while (i < p->length) {  //如果p表还没有结束,则将余下的项依次存入结果e中    
        e->d[k].coe = p->d[i].coe;
        e->d[k].exp = p->d[i].exp;
        i++;
        k++;
    }
    while (j < q->length) {  //如果p表还没有结束,则将余下的项依次存入结果e中    
        e->d[k].coe = q->d[j].coe;
        e->d[k].exp = q->d[j].exp;
        j++;
        k++;
    }
    e->length = k;
}

//加法二,结果使用被加数q存储,相当于q=p+q
void Add2(POLY* p, POLY* q)
{
    int i = 0, j = 0, k = 0;
    while (i < p->length && j < q->length)
    {
        if (p->d[i].exp == q->d[j].exp)  //指数相等,系数相加,若想加后系数为0,在q中删除该项,p表前移一项
        {
            q->d[j].coe += p->d[i].coe;
            i++;
            if (q->d[j].coe == 0)
            {
                for (k = j; k < q->length - 1; k++)   //依次前移,去除掉q的当前项
                {
                    q->d[k].coe = q->d[k + 1].coe;
                    q->d[k].exp = q->d[k + 1].exp;
                }
                q->length--;
            }
            else j++;

        }
        else if (p->d[i].exp < q->d[j].exp)  //p的指数小于q的指数,将p的当前项插入到q中,p、q表都前移一项
        {
            for (k = q->length - 1; k >= j; k--)
            {
                q->d[k + 1].coe = q->d[k].coe;
                q->d[k + 1].exp = q->d[k].exp;
            }
            q->d[j].coe = p->d[i].coe;
            q->d[j].exp = p->d[i].exp;
            i++; j++;
            q->length++;
        }
        else j++; //q的指数大于p的指数,q表前移一项
    }
    while (i < p->length)
    {
        q->d[j].coe = p->d[i].coe;
        q->d[j++].exp = p->d[i++].exp;
        q->length++;
    }
}



//相乘
void MultiPoly(POLY* a, POLY* b, POLY* c)
{
    int i, j, k;
    POLY* d;  //临时存储中间结果
    InitPoly(d);
    for (i = 0; i < a->length; i++)
    {
        for (j = 0; j < b->length; j++)
        {
            d->d[j].exp = a->d[i].exp + b->d[j].exp;
            d->d[j].coe = a->d[i].coe * b->d[j].coe;
        }
        d->length = j;
        Add2(d, c);
    }
    DesPoly(d);
}


//测试主程序:
int main() {
    POLY* a = NULL, * b = NULL, * add_res = NULL, * mul_res = NULL;
    InitPoly(a);
    InitPoly(b);
    InitPoly(add_res);
    InitPoly(mul_res);
    InputPoly(a);
    InputPoly(b);
    printf("a+b=");
    Add1(a, b, add_res);
    DisplayPoly(add_res);
    printf("a*b=");
    MultiPoly(a, b, mul_res);
    DisplayPoly(mul_res);
    DesPoly(a);
    DesPoly(b);
    DesPoly(add_res);
    DesPoly(mul_res);
}


调试结果

img

img

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 10月10日
    • 修改了问题 10月2日
    • 创建了问题 10月2日

    悬赏问题

    • ¥15 部分客户订单定位有误的问题
    • ¥15 如何在maya程序中利用python编写领子和褶裥的模型的方法
    • ¥15 Linux权限管理相关操作(求解答)
    • ¥15 Bug traq 数据包 大概什么价
    • ¥15 在anaconda上pytorch和paddle paddle下载报错
    • ¥25 自动填写QQ腾讯文档收集表
    • ¥15 DbVisualizer Pro 12.0.7 sql commander光标错位 显示位置与实际不符
    • ¥15 android 打包报错
    • ¥15 关于stm32的问题
    • ¥15 ncode振动疲劳分析中,noisefloor如何影响PSD函数?