栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

实验2 线性表(一元多项式相加)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

实验2 线性表(一元多项式相加)

一、【实验目的】

1、掌握线性表的链式存储结构;

2、掌握链表的基本操作,并能进行应用实践;

3、使用C/C++语言和线性表实现“一元多项式相加”专题。

二、【实验内容】

结合课本第41页的例子,采用链式存储结构,将两个线性链表表示的一元多项式相加,并输出。此一元多项式遵循多项式相加运算规则:对于两个一元多项式中存在指数相同的项时,其对应系数相加:合并时系数和为零时,删除“和多项式”中此项;合并时系数和不为零时,则构成“和多项式”中的一项。对于两个一元多项式中存在的指数不相同的项,则分别复抄到“和多项式”中去,原多项式保持不变。

三、【实验步骤与要求】

1、实验前的准备

(1)了解C语言的基本概念;

(2)了解C语言的基本段落。

2、上机操作

(1)了解链式存储结构的基本知识;

(2)掌握算法思想和数据结构的描述;

(3)掌握一元多项式相加的运算规则。

参考《数据结构实践教程》(C语言版)P7-17 四、【验收要点】

① A、B均为有头结点

② 输入多项式A和B(要考虑乱序输入的情况,非乱序不扣分)

③ A、B有序排列(递增、递减均可)

④ A+B合并,并输出新的多项式(当指数相等时,需有考虑系数相加不为0和系数相加为0两种情况)

⑤ 输出A、B(要求原A、B保持不变)

五、【实验代码】


#include 
#include 
typedef struct polynode* polynomial;//定义指向结构体的指针
typedef struct polynode {	//结构体含有三个项
	float coef;
	int expn;
	polynomial next;	//指向下一个结构体的指针
}polynode;

polynomial creatpoly(int n);						//创建多项式
//int lengthpoly(polynomial p);						//链表长度
polynomial sortpoly(polynomial p,int n);			//多项式排序
polynomial addpoly(polynomial p1, polynomial p2);	//多项式相加
void printpoly(polynomial p);						//多项式输出
polynomial copypoly(polynomial p);					//链表复制

int main() {
	int n, m;
	polynomial pa, pb, pc,pd,pp,ps;

		printf("请输入多项式A的个数:");
		scanf("%d", &n);
		pa = creatpoly(n);
		printf("请输入多项式B的个数:");
		scanf("%d", &m);
		pb = creatpoly(m);

		pc = copypoly(pa);
		pd = copypoly(pb);
		sortpoly(pc,n);
		sortpoly(pd,m);
		printf("合并后的结果为:n");
		pp = addpoly(pc, pd);
		printpoly(pp);

		printf("合并之后的pa为:n");
		printpoly(pa);
		printf("合并之后的pb为:n");
		printpoly(pb);

	return 0;

}

polynomial creatpoly(int n) {		//创建链表
	polynomial pHead = (polynomial)malloc(sizeof(polynode));	//定义一个头节点
	polynomial p = (polynomial)malloc(sizeof(polynode)),h;
	pHead->next = p;							//头节点指向首节点
	printf("请输入多项式的系数及指数:n");
	scanf("%f %d", &p->coef, &p->expn);
	p->next = NULL;
	h = p;
	int i;
	for (i = 1;i < n;i++) {
		polynomial q = (polynomial)malloc(sizeof(polynode));//h用来指向最后一个节点
		h->next = q;
		scanf("%f %d", &q->coef, &q->expn);
		q->next = NULL;
		h = q;
	}
	return pHead;	//返回头节点
}
//int lengthpoly(polynomial p) {
//	int length = 0;
//	polynomial pnext = p->next;
//	while (pnext!=NULL)
//	{
//		length++;
//		p = p->next;
//		pnext = p->next;
//	}
//
//	return length;
//}

polynomial sortpoly(polynomial pHead,int n) {	//选择排序,指针指向不好换,所以直接换里面的值
	polynomial p,q;
	int i , j,ce,ex;
	for (i = 0, p= pHead->next; i < n-1; ++i,p=p->next)
	{
		for (j = i + 1, q = p->next;j < n;++j,q=q->next)
		{
			if (q == NULL)
				return pHead;
			if (p->expn > q->expn) 
			{
				ce = p->coef;
				ex = p->expn;
				p->coef = q->coef;
				p->expn = q->expn;
				q->coef = ce;
				q->expn = ex;
			}
		}
	}
	return pHead;
}

void printpoly(polynomial p) {			//打印
	polynomial pnext = p->next;
	while (pnext!=NULL)
	{


		printf("%.f %d ", pnext->coef, pnext->expn);
		p = p->next;
		pnext = pnext->next;
	}
	printf("n");	
}

polynomial addpoly(polynomial pa, polynomial pb) {
	polynomial p, q, s, r,t;
	int cmp, x;
	p = pa->next;
	q = pb->next;
	s = pa;			
	r = pb;			
	while (p != NULL && q != NULL)
	{
		if (p->expn < q->expn)
		{
			cmp = -1;
		}
		else if (p->expn > q->expn)
		{
			cmp = 1;
		}
		else///指数相等
		{
			cmp = 0;
		}
		switch (cmp)
		{
			
		case -1:
		{
			s = p;
			p = p->next;///pa表指针后移,没有插入
			break;
		}
		case 0:
		{
			x = p->coef + q->coef;///指数相等,系数相加
			if (x != 0) 
			{
				p->coef = x;
				s = p;
				p = p->next;
			}
			else///系数为0,在pa表中删除该结点
			{
				s->next = p->next;
				free(p);
				p = s->next;
			}
			r->next = q->next;///在pb表中删除该结点
			free(q);
			q = r->next;
			break;
		} 
		case 1:
		{
			t=q->next;
			q->next = s->next;
			s->next = q;///将pb表中的q插入到pa表中的s的后面
			r->next = t;
			s = q;
			q = r->next;
			break;
		} 
		}
	}
	if (q != NULL)///当pb连表还有剩余时接入到pa连表的尾部
	{
		s->next = q;
	}
	free(pb);
	return pa;
}

polynomial copypoly(polynomial L) {
	polynomial h,a;
	if (L == NULL)
		return NULL;
	h = a = (polynomial)malloc(sizeof(polynode));//新链表的头指针(指向第一个结点的指针)
	while (1)
	{
		a->coef = L->coef;//复制数据
		a->expn = L->expn;
		if (L->next != NULL)//还没有复制完
		{
			L = L->next;
			a->next = (polynomial)malloc(sizeof(polynode));//为新链表再分配一个结点空间
			a = a->next;
		}
		else
		{
			a->next = NULL;
			break;
		}
	}
	return h;//返回新链表的头指针
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/589179.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号