目录
题干:
用线性表和链表的方式,分别实现(稀疏)多项式的
- 定义(构造框架)创建
- 加减乘
(多项式)线性表的创建:
(略,相较于其他操作难度不,以后有时间写)
(多项式)链表的创建:
要是我们写,估计大概率就只是把多项式里面的几个项输进去就完事了:
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()
{
}
(多项式)线性表加减乘:
后续二轮补上,
囫囵吞枣不求甚解