线性表 和 多项式相乘

/* C语言线性表  
采用c语言 malloc realloc free 实现类存分配 */
#include <ctime>
#include <string>
#include <stdio.h>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <windows.h>
#define  LS   1000
#define  LS_M  100
using namespace std;
/*说明:本程序从0号位置开始存储*/
struct node
{
	int  *elem;  //空间基址
	int length;  //当前长度
	int listsize;//线性表大少
};
/* 基本操作与实现*/
void InitList(node &L) 
{//初始化链表
	L.elem = (int *)malloc(LS * sizeof(node));
	if(!L.elem) {puts("failure");return;}
	L.length=0;
	L.listsize = LS;
	return;
}
void CreateValue(node &L)
{
	int val,*p;
	Sleep(500);
	srand(time(0));
	p = L.elem;
	int n = L.length= rand() % 15 + 1;
	printf("请输入N个整数%d: ", n);
	freopen("1.txt","r",stdin);
	while(n--)
	{
		scanf("%d",&val);
		*(p++) = val;
	}
	puts("");
}
bool check(node L)
{
	if(L.elem == NULL) return 0;
	else               return 1;
}
void DestroyList(node &L)
{//销毁链表
	if(check(L))    free(L.elem);
	else      puts("链表不存在");
	L.elem = NULL;
	return;
}
bool ListEmpty(node &L) 
{//判断链表是否为空
	if(check(L))
	{
		if(L.length == 0) return 0;
		else              return 1;
	}
	else   puts("链表不存在");
	return false;
}
void ClearList(node &L)
{//清空链表
	if(!check(L))
	{
		puts("链表不存在");
		return;
	} 
	if(L.length != 0) L.length = 0;
	else    puts("链表为空");
}
int ListLength(node L) 
{//获取链表的长度
	if(check(L))
	{
		return L.length;
	}
	else puts("链表不存在");
	return 0;
}
int GetElemsVal(node L,int k) 
{//获取链表的k位置的值
	return *(L.elem+k);
}
void print(node L)
{
	int i;
	if(!check(L)) {puts("failure");return;}
	for(i=0 ; i<L.length ; i++)
		printf("%d " , *(L.elem++));
	puts("");
}
void LocateElem(node L ,int i , int &e) 
{//获得i位置的值并且保存到e变量中
	if(!check(L)) puts("链表不存在");
	else e = *(L.elem + i);
	return;
}
int PriorElem(node L , int rur_e , int &pre_e) 
{//获取rur_e元素前驱的位置并保存到pre_e变量中
	if(!check(L)) {puts("failure");return 0;}
	int i , *p = L.elem , flag=0;
	if(*p==rur_e) flag = 1 ;
	for(i=0 ; i<L.length ; i++)
	{
		if(*(p+1)==rur_e) break;
		else            p++;
	}
	if(i >= L.length) flag=1;
	if(flag == 1) puts("failure");
	else          pre_e = i;
	return 0;
}
int NextElem(node L , int cur_e , int &next_e) 
{//获取rur_e元素后继的位置并保存到next_e变量中
	if(!check(L)) {puts("failure");return 0;}
	int i, *p = L.elem , flag=0;
	for(i=0 ; i<L.length ; i++)
	{
		if(*(p++)==cur_e) break;
	}
	if(i>= L.length-1) puts("failure");
	else               next_e = i+1;
	return 0;
}
void ListInsert(node &L , int i , int e) 
{//在链表的i位置插入元素e
	int j , k , *p=L.elem , *q=L.elem+L.length-1;
	if(!check(L)|| i<0 || i>=L.length) 
	{
		puts("failure");
		return;
	}
	if(L.length+1 > L.listsize) 
	{
		int *newbase = (int *)realloc(L.elem,(L.listsize+LS_M)*sizeof(node));
		if(newbase==NULL) {puts("failure");return;}
		L.elem = newbase;
		L.listsize+=LS_M;
		//追加空间
	}
	p=L.elem+i;j=i;
	for(k=L.length-1 ; k>=j ; k--)
		*(q+1)=*q,q--;
	*p = e;L.length+=1;
}
void ListDelete(node &L , int i , int &e) 
{//在链表的i位置删除元素并返回删除元素的值e
	int j , *p=L.elem ;
	if(!check(L)|| i<0 || i>=L.length) 
	{
		puts("failure");
		return;
	}
	p = (p+i) ; e = *p;
	for(j=i ; j<L.length ; j++)
	{
		*p = *(p+1) , p++;
	}
	L.length-=1;
}
void ListTraverse(node &L) 
{//将链表翻转
	int temp=0 , len=L.length/2;
	int *p=L.elem,*q=L.elem+L.length-1;
	for(int i=0 ;i<len ;i++)
	{
		temp = *p;
		*p = *q;
		*q = temp;
		p+=1;q-=1;
	}
}
void T_sort(node &L)
{
	node p=L;
	int len=L.length;
	int i,j,t;
	for(i=0 ; i<len ; i++)
	{
		for(j=0 ; j<=i ; j++)
		{
			if(p.elem[i]<p.elem[j])
			{
				t=p.elem[i];
				p.elem[i]=p.elem[j];
				p.elem[j]=t;
			}
		}
	}
}
void MergeList(node &La , node &Lb , node &Lc)
{//实现La , Lb 两个链表的合并,保存结果与Lc(递增)
	T_sort(La);T_sort(Lb);
	int *p1 , *p2 , * p3;
	int i=0,j=0,k=0,ln=La.length,lm=Lb.length;
	p1 = La.elem ; p2 =  Lb.elem ; p3=Lc.elem;
	if(La.length+Lb.length>Lc.listsize)
	{
		int *newbase = (int *) realloc(Lc.elem , (Lc.listsize+LS_M)*sizeof(node));
		if(!newbase) {puts("failure");return;}
		Lc.elem = newbase;
		Lc.listsize+=LS_M;
	}
	while(i<ln && j<lm)
	{
		if(*p1<*p2)
		{
			i++;*p3=*p1;
			p1++;  p3++;
			Lc.length++;
		}
		else if(*p1==*p2)
		{
			j++;p2++;
		}
		else
		{
			j++;*p3=*p2;
			p2++;  p3++;
			Lc.length++;
		}
	}
	if(i<=ln)
	{
		for(k=i ; k<ln ; k++)
			*(p3++) = *(p1++);
		Lc.length+=ln-i;
	}
	if(j<=lm)
	{
		for(k=j ; k<lm ; k++)
			*(p3++) = *(p2++);
		Lc.length+=lm-j;
	}
}
/*  注释程序从0号位置开始存储值 */
int main ()
{
	node La,Lb,Lc;
	InitList(La);
	InitList(Lb);
	InitList(Lc);

	CreateValue(La);
	CreateValue(Lb);
	CreateValue(Lc);
	printf("La的长度: %d ",ListLength(La));
	printf("Lb的长度: %d ",ListLength(Lb));
	printf("Lc的长度: %d\n",ListLength(Lc));
	//
	int e=0;
	ListInsert(La,5,99);
	print(La);
	ListDelete(La,0,e);
	printf("删除的元素值为: %d\n",e);
	print(La);
	//
	int k=1;
	printf("La中 %d 号位置的值: %d\n",k,GetElemsVal(La,k));
	print(La);
	//
	int pre_e=-1 , rur_e = 7;
	PriorElem(La , rur_e , pre_e);
	if(pre_e!=-1)
	printf("元素 %d 在La中的前驱的位置为: %d\n",rur_e,pre_e);
	int next_e = -1 , cur_e = 4;
	NextElem(La , cur_e , next_e);
	if(next_e!=-1)
	printf("元素 %d 在La中的后继的位置为: %d\n",cur_e,next_e);
	//
	if(ListEmpty(Lc)) 
	{
		printf("Lc: ");print(Lc);
		ClearList(Lc);
	}
	T_sort(La);
	T_sort(Lb);
	printf("La: ");print(La);
	printf("Lb: ");print(Lb);
	MergeList(La,Lb,Lc);
	print(Lc);
	//
	DestroyList(La);
	DestroyList(Lb);
	DestroyList(Lc);
	return 0;
}


 

