1程序设计

内容:

目录

内容:

算法分析

程序运行流程图如下:

测试

1.两个多项式的相加运算和相减运算

 2.两个单链表的集合的差


  1. 完成两个多项式的相加操作和相减操作:已知有两个多项式P,Q,设计算法实现P+Q运算,而且对加法运算不重新开辟存储空间。要求用链式存储结构实现。例如P=5x*3+2x+1,Q=3x*3+x*2-2x-3,其计算输出结果为:8x*3+x*2-2
  2. 用单链表表示集合,假设集合A用单链表LA表示,集合B用单链表LB来表示,设计算法求两个集合的差

算法分析

       本题要完成的是两个多项式的相加操作与相减操作,那么首先就要对单链表进行操作,所以首先需要将两个单链表先进行空表调整,然后在利用所写函数对单链表进行内容的补充,得到自己想要的两个单链表。

       接下来一步就是要对两个单链表中的数值进行比较,如果系数相同而指数不同,则不能相加  或者进行相减操作,如果指数相同的情况下,分为两种情况,如果系数之和或者系数之差为0,则可以释放该点P,Q处地址的值,如果系数之和或者系数之差不为0,则结果存入P中,同时删除结点Q。最后进行输出。

   本体要用单链表来表示两个集合的差,由几个运算的规则可知,集合的差A中包含所有属于集合A而不属于集合B的元素。具体做法是,对于集合A中的每个元素e,在集合B的链表LB中进行查找,若找到与e相同的元素,则从LA中将其删除,所以需要先建立两个单链表,然后利用尾插法为两个单链表进行赋值,最后利用所写函数进行比较,判断两个集合的差,最后输出集合的差。

程序运行流程图如下:


#include <stdio.h>
#include <malloc.h>
#include<stdlib.h>
typedef struct poly {
	int exp;    //指数幂
	int coef; //系数
	struct poly* next;//指针域
} PNode, * PLinklist;
int Init(PLinklist* head)//初始化一个空链表
	{
		*head = (PLinklist)malloc(sizeof(PNode));//初始化一个空链
		if (*head)
		{
			(*head)->next = NULL;//初始化链表,将下一个节点指向NULL表示链表为空
			return 1;
		}
		else
			return 0;
	}
	int CreateFromTail(PLinklist* head)//创立一个尾插法的函数
	{
		PNode* pTemp, * pHead;//声明两个节点
		int c;
		int exp;
		int i = 1;
		pHead = *head;
		scanf_s("%d,%d", &c, &exp);
		while (c != 0)//当系数为0时退出循环
		{
			pTemp = (PLinklist)malloc(sizeof(PNode));//初始化节点
			if (pTemp)
			{
				pTemp->exp = exp;//接受指数
				pTemp->coef = c;//接受系数
				pTemp->next = NULL;
				pHead->next = pTemp;
				pHead = pTemp;
				scanf_s("%d,%d", &c, &exp);
			}
			else
				return 0;
		}
		return 1;
	}
	void Polyadd(PLinklist LA, PLinklist LB)//两个多项式相加,该方法中两个表都是按指数顺序增长
	{
		PNode* LA1 = LA->next;//用于在LA中移动	
		PNode* LB1 = LB->next;//用于在LB中移动
		PNode* temp;//保存要删除的节点
		int sum = 0;//存放系数的和
		while (LA1 && LB1)
		{
			if (LA1->exp < LB1->exp)//若LA1->exp < LB1->exp,则LA1所指节点为多项式中的一项,LA1指针在原来基础上向后移动一个位置
			{
				LA->next = LA1;
				LA = LA->next;
				LA1 = LA1->next;
			}
		 else if (LA1->exp == LB1->exp)//若LA1->exp == LB1->exp,将相对应的系数相加,然后分两种情况处理,如果系数和为0,则释放LA1和LB1所指向的结点;若系数和部位0,则修改LA1所指向结点的系数与,释放LB1结点
		{
			sum = LA1->coef + LB1->coef;//系数之和
			if (sum)//系数和不为0,结果存入LA1中,同时删除结点LB2
			{
			LA1->coef = sum;
			LA->next = LA1;
			LA = LA->next;
			LA1 = LA1->next;
			temp = LB1;
			LB1 = LB1->next;
			free(temp);
			}
		else//系数为0 情况先删除两个结点
		{
			temp = LA1;
			LA1 = LA1->next;
			free(temp);
			temp = LB1;
			LB1 = LB1->next;
			free(temp);
		}
	}
		 else //若LA1->exp > LB1->exp,则LB1所指节点为多项式中的一项,LB1指针在原来基础上向后移动一个位置
		{
				LA->next = LB1;
				LA = LA->next;
				LB1 = LB1->next;
		}
	}
		if (LA1)//将剩余结点链入链表
			LA->next = LA1;
		else
		{
			LA->next = LB1;
		}
}
	
	void Print(PLinklist head) //输出多项式
	{
		head = head->next;
		while (head) 
		{
			if (head->exp)
				printf("%dx^%d", head->coef, head->exp);
			else
				printf("%d", head->coef);
			if (head->next)
				printf("+");
			else
				break;
			head = head->next;
		}
	}
	void Polycut(PLinklist LA, PLinklist LB)
	{
		PNode* LA1 = LA->next;//用于在LA中移动	
		PNode* LB1 = LB->next;//用于在LB中移动
		PNode* temp;//保存要删除的节点
		int min = 0;//存放系数的差
		while (LA1 && LB1)
		{
			if (LA1->exp < LB1->exp)//若LA1->exp < LB1->exp,则LA1所指节点为多项式中的一项,LA1指针在原来基础上向后移动一个位置
			{
				LA->next = LA1;
				LA = LA->next;
				LA1 = LA1->next;
			}
			else if (LA1->exp == LB1->exp)//若LA1->exp == LB1->exp,将相对应的系数相加,然后分两种情况处理,如果系数和为0,则释放LA1和LB1所指向的结点;若系数和部位0,则修改LA1所指向结点的系数与,释放LB1结点
			{
				min = LA1->coef - LB1->coef;//系数之差
				if (min)//系数差不为0,结果存入LA1中,同时删除结点LB2
				{
					LA1->coef = min;
					LA->next = LA1;
					LA = LA->next;
					LA1 = LA1->next;
					temp = LB1;
					LB1 = LB1->next;
					free(temp);
				}
				else//系数为0 情况先删除两个结点
				{
					temp = LA1;
					LA1 = LA1->next;
					free(temp);
					temp = LB1;
					LB1 = LB1->next;
					free(temp);
				}
			}
		}
	}
	void main() 
	{
		PLinklist LA;//多项式链表LA
		PLinklist LB;//多项式链表LB
		Init(&LA);//初始化LA
		Init(&LB);//初始化LB
		printf("输入第一个多项式的系数,指数例如(10,2)输入0,0结束输入\n");
		CreateFromTail(&LA);//利用尾插法输入
		printf("输入第二个多项式的系数,指数例如(10,2)输入0,0结束输入\n");
		CreateFromTail(&LB);//利用尾插法输入
		Print(LA);
		printf("\n");
		Print(LB);
		printf("\n");
		Polyadd(LA,LB);//两个多项式相加
		printf("两个多项式相加的结果:\n");
		Print(LA);
		printf("\n");
		PLinklist LC;//多项式链表LC
		PLinklist LD;//多项式链表LD
		Init(&LC);//初始化LC
		Init(&LD);//初始化LD
		printf("输入第一个多项式的系数,指数例如(10,2)输入0,0结束输入\n");
		CreateFromTail(&LC);//利用尾插法输入
		printf("输入第二个多项式的系数,指数例如(10,2)输入0,0结束输入\n");
		CreateFromTail(&LD);//利用尾插法输入
		Print(LC);
		printf("\n");
		Print(LD);
		printf("\n");
		Polycut(LC, LD);//两个多项式相减
		printf("两个多项式相减的结果:\n");
		Print(LC);
		printf("\n");

	}

