一元稀疏多项式简单计算器
(1)输入并建立多项式;
(2)输出多项式,输出形式为整数序列: n,c1,e1,c2,e2,…,cn,en,其中n是多项式的项数,ci和ei分别是第i项的系数和指数,序列按指数降序排列。
(3)多项式a与多项式b相乘,建立多项式。
在写代码的过程中,对其中没有掌握的各个知识点的梳理和记录。
1、struct结构体
typedef struct Polynomial{
float coef; //系数
int expn; //指数
struct Polynomial *next;
//Polynomial(double a, int b){coef = a; expn = b;}
Polynomial(){};
}Polyn,*Poly;
struct P{
......
}PO,*PO2
PO *p 与 PO2 p 等价,都是指向P的指针。
typedef 和 struct
在c++中如果用typedef的话,会造成区别:
struct Student
{
int a;
}stu1;//stu1是一个Student变量
typedef struct Student2
{
int a;
}stu2;//stu2是一个结构体类型=struct Student
使用时可以直接访问stu1.a
但是stu2则必须先 stu2 s2;
然后 s2.a=10;
在C++中,后者可以有
1. struct Student2 变量名
2. Student2 变量名
3. stu2 变量名
2、struct构造函数
结构体实例和类实例的初始化方法完全相同,二者都可以应用于继承层次中。不同点是结构体默认成员为public,而类默认成员是private。
若类和结构体所有数据成员均为public型,可采取如下带花括号形式进行初始化。
注意:
① 不论值的个数多少,都必须使用花括号定界
② 未指定值的数据成员编译器会自动初始化为默认值
③ 这种初始化对象方式,要求所有数据成员必须为public型
④ 这种初始化对象方式,要求类中不能编写任何构造函数
添加了构造函数的struct相当于成员全部public的类,而类的实例化必须通过构造函数,所以不能再使用{}初始化。
3、函数返回指针变量
C++允许函数返回局部指针,前提是指针指向的地址在函数退出后仍然有效。这涉及到C++内存分配问题。如果指针指向的内容是局部数组等存在与栈内存中的,则函数执行完后内容被销毁。
4、C++内存分配
C++编译器将计算机内存分为代码区和数据区。
数据区分配方式如下图所示:
不涉及动态分配的对象有严格定义的生存期。全局对象在程序启动时分配,程序结束时销毁。局部对象,在我们进入其定义所在的程序块时被创建,在程序结束时销毁。局部static对象在第一次使用前分配,在程序结束时销毁。
动态分配的对象的生存期与它们在哪里创建无关,只有显式地被释放时,才会销毁。
void f() {
int* p=newint[5];
}
delete []p;
5、指针问题
1)用malloc申请多个同名指针,或new多个同名指针,指针指向最后一次开辟的空间。
2)复制指针时复制指针本身所含的地址值,而不会复制指针指向的内容。
3)void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针。如果分配失败,则返回一个空指针(NULL)。
关于分配失败的原因,应该有多种,比如说空间不足就是一种。
void free(void *FirstByte): 该函数是将之前用malloc分配的空间还给程序或者是操作系统,也就是释放了这块内存,让它重新得到自由。
4)free 和 delete 释放的都是指针指向的内存。指针是一个变量,只有程序结束时才被销毁。
贴一下代码
#include <iostream>
#include <string>
#include<sstream>
#include <vector>
using namespace std;
typedef struct Polynomial{
double coef; //系数
int expn; //指数