数据结构——第二讲、线性结构(1)

来源:互联网 发布:什么是windows编程 编辑:程序博客网 时间:2024/05/22 03:37

2.1 线性表及其实现

2.1.1 多项式的表示

一元多项式f(x)=a0+a1X+…+anX^n;
对它进行的操作有:相加、相减、相乘等,有多种方式表示。

方法1:顺序存储结构直接表示
用一个数组存储多项式,数组的值为多项式的系数,数组的下标为多项式每项的指数。
方法1表示多项式实例
(图片来源:中国大学MOOC浙江大学数据结构)

显然,这样的方式虽然简单也便于运算,但是会造成数组空间的巨大浪费。

方法2:顺序存储结构表示非零项

用数组只存非零项,那么数组的值就不可以只有系数,它应该同时包含它的系数和指数,所以可以用结构数组来存储。

方法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;}
原创粉丝点击