02-线性结构2 一元多项式的乘法与加法运算

#pragma warning(disable:4996)

#include 
#include 

typedef struct Node *List;
struct Node
{
	int coef;//系数
	int expon;//指数
	List next;
};

List CreateList(int n);
List Mul(List list1,List list2);
List Add(List list1,List list2);
void Print(List L);

int main()
{
	List list1, list2,mul,add;
	int number1, number2;
	scanf("%d",&number1);
	list1 = CreateList(number1);
	scanf("%d",&number2);
	list2 = CreateList(number2);
	
	mul = Mul(list1,list2);
	add = Add(list1,list2);

	Print(mul);
	printf("\n");
	Print(add);

	return 0;
}

List CreateList(int n)
{
	List L,t,cycle;
	L = (List)malloc(sizeof(struct Node));
	L->next = NULL;
	t = L;
	for (int i=0;icoef);
		scanf("%d",&temp->expon);
		t->next = temp;
		t = temp;
		temp->next = NULL;
	}
	t->next = NULL;
	cycle = L;
	L = L->next;
	free(cycle);
	return L;
}

void Print(List L)
{
	if (!L)
	{
		printf("0 0");
	}
	else
	{
		printf("%d %d", L->coef, L->expon);
		L = L->next;
	}
	while (L)
	{
		printf(" %d %d",L->coef,L->expon);
		L = L->next;
	}
}

List Mul(List list1,List list2)
{
	List L,t,l1,l2;
	int flag;
	L = (List)malloc(sizeof(struct Node));
	L->next = NULL;
	flag = 0;
	l1 = list1;


	while (l1)
	{	
		List t2,t3,cycle;
		t2= (List)malloc(sizeof(struct Node));
		t2->next = NULL;
		t3 = t2;
		t = L;
		l2 = list2;
		while (l2)
		{
			List temp;
			temp = (List)malloc(sizeof(struct Node));
			temp->next = NULL;
			temp->coef = l1->coef * l2->coef;
			temp->expon = l1->expon + l2->expon;
			t3->next = temp;
			t3 = temp;
			l2 = l2->next;
		}
		cycle = t2;
		t2 = t2->next;
		free(cycle);

		if (flag == 0)
		{

			flag = 1;
			cycle = t;
			t = t ->next;
			free(cycle);
		}
		L = Add(t, t2);
		l1 = l1->next;
	}

	return L;
}

List Add(List list1, List list2)
{
	List L, t, cycle,l1,l2;
	L = (List)malloc(sizeof(struct Node));
	L->next = NULL;
	t = L;
	l1 = list1;
	l2 = list2;

	while (l1 && l2)
	{
		if (l1->expon>l2->expon)
		{
			List temp;
			temp = (List)malloc(sizeof(struct Node));
			temp->expon = l1->expon;
			temp->coef = l1->coef;
			if (temp->coef!=0)
			{
				t->next = temp;
				t = temp;
			}
			l1 = l1->next;
			temp->next = NULL;
		}
		else if (l1->expon < l2->expon)
		{
			List temp;
			temp = (List)malloc(sizeof(struct Node));
			temp->expon = l2->expon;
			temp->coef = l2->coef;
			if (temp->coef != 0)
			{
				t->next = temp;
				t = temp;
			}
			l2 = l2->next;
			temp->next = NULL;
		}
		else
		{
			List temp;
			temp = (List)malloc(sizeof(struct Node));
			temp->expon = l1->expon;
			temp->coef = l1->coef+l2->coef;
			if (temp->coef != 0)
			{
				t->next = temp;	
				t = temp;
			}
			l1 = l1->next;
			l2 = l2->next;
			temp->next = NULL;
		}
	}

	while (l1)
	{
		List temp;
		temp = (List)malloc(sizeof(struct Node));
		temp->expon = l1->expon;
		temp->coef = l1->coef;
		if (temp->coef != 0)
		{
			t->next = temp;
			t = temp;
		}
		l1 = l1->next;
		temp->next = NULL;
	}
	while (l2)
	{
		List temp;
		temp = (List)malloc(sizeof(struct Node));
		temp->expon = l2->expon;
		temp->coef = l2->coef;
		if (temp->coef != 0)
		{
			t->next = temp;
			t = temp;
		}
		l2 = l2->next;
		temp->next=NULL;
	}
	cycle = L;
	L = L->next;
	free(cycle);
	return L;
}

题源中国mooc

p.s:这个练习里变量还挺多的,大家多加注意。(来自一个debug,de了几个小时,最后发现是变量的区分后缀打错了人的自我感言。)

你可能感兴趣的:(数据结构,C语言,数据结构)