数据结构——第二讲、线性结构(1)
来源:互联网 发布:什么是windows编程 编辑:程序博客网 时间:2024/05/22 03:37
2.1 线性表及其实现
2.1.1 多项式的表示
一元多项式f(x)=a0+a1X+…+anX^n;
对它进行的操作有:相加、相减、相乘等,有多种方式表示。
方法1:顺序存储结构直接表示
用一个数组存储多项式,数组的值为多项式的系数,数组的下标为多项式每项的指数。
(图片来源:中国大学MOOC浙江大学数据结构)
显然,这样的方式虽然简单也便于运算,但是会造成数组空间的巨大浪费。
方法2:顺序存储结构表示非零项
用数组只存非零项,那么数组的值就不可以只有系数,它应该同时包含它的系数和指数,所以可以用结构数组来存储。
(图片来源:中国大学MOOC浙江大学数据结构)
这样存储如果想要方便的运算,那么就必须将指数按顺序存储。
下面是求和的代码,刚开始的时候把p3设成局部变量,想返回p3又返回不了数组,只能把p3的地址返回回来,结果就返回了个地址,算出来的数字存在p3里面全内存一收回啥都没了,还奇怪为什么只能输出一个正确数字,debug的时候看见地址没变数据变了才知道怎么回事,麻个鸡。
//定义全局变量、结构体、声明函数struct Polynomial{ int coefficient = 0; int exponent = 0;}p1[100], p2[100], p3[100],p4[100];int index = 0;int Sum(Polynomial p1[], Polynomial p2[],int num1,int num2);//求和函数本体int Sum(Polynomial p1[], Polynomial p2[], int num1, int num2) { int index1 = 0, index2 = 0; while (index1 < num1||index2 < num2) { if (p1[index1].exponent > p2[index2].exponent) { p3[index] = p1[index1]; index1++; index++; } else if (p1[index1].exponent == p2[index2].exponent) { p3[index].coefficient = p1[index1].coefficient + p2[index2].coefficient; if (p3[index].coefficient)p3[index].exponent = p1[index1].exponent; index1++; index2++; index++; } else { p3[index] = p2[index2]; index2++; index++; } if (index1 >= num1) { for (; index2 < num2; index2++) { p3[index] = p2[index2]; index++; } } if (index2 >= num2) { for (; index1 < num1; index1++) { p3[index] = p2[index1]; index++; } } } return 0;}
求和的思路是这样的,把按从大到小的顺序存储的多项式从第一项开始比较他们的指数,指数大的记下来然后看下一个,小的保持不变,指数相等的相加,同时向后看,当有一个多项式加完的时候,把剩下的那个接在结尾即可。
下面附上求乘积的代码。
int multiply(Polynomial p1[], Polynomial p2[], int num1, int num2) { for(int i = 0;i<num1;i++) for (int j = 0; j < num2; j++) { p3[index].coefficient = p1[i].coefficient*p2[j].coefficient; p3[index].exponent = p1[i].exponent + p2[j].exponent; index++; } for(int i= num1*num2-1;i>0;i--) for (int j = 0; j < i; j++) { if (p3[i].exponent > p3[j].exponent) { //借用p4[0]作为中间变量完成交换 p4[0] = p3[i]; p3[i] = p3[j]; p3[j] = p4[0]; } } //接下来合并同类项 for (int i = 0; i < num1*num2-1; i++) { if (p3[i].exponent == p3[i + 1].exponent) { p3[i].coefficient = p3[i].coefficient + p3[i+1].coefficient; p3[i + 1].coefficient = 0; } } //整理结果 index = 0; for (int i = 0; i < num1*num2; i++) { if (p3[i].coefficient != 0) { p4[index] = p3[i]; index++; } } return 0;}
先挨个乘完,然后从大到小排序,然后把重复的合并同类项,整理到p4的时候把系数为零的跳过即可。
方法3:链表结构存储非零项
就是在方法2的结构体中加一个指针域,让它指向下一个结构体。
//C++代码,如果用c语言需要//typedef struct PolyNode *Polymial//Polymial link;struct PolyNode{ int coefficient = 0; int exponent = 0; Polynomial *link;}
阅读全文
0 0
- 数据结构——第二讲、线性结构(1)
- 数据结构——第二讲、线性结构(2)
- 数据结构——第二讲、线性结构(3)
- 数据结构——第二讲、线性结构(4)
- 数据结构——第二讲、线性结构(5)
- 数据结构——第二讲、线性结构(6)
- 数据结构——第二讲、线性结构(7)
- 数据结构——第二讲、线性结构(8)
- 第二讲 线性结构
- 陈越、何钦铭《数据结构》第二讲线性结构 笔记
- 网易云课堂-数据结构-第二讲-线性结构
- 网易云课堂-数据结构-第二讲-线性结构
- [数据结构]线性结构——线性表
- 数据结构——线性结构
- 【数据结构】数据结构与算法(一)——线性结构
- 数据结构(陈越)PAT练习题 第二周:线性结构
- 【ShawnZhang】带你看数据结构——第二课:线性表顺序结构
- 《数据结构》第二章线性结构 学习指南
- Java 线程
- Java NIO
- UVa 133 The Dole Queue 一些反思
- fputs标准库实现
- windows核心编程---进程
- 数据结构——第二讲、线性结构(1)
- Python3之交换变量(面试题)
- 棋盘分割
- Qt 学习之路 2(28):坐标系统
- 有线电视网
- 每日英语阅读(六十二)
- 【BZOJ3295】【Cqoi2011】动态逆序对
- 拆分数列
- 实战演练 test16 T1