前言:在学习中,我们遇到困难难以解决,甚至有的人借此卖答案赚钱,希望该实验报告可以给所有学习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);
}