数据结构第二次上机实验【链表实现多项式的加法和乘法】

利用链表实现一元多项式的加法和乘法

#define null 0
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
int op;
typedef struct
{
     float coef;//系数
     int expn;//指数
}term;

typedef struct Lnode
{
	term data;
	Lnode *next;
}*Link,*Linklist;

int cmp(term a,term b)//将指数从小到大排序
{
	if (a.expn==b.expn)
	    return 0;
	else
	    return (a.expn-b.expn)/abs(a.expn-b.expn);
}
void Orderinsert(Linklist &L,term e,int (*comp)(term,term))//直接将输入的项数和指数放入链表(没有可以合并的项)
{
	Link o,p,q;
	q=L;
	p=q->next;
	while (p&&comp(p->data,e)<0)
	{
	    q=p;
		p=p->next;
	}
	o=(Link)malloc(sizeof(Lnode));
	o->data=e;
	q->next=o;
	o->next=p;
}
void chengfa(Linklist &L1,Linklist &L2,Linklist &L3)
{
	L3 = (Link)malloc(sizeof(Lnode));
    L3->next = null;
    Link S = L1->next;
    term s, e;
	while(S)
	{
		s.coef=S->data.coef;
		s.expn=S->data.expn;
		Link Q=L2->next;
		while(Q)
		{
			e.coef = s.coef * Q->data.coef;
            e.expn = s.expn + Q->data.expn;
            Orderinsert(L3,e,cmp);
            Q=Q->next;
		}
		S=S->next;
	}
}
int LocateElem(Linklist L,term e,Link &s,Link &q,int (*comp)(term,term))//判断是否有可以合并的项
{
	Link p;
	s=L;
	p=s->next;
	while (p&&comp(p->data,e)!=0)
	{
		s=p;
		p=p->next;
	}
	if(!p)
	{
		s=q=null;
		return 0;
	}
	else
	{
		q=p;
		return 1;
	}
}
void Delnext(Linklist &L,Link s)
{
	Link q=s->next;
	 s->next=q->next;
	 free(q);
}

void Orderinsertmerge(Linklist &L,term e,int (*compara)(term,term))//将同一个多项式里相同的项合并
{
	Link q,s;
	if (LocateElem(L,e,s,q,compara))
	{
		q->data.coef+=e.coef;
		if (!q->data.coef)
		{
		  Delnext(L,s);
	    }
	}
	else
	    Orderinsert(L,e,compara);
}

void Creatpolyn (Linklist &p,int m)//输入多项式的系数和指数
{
	 term e;
	 int i;
	 p=(Link)malloc(sizeof(Lnode));//给链表开拓空间
	 p->next=null;
	 printf("\n请输入%d个系数和指数用空格符间隔:\n",m);
	 for(i=1;i<=m;i++)
 	{
	 	scanf("%f%d",&e.coef,&e.expn);
  		Orderinsertmerge(p,e,cmp);//将输入的多项式中可以合并的项合并
  	}
}
void add(Linklist &La,Linklist Lb)//合并两个多项式
{
	Link qb;term b;
	 qb=Lb->next;
	 while(qb)
	 {
		 b=qb->data;
		 Orderinsertmerge(La,b,cmp);
		 qb=qb->next;
	 }
	 //销毁链表Lb
}
void fuzhi(Linklist &Lc,Linklist La)
{
	Lc=(Link)malloc(sizeof(Lnode));
	Lc->next=null;
	Link S=La->next;
	term e;
	while(S)
	{
		e.coef=S->data.coef;
		e.expn=S->data.expn;
		Orderinsertmerge(Lc,e,cmp);
		S=S->next;
	}
}
void printpolyn(Linklist p)//打印出相加后的多项式
{
	Link q;
	q=p->next;
	int t=0;
	while(q)
	{
		if(t==0)
		{
			if(q->data.coef==1)
			    printf("x^%d",q->data.expn);
		    else if(q->data.coef==-1)
		        printf("-x^%d",q->data.expn);
			else if(q->data.coef>0)
			    printf("%.2f*x^%d",q->data.coef,q->data.expn);
			else if(q->data.coef<0)
			    printf("%.2f*x^%d",q->data.coef,q->data.expn);
		}
		else
		{
			if(q->data.coef==1)
			    printf("+x^%d",q->data.expn);
		    else if(q->data.coef==-1)
		        printf("-x^%d",q->data.expn);
			else if(q->data.coef>0)
			    printf("+%.2f*x^%d",q->data.coef,q->data.expn);
			else if(q->data.coef<0)
			    printf("%.2f*x^%d",q->data.coef,q->data.expn);
		}
	 	q=q->next;
	 	t++;
	}
}
int main()
{
	int x;
	Linklist L1,L2,L3;
	printf("\n请输入第一个一元多项式的项数:");
	scanf("%d",&x);
	Creatpolyn(L1,x);
	printf("\n请输入第二个一元多项式的项数:");
	scanf("%d",&x);
	Creatpolyn(L2,x);
	fuzhi(L3,L1);
	add(L3,L2);
	printf("\n相加以后的一元多项式为:\n");
	printpolyn(L3);
	printf("\n相乘以后的一元多项式为:\n");
	chengfa(L1,L2,L3);
	printpolyn(L3);
    return 0;
}

  

