数据结构总结3——线性表——链表2之多项式运算 by DexterYan

一、基础知识

二、实现代码

#include<stdio.h>
#include<stdlib.h>
typedef  struct PolyNode//构造数据类型 
{
	int coef;//系数域
	int exp;//指针域
	struct PolyNode *next; 
}*PolyList;
void menu(); 
PolyList createPoly();//创建多项式带头结点 
void PolyAdd(PolyList PA,PolyList PB);
PolyList PolyMultiply(PolyList PA,PolyList PB);
void printPoly(PolyList head);
void sort(PolyList head);//针对输入无序数列 
void Polycom(PolyList head);//同类项合并函数 
int main()
{
	PolyList PA,PB,PC;
	printf("请输入第一个多项式:\n");
	PA=createPoly();
	printf("请输入第二个多项式:\n");
	PB=createPoly();
	printf("多项式 A:\n");
	printPoly(PA);
	printf("多项式 B:\n");
	printPoly(PB);
	PC=PolyMultiply(PA,PB);
	printf("多项式积:\n");
	//printPoly(PC);//调试用 
	sort(PC);
	//printPoly(PC);//调试用 
	Polycom(PC);//合并同类项 
	printPoly(PC);
	sort(PA);
	sort(PB);
	PolyAdd(PA,PB);
	printf("多项式和:\n");
	printPoly(PA);
	return 0;
}

void menu()
{
	printf("请选择您要使用的运算:\n");
	printf("1、加法\n");
	printf("2、乘法\n");
}

PolyList createPoly()
{
	PolyList head,p,tail;
	int ic,ie;
	head=(PolyList)malloc(sizeof(struct PolyNode));
	head->next=NULL;
	tail=head;
	printf("请按(系数,指数)格式输入系数和指数,结束输入请输入0......\n");
	scanf("%d,%d",&ic,&ie);
	while(ic!=0)
	{
		p=(PolyList)malloc(sizeof(struct PolyNode));
		p->coef=ic;
		p->exp=ie;
		tail->next=p;
		tail=p;
		tail->next=NULL;
		scanf("%d,%d",&ic,&ie);
	}
	return head;
}

void PolyAdd(PolyList PA,PolyList PB)
{
	PolyList pa,pb,tail,s;
	int sum;
	pa=PA->next;
	pb=PB->next;//pa,pb开始指向数据 
	tail=PA;//第70行注释 
	PB->next=NULL;
	while(pa!=NULL&&pb!=NULL)
	{
		if(pa->exp<pb->exp)
		{
			tail->next=pa;//pa的第一个指数小于pb,所以要把pa的放在前边 
			tail=pa;
			pa=pa->next;
		}/*两两比较 指数小的放前边 
		*/ 
		else if(pa->exp>pb->exp)
		{
			tail->next=pb;//仔细看p53页图的连接关系,tail为和链表的尾指针,也就相当于刷新了PA使其作为和链表 
			tail=pb;
			pb=pb->next;
		}
		else//指数相等的情况,系数相加 
		{
			sum=pa->coef+pb->coef;
			if(sum!=0)//如果系数不为零 
			{
				pa->coef=sum;
				tail->next=pa;
				tail=pa;//把和链表的尾指针连到pa上,释放相同指数无用的pb 
				pa=pa->next;
				s=pb;
				pb=pb->next;
				free(s);
			}
			else//系数为零 
			{
				s=pa;
				pa=pa->next;
				free(s);
				s=pb;
				pb=pb->next;
				free(s);//两个指针后移并释放 
			}
		}
	}
	if(!pa&&!pb)//恰好多项式AB都处理完 
		tail->next=NULL;//将和链表尾指针置空 
	if(pa!=NULL)
		tail->next=pa;
	if(pb!=NULL)
		tail->next=pb;//那个没处理完将余项连到后边 
}

PolyList PolyMultiply(PolyList PA,PolyList PB)
{
	PolyList pa,pb,temp,pc,tail;
	int pro;
	pc=(PolyList)malloc(sizeof(struct PolyNode));
	pc->next=NULL;
	tail=pc;
	pa=PA->next;
	pb=PB->next;
	
	if(pa==NULL||pb==NULL)
		printf("某多项式为空,因此多项式乘积为空\n");
	//先相乘组合成一个新链表,然后排序合并同类项函数
	//pa中的第一项乘pb中的每一项行形成一个新的多项式
	while(pa)
	{
		pb=PB->next;
		while(pb)
		{
			temp = (PolyList)malloc(sizeof(struct PolyNode));
			temp->coef = pa->coef*pb->coef;
			temp->exp = pa->exp+pb->exp;
			tail->next = temp;
			tail = temp;
			tail->next = NULL;
			pb = pb->next;
		}
		pa=pa->next;
	}
	return pc;
}

void sort(PolyList head)//递增排序 
{
	PolyList p,q,temp;
	temp=(PolyList)malloc(sizeof(struct PolyNode)); 
	for(p=head->next;p!=NULL;p=p->next)
	{
		for(q=p;q!=NULL;q=q->next)
		{
			if(p->exp>q->exp)
			{
				temp->coef=p->coef;	temp->exp=p->exp;
				p->coef=q->coef;	p->exp=q->exp;
				q->coef=temp->coef;	q->exp=temp->exp;
			}
		}
	} 
}

void Polycom(PolyList head)
{
	PolyList p,q,temp;
	if(head->next==NULL)
		return;
	else
	{
		p=head->next;
		q=p->next;
		for(;p->next!=NULL;p=p->next)
		{
			q=p->next;
			while(q->exp==p->exp)//合并并删除后一项 
			{
				p->coef=p->coef+q->coef;
				temp=q;
				q=q->next;
				p->next=q;
				free(temp);
			}
		}
	}
}

void printPoly(PolyList head)
{
	PolyList p;
	int m=0;
	p=head->next;
	while(p!=NULL)
	{
		printf("\t%5d%5d",p->coef,p->exp);
		p=p->next;
		m++;
		if(m%4==0)
			printf("\n");
	}
	printf("\n\n\t多项式项数 m=%d\n",m);
	system("pause");//暂停,显示浏览结果 
}

过程遇到的问题及反思
1、一开始没有乘法
2、乘法遇到指数为0的时候遇到了未知错误
3,合并同类项出了差错
4、合并同类项修改完毕,加法的合并又出了问题(我决定改变主程序菜单,使其一次只执行一个函数,不互相影响,以免发生未知bug)

猜你喜欢

转载自blog.csdn.net/qq_41259302/article/details/90522858
今日推荐