Daylight庆尘 2022-03-08 20:52 采纳率: 100%
浏览 62
已结题

数据结构C原因顺序表在PTA段错误问题

设计程序求两个一元多项式的和。

输入格式:
输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数。数字间以空格分隔。

输出格式:
输出1行,以指数递降方式输出和多项式非零项的系数和指数(保证不超过整数的表示范围)。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0。

输入样例:
4 3 4 -5 2 6 1 -2 0
3 5 20 -7 4 3 1

输出样例:
5 20 -4 4 -5 2 9 1 -2 0

#include<stdio.h>
#include<stdlib.h>
#define maxsize 100
typedef struct node pnode;
typedef struct header
{
    int length;//链表大小
    pnode *elem;//结构体数组
}phead;
typedef struct node
{
    int index;//系数
    int coe;//指数
}pnode;
phead* list_creat()
{
    phead* p;
    p=(phead*)malloc(sizeof(phead));
    p->length=0;
    p->elem=(pnode*)malloc(sizeof(pnode)*maxsize);//分配结构体数组内存空间
    return p;
}
void list_insert(phead* p,pnode* temp)//作用是将temp插入到顺序表末尾
{
    p->elem[p->length]=*temp;
    p->length++;//记录顺序表元素变化
    return;
}
void list_print(phead* p)
{
    for(int i=0;i<p->length;i++)
    {
        if(i==p->length-1)
        {
            printf("%d %d",p->elem[i].index,p->elem[i].coe);
        }
        else
        {
            printf("%d %d ",p->elem[i].index,p->elem[i].coe);
        }
    }
}
int main()
{
    int m,n;//m,n分别为两个顺序表的大小
    pnode* temp=(pnode*)malloc(sizeof(pnode));//暂时储存数据的空瓶子
    scanf("%d",&m);
    phead* p=list_creat();//创建第一个顺序表
    for(int i=0;i<m;i++)//填充顺序表
    {
        scanf("%d%d",&temp->index,&temp->coe);
        list_insert(p,temp);
    }
    scanf("%d",&n);
    phead* q=list_creat();//创建第二个顺序表
    for(int i=0;i<n;i++)//填充第二个顺序表
    {
        scanf("%d%d",&temp->index,&temp->coe);
        list_insert(q,temp);
    }
    phead* dep=list_creat();
    int i=0,j=0,number=0;
    while(1)
    {
        if(p->elem[i].index==0&&(i<p->length))
        {
            i++;
        }
        else if(q->elem[j].index==0&&(j<p->length))
        {
            j++;
        }
        else if(i>p->length-1)//第一个列表元素被使用完
        {
            for(j;j<q->length;j++)//将第二个列表剩下元素放入
            {
                list_insert(dep,&q->elem[j]);
            }
            break;
        }
        else if(j>q->length-1)
        {
            for(i;i<p->length;i++)//将第一个列表剩下元素放入
            {
                list_insert(dep,&p->elem[i]);
            }
            break;
        }
        else if(p->elem[i].coe>q->elem[j].coe)
        {
            list_insert(dep,&p->elem[i]);
            i++;
            number++;
        }
        else if(p->elem[i].coe<q->elem[j].coe)
        {
            list_insert(dep,&q->elem[j]);
            j++;
            number++;
        }
        else//指数相等的情况
        {
            if(p->elem[i].index!=-q->elem[j].index)//系数不是互为相反数
            {
                p->elem[i].index+=q->elem[j].index;
                list_insert(dep,&p->elem[i]);
                number++;
            }
            i++;
            j++;
        }
    }
    list_print(dep);
    if(number==0)
    {
        printf("0 0");
    }
}


PTA提交时总是会提示段错误,但自己运行没有问题,应该是数组越界,但并没有找到越界的地方,希望大家可以看看,感谢

我的思路时用三个顺序表,前两个保存初始数据,第三个保存结果

  • 写回答

2条回答 默认 最新

  • CSDN专家-link 2022-03-08 21:12
    关注

    18行就错了,sizeof(pnode)

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月22日
  • 已采纳回答 3月22日
  • 创建了问题 3月8日

悬赏问题

  • ¥15 用verilog实现tanh函数和softplus函数
  • ¥15 求京东批量付款能替代天诚
  • ¥15 slaris 系统断电后,重新开机后一直自动重启
  • ¥15 51寻迹小车定点寻迹
  • ¥15 谁能帮我看看这拒稿理由啥意思啊阿啊
  • ¥15 关于vue2中methods使用call修改this指向的问题
  • ¥15 idea自动补全键位冲突
  • ¥15 请教一下写代码,代码好难
  • ¥15 iis10中如何阻止别人网站重定向到我的网站
  • ¥15 滑块验证码移动速度不一致问题