时间: 2024-08-08 17:51:28

数据结构第二次上机实验【链表实现多项式的加法和乘法】的相关文章

软件测试第二次上机实验

这次上机我们主要使用Selenium进行自动化测试,首先我们需要下载selenium-java的依赖项. 若使用maven管理项目,则在.pom文件中加入如下依赖项: <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>2.53.0</version> </dep

算法第二章上机实验报告

1.实践题目 7-1 二分查找 (20 分) 输入n值(1<=n<=1000).n个非降序排列的整数以及要查找的数x,使用二分查找算法查找x,输出x所在的下标(0~n-1)及比较次数.若x不存在,输出-1和比较次数. 输入格式: 输入共三行:第一行是n值:第二行是n个整数:第三行是x值. 输出格式: 输出x所在的下标(0~n-1)及比较次数.若x不存在,输出-1和比较次数. 输入样例: 4 1 2 3 4 1 输出样例: 0 2 2.问题描述 本道题是让我们输入非降序排列的整数,也就是说是排好

0916 编译原理第二次上机实验

#include<stdio.h>#include<string.h>void Fenxi(char c,char b);void word(char a[]);void number(char a[]);int i;  //定义全局变量iint s=1; //用来记录是否存在非法字符main(){    char a[50];    printf("请输入源程序:");    gets(a);    printf("您要分析的源程序为:")

第二章上机实验报告

1.实践题目:7-1 2.问题描述:使用二分查找算法在n个非降序排列的整数中查找x,输出x所在的下标(0~n-1)及比较次数.若x不存在,输出-1和比较次数. 3.算法描述:将n个元素分成个数大致相同的两半,取a[mid]与x比较.如果x=a[mid],则找到x,算法终止:如果x<a[mid],则只在数组a的左半部继续查找x,如果x>a[mid],则只在a的右半部继续搜索x.同时,在while语句里加一个b统计比较次数. 4.代码如下: 1 #include<iostream> 2

单向链表实现多项式加和乘--自己写数据结构

用单项链表实现多项式数据结构和代码如下(由于时间原因多项式乘法的函数没用实现,读者可以在自己完善): 存放结构体的头文件polylist.h #ifndef _H_POLYLIST_ #define _H_POLYLIST_ typedef struct _Poly_Node { int ratio; //系数 int power; //幂 struct _Poly_Node* next; }Node,*pNode; typedef struct _Poly_List { struct _Pol

数据结构之利用单向链表实现多项式加法和乘法

在<数据结构与算法分析--c语言描述>一书中,作者指出了使用单向链表作为实现多项式的方法.但是没有给出具体实现.下面自己对其进行实现.只考虑功能.对其他细节不暂时不考虑.程序完成两个功能,使用单向链表完成多项式的加法和乘法.首先看加法,解决加法问题的思想在于对表示进行操作的两个链表表示的多项式按照指数递减的结构排列,每个节点的数据域存储着多项式某一项的系数(Coefficient)和指数(Exponent),还有一个指向后继节点的指针.节点的实现如下: 1 typedef struct Nod

链表实现多项式操作

最近看了weiss的数据结构,想记录一下自己的代码,这里是一个关于链表实现多项式的相关操作./**************************************@function:数据结构第三章,链表实现多项式的加减,乘也是类似,只不过还要合并,合并比较麻烦:*@data:2015/5/8*@Author:lss************************************/#include #include using namespace std;#define N1 2

单链表实现多项式的表示及运算

单链表实现多项式的加法运算 最近学习数据结构的线性表,有顺序存储和链表两种,多项式的表示和运算,最能巩固学习成果,现在提供详细代码,来实现多项式的加法运算. 多项式用单链表最为合适,不会造成更多的资源浪费. 如果你恰好用的这本书--数据结构(Java版)(第4版)(叶核亚),推荐你去下面这个链接下载书本源代码,将更助你学的轻松. http://download.csdn.net/detail/wang______jing/9907538 1 //单链表类,实现一些基本单链表的操作 2 publi

实现多项式的加法和乘法运算

不知道为啥,自己编程运行可以,一到PTA上运行就报错.不过算应该是没错的 1 #include<stdio.h> 2 #include<stdlib.h> 3 /*使用链表实习多项式的加法运算*/ 4 typedef struct linkList{ 5 int xiShu; 6 int ciShu; 7 struct linkList *next; 8 }list,*pList; 9 10 11 pList init_linkList(){ 12 pList head; 13 h