数据结构与算法基础(王卓)(10):案例分析与实现(多项式;稀疏多项式;图书管理系统(略);)

文章讲述了如何使用线性表和链表来创建稀疏多项式,特别是在链表的创建中,强调了通过比较系数和指数来确保链表的有序性。在程序设计中,提到了初始化指针、比较指数以及插入新项的详细步骤,并对代码进行了逐步优化,确保新项能正确插入到合适的位置。最后,文章提及了多项式线性表的加减乘操作,但未展开具体实现。
摘要由CSDN通过智能技术生成

目录

(多项式)线性表的创建:

(多项式)链表的创建:

参考PPT思路,程序设计流程如下:

(多项式)线性表加减乘:


题干:

用线性表和链表的方式,分别实现(稀疏)多项式的

  • 定义(构造框架)创建
  • 加减乘

(多项式)线性表的创建:

(略,相较于其他操作难度不,以后有时间写)


(多项式)链表的创建:

要是我们写,估计大概率就只是把多项式里面的几个项输进去就完事了:

project 1:

#include<iostream>
using namespace std;
#include<stdlib.h>//存放exit

#define TRUE        1
#define FALSE       0
#define OK          1
#define ERROR       0
#define INFEASIBLE  -1
#define OVERFLOW   -2   

#define MAXlength 100  //初始大小为100,可按需修改

typedef int Status;         //函数调用状态

struct Pnode//node:结; 结点;
{
    float coef;//coefficient:系数
    int expn;//指数
    Pnode* next;
};

typedef Pnode* Polynomial;


int CreatePoly(Polynomial& P, int n)
{
    //输入n项的系数和指数,建立:表示多项式的有序链表:P
    P = new Pnode;
    P->next = NULL;
    for (int i = 1; i <= n; ++i)
    {
        static Pnode* s = new Pnode;
        cin >> s->coef >> s->expn;
    }
    return true;
}
    
int main()
{

}

然而,在PPT中还有更完善妥当适合的办法:

(tmd大师就是大师,想的程序设计思路比我完善体系化多了,nb)

简而言之,就是在前面的步骤的基础上,在增加下面几步:


pre:

找第一个指数幂大于前面的项,初值指向头结点

指向
待找到的
第一个
大于输入项指数的结点
的前驱


指针q:

初始化指向首元结点

循链向下,逐个比较链表中
当前结点与
输入项指数,
找到第一个大于输入项指数的结点*q
将输入项结点*s插入到结点*q之前


参考PPT思路,程序设计流程如下:

初始化指针pre、q

逐个向下比较当前输入项与下一项的指数项大小

如果当前,输入项(s)指数项更大:

继续向后面找,在这个过程中:

每比较完一项,指针pre和q就往后指一项(进行一次指向下一项操作)

直到找到第一个,比s指数项大的项(q)

然后把输入项(s)插入到更大项(q)之前

输入下一项

也就是说,每次输入新的项目时,都进行从头比较的操作:

project 2:

#include<iostream>
using namespace std;
#include<stdlib.h>//存放exit

#define TRUE        1
#define FALSE       0
#define OK          1
#define ERROR       0
#define INFEASIBLE  -1
#define OVERFLOW   -2   

#define MAXlength 100  //初始大小为100,可按需修改

typedef int Status;         //函数调用状态

struct Pnode//node:结; 结点;
{
    float coef;//coefficient:系数
    int expn;//指数
    Pnode* next;
};

typedef Pnode* Polynomial;

int CreatePoly(Polynomial& P, int n)
{
    //输入n项的系数和指数,建立:表示多项式的有序链表:P
    P = new Pnode;
    P->next = NULL;
    for (int i = 1; i <= n; ++i)
    {
        static Pnode* s = new Pnode;
        cin >> s->coef >> s->expn;
        Pnode* pre = P;        //pre初值为头结点
        Pnode* q = P->next;        //q初始化指向首元结点
        while (s->expn > q->expn)
            //每比较完一项,指针pre和q就往后指一项(进行一次指向下一项操作)
        {
            pre = pre->next;
            q = q->next;
        }
        pre->next = s;
        s->next = q;
    }
    return true;
}

int main()
{

}

 OK,现在程序的进行到了差不多可以完整的的时候了

但是(然而),在这里我们依然还是有几个程序上的小细节没有考虑到:

(1):

程序循环的判断(是否)执行语句,应改为:

        while (q &&s->expn > q->expn)

(2):

另外,虽然这里先让pre指向输入的节点s不要紧

(虽然丢失了pre->next,但是我们还知道他的下一位地址q,无所谓)

但是为了养成避免丢失结点信息的习惯,我们还是先让新输入节点指向后面:

project 3:

#include<iostream>
using namespace std;
#include<stdlib.h>//存放exit

#define TRUE        1
#define FALSE       0
#define OK          1
#define ERROR       0
#define INFEASIBLE  -1
#define OVERFLOW   -2   

#define MAXlength 100  //初始大小为100,可按需修改

typedef int Status;         //函数调用状态

struct Pnode//node:结; 结点;
{
    float coef;//coefficient:系数
    int expn;//指数
    Pnode* next;
};

typedef Pnode* Polynomial;

int CreatePoly(Polynomial& P, int n)
{
    //输入n项的系数和指数,建立:表示多项式的有序链表:P
    P = new Pnode;
    P->next = NULL;
    for (int i = 1; i <= n; ++i)
    {
        static Pnode* s = new Pnode;
        cin >> s->coef >> s->expn;
        Pnode* pre = P;        //pre初值为头结点
        Pnode* q = P->next;        //q初始化指向首元结点
        while (q &&s->expn > q->expn)
            //每比较完一项,指针pre和q就往后指一项(进行一次指向下一项操作)
        {
            pre = pre->next;
            q = q->next;
        }
        s->next = q;
        pre->next = s;      
     //将输入项s插入到q和其前驱结点pre之间
    }
    return true;
}

int main()
{

}

(多项式)线性表加减乘:


后续二轮补上,

囫囵吞枣不求甚解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值