/* 输入式子都是标准形式 */
#include <vector>
#include <string>
#include <cstdio>
#include <iostream>
using namespace std;
struct node
{
	int coef;    //指数
	char   c;    //变量
	double exp;  //系数
}p,q;
vector <node> v1,v2,v3;
void mergelist(int te , int tc)
{
	int i , flag=0;
	for(i=0 ; i<v3.size() ; i++)
	{
		if(tc == v3[i].coef)
		{
			v3[i].exp+=te;
			flag=1;
		}
	}
	q.c = 'x' ; q.coef=tc ; q.exp = te;
	if(!flag)  v3.push_back(q);
}
void mutiply(node p)
{
	int i , tc , te;
	for(i=0 ; i<v2.size() ; i++)
	{
		te = p.exp * v2[i].exp;
		tc = p.coef + v2[i].coef;
		mergelist(te , tc);
	}
}
void Print()
{
	int i;
	for(i=0 ; i<v3.size() ; i++)
	{
		if(i!=0 && v3[i].exp>0) cout<<'+';
		if(i!=0 && v3[i].exp==0) continue;

		if(v3[i].exp == 1 || v3[i].exp == -1)
		{
		    if(v3[i].exp == -1)
		    cout<<'-';
		}
		else cout<<v3[i].exp;
		cout<<v3[i].c<<'^'<<v3[i].coef;
	}
	cout<<endl;
}
int main ()
{
	int i , n , m;
	freopen("2.txt","r",stdin);
	while(cin>>n>>m && n||m)
	{ //n m 分别代表表达式 1 2 的项数
		v1.clear();
		v2.clear();
		v3.clear();
		for(i=0 ; i<n ; i++)
		{
			cin>>p.c>>p.coef>>p.exp;
			v1.push_back(p);
		}
		for(i=0 ; i<m ; i++)
		{
			cin>>p.c>>p.coef>>p.exp;
			v2.push_back(p);
		}
		//
		for(i=0 ; i<v1.size() ; i++)
		{
			p=v1[i];
			mutiply(p);
		}
		Print();
	}
	return 0;
}
/* 思路用vector实现不考虑式子本身的复杂情形
1 输入范例 (x + x^2 + x^3)* (x^4 + x^5)
3 2
x 1 1
x 2 1
x 3 1
x 4 1
x 5 1
0 0
*/


 

