#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int data1;
int data2;
struct node *pNext;
} NODE,*PNODE;
PNODE create();
PNODE add(PNODE p1,PNODE p2);
PNODE mul(PNODE p1,PNODE p2);
void tra(PNODE pp);
int main()
{ PNODE p1=NULL;
p1=create();
PNODE p2=NULL;
p2=create();
PNODE p=NULL;
p=mul(p1,p2);
tra(p);
printf("\n");
PNODE pp=NULL;
pp=add(p1,p2);
tra(pp);
return 0;
}
PNODE create(){
int i;
int n=0;
int val=0;
int val2=0;
PNODE pHead = (PNODE)malloc(sizeof(NODE));
PNODE pTail=pHead;
pTail->pNext=NULL;
//printf("输入此时链表长度\n");
scanf("%d",&n);
for(i=0;i<n;i++)//输入数据
{
scanf("%d %d",&val,&val2);
PNODE pNew = (PNODE)malloc(sizeof(NODE));
pNew->data1=val;
pNew->data2=val2;
pTail->pNext=pNew;
pNew->pNext=NULL;
pTail=pNew;}
return pHead;
}
//加法
PNODE add(PNODE p1,PNODE p2){
PNODE pHead = (PNODE)malloc(sizeof(NODE));
PNODE pTail=pHead;
pTail->pNext=NULL;
PNODE t1=p1->pNext;
PNODE t2=p2->pNext;
PNODE t3 =NULL;
while(t1&&t2){
t3 = (PNODE)malloc(sizeof(NODE));
if(t1->data2==t2->data2){
int sum=t1->data1+t2->data1;
if(sum!=0){
t3->data2=t1->data2;
t3->data1=sum;
pTail->pNext=t3;
t3->pNext=NULL;
pTail=t3;}
t1=t1->pNext;
t2=t2->pNext;
}
else if(t1->data2>t2->data2){
t3->data1=t1->data1;
t3->data2=t1->data2;
pTail->pNext=t3;
t3->pNext=NULL;
pTail=t3;
t1=t1->pNext;
}
else if(t1->data2<t2->data2){
t3->data1=t2->data1;
t3->data2=t2->data2;
pTail->pNext=t3;
t3->pNext=NULL;
pTail=t3;
t2=t2->pNext;
}
}
if(t2!=NULL){
while(t2){
t3 = (PNODE)malloc(sizeof(NODE));
t3->data1=t2->data1;
t3->data2=t2->data2;
pTail->pNext=t3;
t3->pNext=NULL;
pTail=t3;
t2=t2->pNext;
}
}
if(t1!=NULL){
while(t1){
t3 = (PNODE)malloc(sizeof(NODE));
t3->data1=t1->data1;
t3->data2=t1->data2;
pTail->pNext=t3;
t3->pNext=NULL;
pTail=t3;
t1=t1->pNext;
}
}
return pHead;
}
//乘法
PNODE mul(PNODE p1,PNODE p2){
PNODE pHead = (PNODE)malloc(sizeof(NODE));
PNODE pTail=pHead;
pTail->pNext=NULL;
PNODE t1=p1->pNext;
PNODE t2=p2->pNext;
PNODE t3 =NULL;
int c=0,e=0;
if(t1==NULL||t2==NULL){
return NULL;
}
while(t2){
t3 = (PNODE)malloc(sizeof(NODE));
t3->data2=t1->data2+t2->data2;
t3->data1=t1->data1*t2->data1;
pTail->pNext=t3;
t3->pNext=NULL;
pTail=t3;
t2=t2->pNext;
}
t1=t1->pNext;
while(t1){
t2=p2->pNext;//t2重新初始化
PNODE p=pHead;
while(t2){
c=t1->data1*t2->data1;
e=t1->data2+t2->data2;
while(p->pNext&&p->pNext->data2>e)//要求降序排列
{
p=p->pNext;}//p成为要插入位置前的一位,即插到p后面
if(p->pNext&&p->pNext->data2==e)//不需要申请新节点直接合并
{
if(p->pNext->data1+c){
p->pNext->data1=p->pNext->data1+c;
}
else{
PNODE t=p->pNext;
p->pNext=p->pNext->pNext;
free(t);
}
}
else{
PNODE tt= (PNODE)malloc(sizeof(NODE));//新的指数,需要创建新节点
tt->data1=c;
tt->data2=e;
tt->pNext=p->pNext;
p->pNext=tt;
p=p->pNext;
}
t2=t2->pNext;
}
t1=t1->pNext;
}
return pHead;
}
//遍历
void tra(PNODE pp){
PNODE p=pp->pNext;
if(p==NULL){
printf("0 0\n");
}
while(p->pNext!=NULL){
printf("%d %d ",p->data1,p->data2);
p=p->pNext;
}
printf("%d %d",p->data1,p->data2);
return ;
}
pta有两个测试点提示段错误怎么修改?
【以下回答由 GPT 生成】
在你的代码中,出现段错误的原因是因为在多项式相加的函数add
中有一个死循环。这个问题是由于你没有在循环中对t1
和t2
进行更新导致的,所以它们的值不会改变,循环无法退出。
要解决这个问题,你需要在循环中为t1
和t2
指针更新到下一个节点。在多项式相加的循环内部添加如下代码:
t1 = t1->pNext;
t2 = t2->pNext;
此外,你也需要为t1
和t2
添加结束循环的条件。在节点相加的while
循环开始部分添加如下代码:
while (t1 && t2)
这样当t1
或t2
为空指针时,循环就会退出。
修改后的add
函数代码如下:
PNODE add(PNODE p1, PNODE p2)
{
PNODE pHead = (PNODE)malloc(sizeof(NODE));
PNODE pTail = pHead;
pTail->pNext = NULL;
PNODE t1 = p1->pNext;
PNODE t2 = p2->pNext;
PNODE t3 = NULL;
while (t1 && t2)
{
t3 = (PNODE)malloc(sizeof(NODE));
if (t1->data2 == t2->data2)
{
int sum = t1->data1 + t2->data1;
if (sum != 0)
{
t3->data2 = t1->data2;
t3->data1 = sum;
pTail->pNext = t3;
t3->pNext = NULL;
pTail = t3;
}
}
t1 = t1->pNext;
t2 = t2->pNext;
}
return pHead;
}
在上述代码中,我添加了对t1
和t2
的更新,并在循环开始时添加了结束循环的条件。
此外,还有一个问题是在mul
函数中没有实现多项式的乘法运算。你可以尝试在mul
函数中根据多项式的乘法规则来编写代码。
综上所述,修改后的代码应该解决了段错误的问题,但仍然需要补充mul
函数来完整实现多项式的乘法运算。
【相关推荐】