PTA一元多项式的加法与乘法出错?

运行正确但是提交

#include <stdio.h>
#include <stdlib.h>

typedef struct LNode{
	int coef;
	int exp;
	struct LNode *Next;
}LNode, *LinkList;

LinkList L1, L2, L3;

void InitPolyn(LinkList &L)
{
	LinkList p = (LinkList)malloc(sizeof(LNode));
	L = p;
	L->Next = NULL;
}

void CreatPolyn(LinkList &L, int m)
{
	LinkList s;
	L = (LinkList)malloc(sizeof(LNode));
	s = L;
	for(int i = 0; i < m; i++)
	{
		LinkList p = (LinkList)malloc(sizeof(LNode));
		scanf("%d%d", &p->coef, &p->exp);
		s->Next = p;
		s = p;
		s->Next = NULL;
	}
}

void DestoryPolyn(LinkList &L)
{
	LinkList p;
	p = L;
	while(p)
	{
		p = p->Next;
		free(L);
		L = p;
	}
}

void PrintPolyn(LinkList &L)
{
	int flag = 0;//flag is used to control the format of output 
	LinkList p;
	p = L->Next;
	if(p == NULL)
	{	
		printf("0 0\n");
		return;
	}
	while(p)
	{
		if(!flag) 
			flag = 1;
		else
			printf(" ");
		printf("%d %d", p->coef, p->exp);
		p = p->Next;
	}
}

LinkList BeforeNode(LinkList L, LinkList p)
{
	LinkList r = L;
	while(r->Next != p)
		r = r->Next;
	return r;
}

int compare(int a, int b)
{
	if(a > b)
		return 1;
	else if(a == b)
		return 0;
	else
		return -1;
}

LinkList InsertPolyn(LinkList &L, LinkList p)
{
	LinkList r, s;
	r = L;
	while(r->Next != p)
	{
		r = r->Next;
	}
	if(r->Next == p)
	{
		s = (LinkList)malloc(sizeof(LNode));
		r->Next = s;
		s->Next = p;
	}
	return s;
}

LinkList DeletePolyn(LinkList &L, LinkList p)
{
	LinkList r = L;
	while(r->Next != p)
	{
		r = r->Next;
	}
	if(r->Next == p)
	{
		r->Next = p->Next;
		free(p);
	}
	r = r->Next;
	return r;
}

void AddPolyn(LinkList &L1, LinkList &L2)
{
	LinkList p1, p2;
	p1 = L1->Next;
	p2 = L2->Next;
	while(p1 && p2)
	{
		switch(compare(p1->exp, p2->exp))
		{
			case -1:
				p1 = InsertPolyn(L1, p1);
				p1->coef = p2->coef;
				p1->exp = p2->exp;
				p2 = p2->Next;
				break;
			case 0:
				if(p1->coef + p2->coef == 0)
				{
					p1 = DeletePolyn(L1, p1);
					p2 = p2->Next;
				}
				else
				{
					p1->coef += p2->coef;
					p1 = p1->Next;
					p2 = p2->Next;
				}
				break;
			case 1:
				p1 = p1->Next;
				break;
		}
	}
	if(p2)
	{
		p1 = BeforeNode(L1, p1);
		p1->Next = p2?p2:p1; 
	}
}

LinkList MultiplyPolyn(LinkList &L1, LinkList &L2, LinkList &L3)
{
	LinkList Rear, p1, p2, p;
	int coef, exp;
	if(!L1 && !L2)
		return NULL;
	p1 = L1->Next;
	p2 = L2->Next;
	Rear = L3;
	while(p2)
	{
		LinkList r;
		r = (LinkList)malloc(sizeof(LNode));
		r->coef = p1->coef * p2->coef;
		r->exp = p1->exp + p2->exp;
		r->Next = NULL;
		Rear->Next = r;
		Rear = r;
		p2 = p2->Next;
	}
	while(p1)
	{
		p2 = L2->Next;
		Rear = L3->Next;
		while(p2)
		{
			exp = p1->exp + p2->exp;
			coef = p1->coef * p2->coef;
			while(Rear->Next && Rear->Next->exp > exp)
				Rear = Rear->Next;
			if(Rear->Next && Rear->Next->exp == exp)
			{
				if(Rear->Next->coef + coef != 0)
					Rear->Next->coef += coef;
				else
				{
					p = Rear->Next;
					Rear->Next = p->Next;
					free(p);
				}
			}
			else
			{
				p = (LinkList)malloc(sizeof(LNode));
				p->coef = coef;
				p->exp = exp;
				p->Next = Rear->Next;
				Rear->Next = p;
				Rear = Rear->Next;
			}
			p2 = p2->Next;
		}
		p1 = p1->Next;
	}
	p2 = L3;
	L3 = L3->Next;
	free(p2);
	p = L3->Next;
	while(p->Next)
	{
		if(p->Next->coef == 0)
		{
			p->Next = p->Next->Next;
		}
		p = p->Next;
	}
	return L3;
}

int main()
{
	int m, n;
	InitPolyn(L1);
	InitPolyn(L2);
	InitPolyn(L3);
	scanf("%d", &m);
	CreatPolyn(L1, m);
	scanf("%d", &n);
	CreatPolyn(L2, n);
	L3 = MultiplyPolyn(L1, L2, L3);
	AddPolyn(L1, L2);
	PrintPolyn(L3);
	printf("\n");
	PrintPolyn(L1);
}

总是答案出错,实在找不出问题了,求大佬帮助