实验一 线性表及其应用 一、 实验目的和要求 1、掌握线性表的插入、删除、查找等基本操作设计与实现 2、学习利用线性表提供的接口去求解实际问题 3、熟悉线性表的的存储方法 二、 实验内容和原理 1、实验内容:设计一个一元多项式的简单计算器,其基本功能有①输入并建立多项式;②输出多项式;③多项式相加。可利用单链表或单循环链表实现之。 2、实验原理:以线性表来描述一元多项式,存储结构采用单链表,每个结点存储的多项式中某一项的系数和指数,建立单链表时指数高的结点列于指数低的 结点之后,即线性表的元素按指数递增有序排列。 三、 实验环境 Visual C++ 6.0 及PC机 四、 算法描述及实验步骤 思想算法: 以线性表来描述一元多项式,存储结构采用单链表,每个结点存储的多项式中某一项的系数和指数,建立单链表时指数高的结点列于指数低的结点之后,即线性表的元素按指数递增有序排列。 例如构造两个多项式ha: 5X3+4X2+3X+2 hb: X2+X+1 多项式加法:定义指针p,q分别指向ha,hb i.p->exp==q->exp ,r->coef=p->coef+q->coef,pa,pb下移; ii.p->expexp ,r->coef=q->coef;r->exp=q->exp;,q下移 iii.pa->exp>pb->exp, r->exp=p->exp;r->coef=p->coef;,p下移 iv.p!=NULL,pb==NULL.相当于iii. V.q==NULL,pb!=NULL.相当于ii. 其流程图如下: 多项式乘法:定义指针fp,gp分别指向f,g 1.将两多项式最大指数相加并赋于maxp,并置g 2.用for循环求指数等于maxp时相乘的系数 3. (fp!=NULL)&&(gp!=NULL), p=fp->exp+gp->exp 1.p>maxp, fp=fp->next; 2. pnext; 3.p=maxp, x+=fp->coef*gp->coef; fp=fp->next;gp=gp->next; 五、 实验结果 1.分别输入两个多项式: 5X3+4X2+3X+2 和X2+X+1,然后输出结果如下: 2.分别输入两个多项式:6X4+4X2+2和5X+6,然后输出结果如下: 六、 总结 此次上机实验应用了线性表实现了一次实际操作,完成了一个一元多项式的简单计算器,不仅对此次编译程序的算法思想有了新的认识,还让我深刻的体会到了线性表的重要性以及其应用的方便,并且对指针加深了映象,应用了书本中的算法思想,对我以后的编译以及完成新的程序有很大的帮助。 附录: 1.建立多项式列表代码如下: mulpoly *creatpoly()/*建立多项式列表*/ {mulpoly *head,*r,*s;/*设中间变量*/ int m,n; head=(mulpoly *)malloc(sizeof(mulpoly));/*头结点申请空间*/ printf("\ninput coef and exp:\n"); scanf("%d%d",&n,&m);/*输入多项式系数和指数*/ r=head;/*尾指针指向头指针*/ while(n!=0)/*将输入的多项式存放在S中*/ {s=(mulpoly*)malloc(sizeof(mulpoly)); s->coef=n; s->exp=m; r->next=s; r=s; /*printf("input coef and exp:\n");*/ scanf("%d%d",&n,&m);/*再次输入多项式系数和指数*/ } r->next=NULL;/*将尾指针置空*/ head=head->next;/*将head哑结点向前跑一个结点,使其不为空*/ return (head);/*返回多项式*/ } 2.两个多项式相加代码如下: mulpoly *polyadd(mulpoly *ha,mulpoly *hb)/*两个多项式相加*/ {mulpoly *hc,*p,*q,*s,*r;/*声明结构体型*/ int x; p=ha; q=hb; hc=(mulpoly *)malloc(sizeof(mulpoly));/*申请结点空间*/ s=hc; while((p!=NULL)&&(q!=NULL))/*两多项式不为空*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值