zoukankan      html  css  js  c++  java
  • 一元多项式的乘法与加法运算

    直接上代码:

    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #include<stdlib.h>
    
    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("
    ");
    	sum = FunSum(L1, L2);
    	traverse(sum);
    	system("pause");
    	return 0;
    }
    
    List * CreatList()
    {
    	int len;
    	List *p = (List *)malloc(sizeof(List));
    	List *temp1, *temp2 = p;
    
    	scanf("%d", &len);				//链表长度
    	
    	for (int i = 0; i < len; i++)
    	{
    		temp1 = (List *)malloc(sizeof(List));
    		scanf("%d", &temp1->m);		//系数m
    		scanf("%d", &temp1->n);		//指数
    		temp2->next = temp1;
    		temp2 = temp2->next;
    	}
    	temp2->next = NULL;
    
    	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;		//比temp3慢一步的指针
    	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)		//如果系数为0,那么这一项不存在
    			{
    				temp3 = temp4;		//temp3返回到上一个节点
    				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)		//如果其中一个多项式是0,那么乘积是0
    	{
    		head->next = NULL;
    		return head;
    	}
    	List *temp3, *temp4;
    	temp3 = temp4 = head;
    	List * temp = NULL;
    
    	while (NULL != temp1)		//用q的第一个元素乘以p的每一个元素,生成的第一轮的表
    	{
    		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)
    			{
    				//直到temp->n >= temp3->n时才插入
    				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)	//如果系数为0,那么删除这一项
    					{
    						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;
    	}
    }
    

    上次合并链表的时候,是在原节点上进行的操作,最终导致原链表的丢失。这次的加法和乘法操作,只能是复制原节点,否则破坏掉原节点后,下一个运算就无法进行了。需要注意的一点是:同类型合并的过程中可能会产生系数为0的项,这时候必须删除这一项。删除掉节点后记得释放掉这块空间,否则导致内存泄漏。这个内存泄漏在C/C++中是非常严重的一件事。算法本身很直接,写起来可能麻烦点,但是没有什么值得说的。

  • 相关阅读:
    1058 A+B in Hogwarts (20)
    1046 Shortest Distance (20)
    1061 Dating (20)
    1041 Be Unique (20)
    1015 Reversible Primes (20)(20 分)
    pat 1027 Colors in Mars (20)
    PAT 1008 Elevator (20)
    操作系统 死锁
    Ajax的get方式传值 避免& 与= 号
    让IE浏览器支持CSS3表现
  • 原文地址:https://www.cnblogs.com/zy666/p/10504291.html
Copyright © 2011-2022 走看看