美文网首页
顺序表实现多项式合并

顺序表实现多项式合并

作者: lxr_ | 来源:发表于2022-03-10 11:14 被阅读0次

类似于有序表合并(顺序表中有介绍)

1.两个多项式合并式,需要考虑指数不尽相同的情况,故采用结构体(包括指数和系数)作为顺序表中的数据,需要重载'='、'+'等运算操作符。
2.与有序表合并不同的是,多项式合并时,如果遇到指数相同的情况,需要将系数相加后插入到新顺序表中,且两个表的指针都需要后移,如果相加后系数为0,则不需要添加到新的顺序表中。
如:


多项式合并

SqListPoly.h

#pragma once
#define MAXSIZE 20

//函数结果状态代码
#define OK      1
#define ERROR   0
#define INFEASIBLE  -1
#define OVERFLOW    -2

struct Poly
{
    int index;          //指数
    float coefficient;  //系数

    //默认构造
    Poly()
    {
        this->index = 0;
        this->coefficient = 0;
    }
    //有参构造
    Poly(int index, float coefficient)
    {
        this->index = index;
        this->coefficient = coefficient;
    }

    //重载 =
    Poly& operator=(Poly& data)
    {
        index = data.index;
        coefficient = data.coefficient;

        return *this;
    }
};

//Status 是函数的类型,其值是函数结果状态代码
typedef int Status;
typedef struct Poly ElemType;   //元素类型为char

//动态数组
typedef struct
{
    ElemType* elem;
    int length;
}SqList_dynamic;

//构造一个空的顺序表
Status InitSqlList(SqList_dynamic& L);

//判断线性表是否存在
bool IsExist(SqList_dynamic L);

//查找(找到返回位置序号,未找到返回0)
int LocateElem(SqList_dynamic L, ElemType e);

//插入
int ListInsert(SqList_dynamic& L, int i, ElemType e);

//遍历
int ListTraverse(SqList_dynamic L);

//多项式合并
void ListMerge_sq(SqList_dynamic L1, SqList_dynamic L2, SqList_dynamic& L3);

SqListPoly.cpp

#include "SqListPoly.h"

#include <iostream>
using namespace std;

ostream& operator<<(ostream& cout, ElemType data)
{
    cout << "index=" << data.index << " " << "coefficient=" << data.coefficient << endl;
    return cout;
}

//构造一个空的顺序表
Status  InitSqlList(SqList_dynamic& L)
{
    L.elem = new ElemType[MAXSIZE]; //为顺序表分配空间
    if (!L.elem)                    //内存分配失败
    {
        cout << "内存分配失败" << endl;
        exit(OVERFLOW);
    }

    L.length = 0;                   //空表长度为0
    cout << "线性表初始化成功" << endl;

    return OK;
}
//判断线性表是否存在
bool IsExist(SqList_dynamic L)
{
    if (L.elem)
    {
        //cout << "L存在" << endl;
        return true;
    }
    else
    {
        //cout << "L不存在" << endl;
        return false;
    }
}

//查找(找到返回位置序号,未找到返回0)(平均查找长度(n+1)/2,n=L.length),则平均时间复杂度为O(n)
int LocateElem(SqList_dynamic L, ElemType e)
{
    if (!IsExist(L))
    {
        cout << "L不存在" << endl;

        return ERROR;
    }
    for (int i = 0; i < L.length; i++)
    {
        if (L.elem[i].index == e.index && L.elem[i].coefficient == e.coefficient)
        {
            cout << e << "对应的序号为:" << i + 1 << endl;
            return i + 1;
        }
    }
    return 0;
}

//插入(平均移动次数n/2,n=L.length),则平均时间复杂度为O(n)
int ListInsert(SqList_dynamic& L, int i, ElemType e)
{
    if (i < 1 || i > L.length + 1 || L.length == MAXSIZE || (!IsExist(L)))  //插入位置不合法或者存储空间已满
    {
        cout << "插入位置不合法或L不存在" << endl;
        return ERROR;
    }
    for (int j = L.length - 1; j >= i - 1; j--)     //插入位置及之后的元素后移
    {
        L.elem[j + 1] = L.elem[j];
    }                                               //新元素e放入第i个位置
    L.elem[i - 1] = e;
    L.length++;                                     //表长增1

    cout << "插入成功" << endl;

    return OK;
}

