数据结构第一次实验-利用链表进行多项式乘法计算

前言:在学习中,我们遇到困难难以解决,甚至有的人借此卖答案赚钱,希望该实验报告可以给所有学习C++,数据结构的同学一点帮助,我的所有代码内容将无偿分享给大家,希望大家发现问题也能够批评指正!(本代码仅供学习参考,切勿用于其他用途)

数据结构实验报告1

学号:20XXXXXXXX            姓名:XXX           专业:人工智能

知识范畴:线性表                      完成日期:2023年  9月   19日

实验题目:基于链式存储的一元n次多项式相乘

课程目标1(60%)

课程目标2(40%)

得分(100分)

期末成绩占比10%

批阅人签字

程序代码及测试

写作、排版、代码注释等

实验内容及要求:

从字符文件输入两个多项式的非零系数及对应的指数,建立多项式的链式存储结构,计算这两个多项式的乘积,输出乘积多项式的全部非零系数及对应的指数到另一字符文件中。

要求输入输出字符文件中的数据格式自拟;编程语言采用C/C++。

实验目的:掌握单向链表的基本操作以及基于链表的多项式加法与乘法。

数据结构设计简要描述:以链表的数据结构存储多项式,数据域有coef系数,expn指数两个,指针域为next可以指向下一个节点或NULL(最后一个)。定义结构体PNode和指针Polynomial。

算法设计简要描述:设计多项式的相乘,用到了两个while循环,每层while循环用p,q两个指针依次遍历链表中的各个结点,并作乘法。然后用多项式的加法,每次内层循环的乘法结果求和得到一个链表,存入记录总求和的指针后,删除内层循环生成的链表,更新外层指针的指向的节点位置,直到外层循环结束则计算完所有多项式的乘积之和。

输入/输出设计简要描述:输入输出用到C++的文件流操作,用ifstream对象将存在txt文本文档中的两个多项式读取并存在全局变量的两个数组中,然后设计函数创建链表,依次遍历数组最终将两个多项式转化为链表的数据结构。输出时同理用到ofstream,创建新的txt文本文档作为计算结果的输出。

编程语言说明:C++

  

主要函数说明:主要的算法涉及多项式的加法和多项式的乘法两个函数,利用链表的顺序存储的特点可以依次遍历每个节点的数据域再进行加法或者乘法的计算

测试报告:

