
#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有两个测试点提示段错误怎么修改?