#include<stdio.h>
#include<malloc.h>
typedef struct linklist//设立一个单链表
{
	int e;
	struct linklist* next;
}PNode,*Plinklist;
void Difference(Plinklist LA, Plinklist LB)//将两个单链表进行比较然后在进行减法
{
	Plinklist pre, p, r,q;
	pre = LA;
	p = LA->next;
	while (p != NULL)
	{
		q = LB->next;
		while (q != NULL && q->e != p->e)
			q = q->next;
		if (q != NULL)
		{
			r = p;
			pre->next = p->next;
			p = p->next;
			free(r);//删除相同的元素
		}
		else
		{
			pre = p;
			p = p->next;
		}
	}
}
void Print(Plinklist LA)//输出单链表
{
	LA = LA->next;
	while (LA)
	{
		printf("  %d  ",LA->e);
		LA= LA->next;
	}
}
int kong(Plinklist *LA)//将链表为空
{
	(*LA) = (Plinklist)malloc(sizeof(PNode));
	if (*LA)
	{
		(*LA)->next = NULL;
		return 1;
	}
	else
		return 0;
}
int Createfromtail(Plinklist LA)//利用尾插法创建一个单链表
{
	PNode* p,*q;
	int c;
	q = LA;
	scanf_s("%d",&c);
	while (c != 9999)
	{
		p = (Plinklist)malloc(sizeof(PNode));
		if (p)
		{
			p->e = c;
			p->next = NULL;
			q->next = p;
			q = p;
			scanf_s("%d", &c);
		}
		else
			return 0;
	}
	return 1;
}
int main() 
{
	Plinklist LA;
	Plinklist LB;
	kong(&LA);
	kong(&LB);
	printf("请输入LA中集合的数,输入9999表示退出");
	Createfromtail(LA);
	printf("请输入LB中集合的数,输入9999表示退出");
	Createfromtail(LB);
	Difference(LA,LB);
	Print(LA);

}	

测试

1.两个多项式的相加运算和相减运算

 2.两个单链表的集合的差

结果截图:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值