#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
typedef struct Node List;
struct Node
{
int m;
int n;
List * next;
} ;
List * CreatList ( ) ;
List * FunSum ( List* p, List* q) ;
List * FunMult ( List* p, List* q) ;
void traverse ( List * p) ;
int main ( )
{
List * L1, * L2;
List * sum, * mult;
L1 = CreatList ( ) ;
L2 = CreatList ( ) ;
mult = FunMult ( L1, L2) ;
traverse ( mult) ;
printf ( "\n" ) ;
sum = FunSum ( L1, L2) ;
traverse ( sum) ;
system ( "pause" ) ;
return 0 ;
}
List * CreatList ( )
{
List * p;
p = ( List* ) malloc ( sizeof ( struct Node) ) ;
List * t2= p, * t1;
int len;
cin >> len;
for ( int i = 0 ; i < len; i++ )
{
t1 = ( List * ) malloc ( sizeof ( struct Node) ) ;
cin >> t1- > m;
cin >> t1- > n;
t2- > next = t1;
t2 = t2- > next;
}
t2- > next = nullptr ;
return p;
}
List * FunSum ( List * p, List * q)
{
List * head = ( List * ) malloc ( sizeof ( List) ) ;
List * temp1 = p- > next;
List * temp2 = q- > next;
List * temp, * temp3 = head;
List * temp4 = head;
while ( NULL != temp1 && NULL != temp2)
{
temp = ( List * ) malloc ( sizeof ( List) ) ;
temp3- > next = temp;
temp3 = temp3- > next;
if ( temp1- > n > temp2- > n)
{
temp- > m = temp1- > m;
temp- > n = temp1- > n;
temp1 = temp1- > next;
}
else if ( temp1- > n == temp2- > n)
{
temp- > n = temp2- > n;
temp- > m = temp2- > m + temp1- > m;
if ( 0 == temp- > m)
{
temp3 = temp4;
free ( temp) ;
}
temp2 = temp2- > next;
temp1 = temp1- > next;
}
else if ( temp1- > n < temp2- > n)
{
temp- > m = temp2- > m;
temp- > n = temp2- > n;
temp2 = temp2- > next;
}
temp4 = temp4- > next;
}
if ( NULL == temp1)
{
while ( NULL != temp2)
{
temp = ( List * ) malloc ( sizeof ( List) ) ;
temp3- > next = temp;
temp3 = temp3- > next;
temp- > m = temp2- > m;
temp- > n = temp2- > n;
temp2 = temp2- > next;
}
temp3- > next = NULL ;
}
else
{
while ( NULL != temp1)
{
temp = ( List * ) malloc ( sizeof ( List) ) ;
temp3- > next = temp;
temp3 = temp3- > next;
temp- > m = temp1- > m;
temp- > n = temp1- > n;
temp1 = temp1- > next;
}
temp3- > next = NULL ;
}
return head;
}
List * FunMult ( List * p, List * q)
{
List * head = ( List * ) malloc ( sizeof ( List) ) ;
List * temp1, * temp2;
temp1 = p- > next;
temp2 = q- > next;
if ( NULL == temp1 || NULL == temp2)
{
head- > next = NULL ;
return head;
}
List * temp3, * temp4;
temp3 = temp4 = head;
List * temp = NULL ;
while ( NULL != temp1)
{
temp = ( List * ) malloc ( sizeof ( List) ) ;
temp- > m = temp1- > m * temp2- > m;
temp- > n = temp1- > n + temp2- > n;
temp3- > next = temp;
temp3 = temp3- > next;
temp1 = temp1- > next;
}
temp3- > next = NULL ;
temp2 = q- > next- > next;
while ( NULL != temp2)
{
temp1 = p- > next;
while ( NULL != temp1)
{
temp4 = head;
temp3 = head- > next;
temp = ( List * ) malloc ( sizeof ( List) ) ;
temp- > m = temp2- > m * temp1- > m;
temp- > n = temp2- > n + temp1- > n;
while ( NULL != temp3)
{
if ( temp- > n > temp3- > n)
{
temp- > next = temp3;
temp4- > next = temp;
break ;
}
else if ( temp- > n == temp3- > n)
{
temp3- > m + = temp- > m;
if ( 0 == temp3- > m)
{
temp4- > next = temp3- > next;
free ( temp3) ;
}
free ( temp) ;
break ;
}
temp4 = temp4- > next;
temp3 = temp3- > next;
}
if ( NULL == temp3)
{
temp4- > next = temp;
temp- > next = NULL ;
}
temp1 = temp1- > next;
}
temp2 = temp2- > next;
}
return head;
}
void traverse ( List * p)
{
List * temp = p- > next;
if ( NULL == temp)
{
printf ( "0 0" ) ;
return ;
}
else
{
printf ( "%d %d" , temp- > m, temp- > n) ;
temp = temp- > next;
}
while ( NULL != temp)
{
printf ( " %d %d" , temp- > m, temp- > n) ;
temp = temp- > next;
}
}