//遍历
int ListTraverse(SqList_dynamic L)
{
    if (!L.length || (!IsExist(L)))
    {
        cout << "L为空或L不存在" << endl;
        return ERROR;
    }
    for (int i = 0; i < L.length; i++)
    {
        cout << L.elem[i];
    }
    cout << endl;

    return OK;
}

//多项式合并(类似于有序表合并)
void ListMerge_sq(SqList_dynamic L1, SqList_dynamic L2, SqList_dynamic& L3)
{

    //指向顺序表的开头
    ElemType* p1 = L1.elem;
    ElemType* p2 = L2.elem;

    //指向顺序表的末尾
    ElemType* p1_last = L1.elem + L1.length - 1;
    ElemType* p2_last = L2.elem + L2.length - 1;

    while (p1 <= p1_last && p2 <= p2_last)
    {
        if ((*p1).index > (*p2).index)              //指数不等
        {
            ListInsert(L3, L3.length + 1, *p2++);
        }
        else if ((*p1).index == (*p2).index)        //指数相等
        {

            if ((*p1).coefficient + (*p2).coefficient)  //相加后系数不为0
            {
                Poly* p = new Poly;
                p->index = (*p1).index;
                p->coefficient = (*p1).coefficient + (*p2).coefficient;
                ListInsert(L3, L3.length + 1, *p);
            }

            p1++;
            p2++;
        }
        else                                        //指数不等
        {
            ListInsert(L3, L3.length + 1, *p1++);
        }
    }

    while (p1 <= p1_last)
    {
        ListInsert(L3, L3.length + 1, *p1++);
    }
    while (p2 <= p2_last)
    {
        ListInsert(L3, L3.length + 1, *p2++);
    }
}

main.cpp

测试:

#include "SqListPoly.h"

#include <iostream>

using namespace std;

int main(int argc, char** argv)
{
    SqList_dynamic L1, L2;
    InitSqlList(L1);
    InitSqlList(L2);

    ElemType d1(0, 7), d2(1, 3), d3(8, 9), d4(17, 5), d5(1, 8), d6(7, 22), d7(8, -9);

    ListInsert(L1, 1, d1);
    ListInsert(L1, 2, d2);
    ListInsert(L1, 3, d3);
    ListInsert(L1, 4, d4);

    ListInsert(L2, 1, d5);
    ListInsert(L2, 2, d6);
    ListInsert(L2, 3, d7);


    ListTraverse(L1);
    ListTraverse(L2);

    SqList_dynamic L3;
    InitSqlList(L3);
    ListMerge_sq(L1, L2, L3);
    ListTraverse(L3);
    return 0;
}

相关文章

  • 顺序表实现多项式合并

    类似于有序表合并(顺序表中有介绍) 1.两个多项式合并式,需要考虑指数不尽相同的情况,故采用结构体(包括指数和系数...

  • 数据结构课程 第四周 线性表、链式表的比较和应用

    顺序表和链式表的比较 线性表的应用 线性表的合并 有序表的合并 有序表的合并 用顺序表实现 有序表的合并 用链式表...

  • 顺序表实现稀疏多项式

    原文链接由于书上给的代码都是只有核心的代码,没法直接实现,所以我就尝试将书上提到的函数都用c语言实现了一下。仅供参...

  • 【数据结构】7 合并有序顺序表

    将两个有序顺序表合并成一个新的有序顺序表,并由函数返回结果顺序表

  • 顺序合并

    顺序合并 有两个顺序表LA和LB,其元素均为非递减有序排列,编写一个算法,将它们合并成一个顺序表LC,要求LC也是...

  • 链表合并问题(二)

    将两个有序表合并成一个新的有序顺序表,并由函数返回结果顺序表 bool Merge (SeqList A,SeqL...

  • 线性表-顺序表合并

    线性表合并 运行时限: 1000 ms 单次运行时限: 1000 ms 内存限制: 64 MB总提交: 3...

  • 2018-06-28顺序表结构和实现以及具体操作

    顺序表的结构与实现 真正在实现顺序表的时候要怎么操作? 顺序表在构建的时候还会有个表头信息。 一个顺序表的完整信息...

  • 栈 Python实现

    栈的顺序表实现 栈的链接表实现

  • 2018-10-11

    0.实现顺序索引表的分块查找 实现顺序表的分级查找算法。基本要求包括: (1)设计顺序表和索引表的存储结构。 (2...

网友评论

      本文标题:顺序表实现多项式合并

      本文链接:https://www.haomeiwen.com/subject/fjvxdrtx.html