#include <stdlib.h>
#include <iostream>
#include <string.h>
#include <fstream>
using namespace std;
typedef struct PNode
{
	float coef;				//系数
	int expn;				//指数
	struct PNode* next;		//指针域

}PNode, * Polynomial;
float a[20];//以全局变量的形式存储系数
int b[20];//以全局变量的形式存储指数
void Read(const char *s)
{
	
	float c;
	int e;
	int i = 0;
	ifstream infile(s);
	if (!infile)//判断文件是否能正常打开
	{
		cout << "fail to open this file!" << endl;
	}

	while (1)
	{
		infile >> c >> e;
		if (infile.eof())break;
		a[i] = c;
		b[i] = e;
		i++;
	}
	infile.close();
}
Polynomial Create(const char*s)
{
	int i = 0;
	Polynomial h, p, last;
	h = new PNode;//创建链表的头节点
	h->next = NULL;
	last = h;
	Read(s);
	while(a[i])
	{
		p = new PNode;
		p->coef = a[i];
		p->expn = b[i];
		p->next = NULL;
		last->next = p;
		last = p;//更新节点到链表尾部
		i++;
	}
	return h;
}
Polynomial CreateNode(Polynomial &h)
{
	h = new PNode;
	return h;
}
Polynomial DeleteNode(Polynomial& h)
{
	delete h;
	return h;
}
Polynomial add(Polynomial h1, Polynomial h2)                   //实现两个多项式的相加,返回和式头指针
{
	Polynomial p1, p2, p3, h, p;			//h为和式R(x)的附加头结点指针
	p1 = h1->next;
	p2 = h2->next;
	CreateNode(h);
	p3 = h;
	while (p1 && p2)
	{
		if (p1->expn < p2->expn)              //p1的指数大于p2,先保存p1结点
		{
			p = p1;
			p1 = p1->next;
		}
		else if (p2->expn < p1->expn)         //p2的指数大于p1,先保存p2结点
		{
			p = p2;
			p2 = p2->next;
		}
		else                             //p1与p2指数相等时
		{
			p1->coef += p2->coef;         //系数相加,结果保存在p1中
			if (p1->coef == 0)         //系数之和为0,则删除该结点
			{
				p = p1;
				p1 = p1->next;
				DeleteNode(p);        //删除结点
				p = p2;
				p2 = p2->next;
				DeleteNode(p);
				continue;
			}
			p = p2;                 //系数之和不为0时,先删除p2结点
			p2 = p2->next;
			DeleteNode(p);
			p = p1;                 //将p1连接到p中
			p1 = p1->next;
		}
		p3->next = p;                 //插入p结点至和式末尾
		p3 = p;
	}
	if (p1)                              //p1没有结束,将p1后面所有的结点连接到和式
		p3->next = p1;
	else if (p2)                         //p2没有结束,将p2后面所有的结点连接到和式
		p3->next = p2;
	else
		p3->next = NULL;
	h1->next = h2->next = NULL;         //清空h1和h2链表
	return h;
}
Polynomial mul(Polynomial hp, Polynomial hq)       //计算多项式的乘法,返回乘式头节点指针
{
	Polynomial hr, ht, q, p, pt;//p、q用于临时存储hp,hq两个链表中的节点
	CreateNode(hr);
	hr->next = NULL;                     //R(x) = 0
	CreateNode(ht);
	ht->next = NULL;                     //T(x) = 0
	q = hq->next;
	while (q)
	{
		pt = ht;
		p = hp->next;
		while (p)
		{
			CreateNode(pt->next);	//创建新的尾结点
			pt = pt->next;
			pt->coef = p->coef * q->coef;      //系数相乘
			pt->expn = p->expn + q->expn;      //指数相加
			p = p->next;
		}
		pt->next = NULL;
		q = q->next;
		p = add(hr, ht);                 //实现R'(x) = R(x) + T(x)
		DeleteNode(hr);                  
		hr = p;							//每一项相加的p接到hr后面
	}
	DeleteNode(ht);
	return hr;

}
void Write(Polynomial h)
{
	ofstream outfile;
	outfile.open("D://multiply.txt",ios::out);       //输出文件名为multiply.txt
	Polynomial p = h->next;                      //去掉附加头结点
	if (!outfile)				//打开文件失败输出提示信息
	{
		cout << "file open error!" << endl;
		exit(0);
	}
	if (!p)			                //第一个结点为空,表示运算结果为0
		outfile << "0" << endl;
	while (p)			        //p不为空,依次输出系数和指数
	{
		outfile << p->coef<<"x" << "^" << p->expn << endl;//输出计算后的多项式
		p = p->next;
	}
	outfile.close();

}
int main()
{
	Polynomial h1,h2,h3;			//分别创建两个头节点
	h1 = Create("D://polynode1.txt");
    h2 = Create("D://polynode2.txt");
	h3 = mul(h1, h2);
	Write(h3);
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
要用C语言链表实现多项式乘法,首先需要定义一个多项式的结构体,其中包含多项式的系数和指数。然后可以通过创建链表的方式存储多项式。 下面是一个示例代码,实现多项式乘法的函数: ```c #include <stdio.h> #include <stdlib.h> // 定义多项式节点结构体 typedef struct PolynomialNode { int coefficient; // 系数 int exponent; // 指数 struct PolynomialNode* next; // 下一个节点指针 } PolynomialNode; // 创建多项式节点 PolynomialNode* createNode(int coefficient, int exponent) { PolynomialNode* node = (PolynomialNode*)malloc(sizeof(PolynomialNode)); node->coefficient = coefficient; node->exponent = exponent; node->next = NULL; return node; } // 在链表末尾插入节点 void insertNode(PolynomialNode** head, int coefficient, int exponent) { PolynomialNode* newNode = createNode(coefficient, exponent); if (*head == NULL) { *head = newNode; } else { PolynomialNode* curr = *head; while (curr->next != NULL) { curr = curr->next; } curr->next = newNode; } } // 打印多项式 void printPolynomial(PolynomialNode* head) { PolynomialNode* curr = head; while (curr != NULL) { printf("%dx^%d ", curr->coefficient, curr->exponent); curr = curr->next; if (curr != NULL) { printf("+ "); } } printf("\n"); } // 多项式乘法 PolynomialNode* multiplyPolynomials(PolynomialNode* poly1, PolynomialNode* poly2) { PolynomialNode* result = NULL; PolynomialNode* curr1 = poly1; while (curr1 != NULL) { PolynomialNode* curr2 = poly2; while (curr2 != NULL) { int coefficient = curr1->coefficient * curr2->coefficient; int exponent = curr1->exponent + curr2->exponent; insertNode(&result, coefficient, exponent); curr2 = curr2->next; } curr1 = curr1->next; } return result; } // 释放链表内存 void freeList(PolynomialNode* head) { PolynomialNode* curr = head; while (head != NULL) { head = head->next; free(curr); curr = head; } } int main() { PolynomialNode* poly1 = NULL; PolynomialNode* poly2 = NULL; // 多项式1: 3x^2 + 4x^1 + 2x^0 insertNode(&poly1, 3, 2); insertNode(&poly1, 4, 1); insertNode(&poly1, 2, 0); // 多项式2: 2x^2 + 5x^0 insertNode(&poly2, 2, 2); insertNode(&poly2, 5, 0); printf("多项式1:"); printPolynomial(poly1); printf("多项式2:"); printPolynomial(poly2); PolynomialNode* result = multiplyPolynomials(poly1, poly2); printf("乘法结果:"); printPolynomial(result); // 释放内存 freeList(poly1); freeList(poly2); freeList(result); return 0; } ``` 运行上述代码,即可实现多项式乘法。代码中通过创建链表的方式存储多项式,然后使用两重循环遍历两个链表,并将乘积的结果插入到一个新的链表中。最后打印新链表中的多项式结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值