#include<stdio.h>
#include<stdlib.h>
#include<string>
#include<iostream>
using namespace std;
#define MAXSIZE 100//多项式可能达到的最大长度
typedef struct{//多项式 非零项的定义(零项不必写)
float coef;//系数
int expn;//指数
}Polynomial;
typedef struct{
Polynomial *elem;//存储空间的基地址
int length;//多项式中当前项的个数
}SqList;
//初始化
void InitList(SqList &L){
L.elem = new Polynomial[MAXSIZE];
L.length = 0;
return;
}
//取值
bool GetElem(SqList L, int i, Polynomial &e){
if (i < 1 || i > L.length)return false;
e = L.elem[i - 1];//elem[1-1]单元存储第i个数据元素
return true;
}
//查找
int LocateElem(SqList L, Polynomial e){
for (int i = 0; i < L.length; i++){
if (e.coef==L.elem[i].coef&&e.expn==L.elem[i].expn)return i+1;//查找成功,返回i+1
}
return 0;//失败,返回0
}
//插入
bool InsertList(SqList &L, int i, Polynomial e){
if (i<1 || i>(L.length + 1)){printf("超出表的范围,"); return false;}//超出表长+1(+1是因为插入后,表长会+1)
if (L.length == MAXSIZE){ printf("表满,"); return false; }//存储空间满
for (int j = L.length - 1; j >= i-1; j--)//从最后一项开始往后挪一位,直到第i个元素(第i-1项),给插入到第i个元素(第i-1项)腾位置
L.elem[j+1] = L.elem[j];
L.elem[i - 1] = e;//插入
++L.length;//表长+1
return true;
}
//删除
bool DeleteList(SqList &L, int i){ //第i个数(第i-1项)
if (i<1 || i>L.length)return false;
for (; i < L.length; i++)//从第i+1个数(i项)开始往前挪一位,直到表尾
L.elem[i - 1] = L.elem[i];
--L.length;
return true;
}
//输出顺序表
void WatchList(SqList L){
if (L.length == 0){
printf("表空\n");
return;
}
printf("顺序表:系数:");
for (int i = 0; i < L.length; i++)
printf("%.1f ", L.elem[i].coef);
printf("\n顺序表:指数:");
for (int i = 0; i < L.length; i++)
printf("%d ", L.elem[i].expn);
printf("\n");
return;
}
//op函数使得输入的指令转化为整数为switch所用
typedef enum{init,getelem,locate,insert,del,watch,END,other}OP;
OP op(string a){//将输入的字符串转换成枚举类返回(中的枚举元素其实算是整数)
if (a == "init")return init;
else if (a == "get")return getelem;
else if (a == "locate")return locate;
else if (a == "insert")return insert;
else if (a == "delete")return del;
else if (a == "watch")return watch;
else if(a=="END")return END;
else return other;
}
//菜单
void menu(SqList &L){
string t;
int i;
Polynomial e;
while (1){
//printf("1.重新初始化(init)2.取值(get)3.查找(locate)4.插入(insert)5.删除(delete)6.查看顺序表(watch)5.结束(END)\n");
printf("1.(init)2.(get)3.(locate)4.(insert)5.(delete)6.(watch)5.(END)\n");
cin >> t;
switch (op(t))
{
case init:InitList(L); printf("初始化成功\n"); break;
case getelem:
cout << "位置:" ;
cin >> i;
if (!GetElem(L, i, e))
printf("不在表长内\n");
else
printf("系数:%f指数:%d\n", e.coef, e.expn);
break;
case locate:
cout << "系数/指数" ;
cin >> e.coef >> e.expn;
i = LocateElem(L, e);
if (i)
printf("位置在%d\n", i);
else
printf("未找到\n");
break;
case insert:
cout << "位置:";
cin >> i;
cout << "系数/指数" ;
cin >> e.coef >> e.expn;
if (!InsertList(L, i, e))
printf("插入失败\n");
break;
case del:
cout << "位置:" ;
cin >> i;
if (!DeleteList(L, i))
printf("删除失败\n");
break;
case watch:
WatchList(L);
break;
case END:
return;
case other:
printf("WRONG\n");
break;
default:
break;
}
}
}
int main(){
SqList L;
menu(L);
system("PAUSE");
return 0;
}
0.结构体
L中存了多项式数组和当前项的个数两个元素
L.elem即代表多项式数组
L.elem[i]即代表第i-1个多项式
L.elem[i].coef即代表第i-1个式子的系数元素
#define MAXSIZE 100//多项式可能达到的最大长度
typedef struct{//多项式 非零项的定义(零项不必写)
float coef;//系数
int expn;//指数
}Polynomial;
typedef struct{
Polynomial *elem;//存储空间的基地址
int length;//多项式中当前项的个数
}SqList;
1.初始化
new的例子:分配大小为MAXSIZE的存储空间
//初始化
void InitList(SqList &L){
L.elem = new Polynomial[MAXSIZE];
L.length = 0;
return;
}
2.取值
若取到返回true,取得的值用e引用传递带出
若未取到返回false
bool GetElem(SqList L, int i, Polynomial &e){
if (i < 1 || i > L.length)return false;
e = L.elem[i - 1];//elem[1-1]单元存储第i个数据元素
return true;
}
3.查找
int LocateElem(SqList L, Polynomial e){
for (int i = 0; i < L.length; i++){
if (e.coef==L.elem[i].coef&&e.expn==L.elem[i].expn)return i+1;//查找成功,返回i+1
}
return 0;//失败,返回0
}
4.插入
若超出表长+1(+1是因为插入后,表长会+1)或存储区满则无法插入
若可以插入,从最后一项开始往后挪一位,直到第i个元素(第i-1项),给插入到第i个元素(第i-1项)腾位置
bool InsertList(SqList &L, int i, Polynomial e){
if (i<1 || i>(L.length + 1)){printf("超出表的范围,"); return false;}//超出表长+1(+1是因为插入后,表长会+1)
if (L.length == MAXSIZE){ printf("表满,"); return false; }//存储空间满
for (int j = L.length - 1; j >= i-1; j--)//从最后一项开始往后挪一位,直到第i个元素(第i-1项),给插入到第i项腾位置
L.elem[j+1] = L.elem[j];
L.elem[i - 1] = e;//插入
++L.length;//表长+1
return true;
}
5.删除
从第i+1个数(i项)开始往前挪一位,直到表尾
bool DeleteList(SqList &L, int i){ //第i个数(第i-1项)
if (i<1 || i>L.length)return false;
for (; i < L.length; i++)//从第i+1个数(i项)开始往前挪一位,直到表尾
L.elem[i - 1] = L.elem[i];
--L.length;
return true;
}
6.输出顺序表
void WatchList(SqList L){
if (L.length == 0){
printf("表空\n");
return;
}
printf("顺序表:系数:");
for (int i = 0; i < L.length; i++)
printf("%.1f ", L.elem[i].coef);
printf("\n顺序表:指数:");
for (int i = 0; i < L.length; i++)
printf("%d ", L.elem[i].expn);
printf("\n");
return;
}
菜单
(op函数使得输入的指令转化为整数为switch所用)
enum中的元素实际上相当于整数
//op函数使得输入的指令转化为整数为switch所用
typedef enum{init,getelem,locate,insert,del,watch,END,other}OP;
OP op(string a){//将输入的字符串转换成枚举类返回(中的枚举元素其实算是整数)
if (a == "init")return init;
else if (a == "get")return getelem;
else if (a == "locate")return locate;
else if (a == "insert")return insert;
else if (a == "delete")return del;
else if (a == "watch")return watch;
else if(a=="END")return END;
else return other;
}
//菜单
void menu(SqList &L){
string t;
int i;
Polynomial e;
while (1){
//printf("1.重新初始化(init)2.取值(get)3.查找(locate)4.插入(insert)5.删除(delete)6.查看顺序表(watch)5.结束(END)\n");
printf("1.(init)2.(get)3.(locate)4.(insert)5.(delete)6.(watch)5.(END)\n");
cin >> t;
switch (op(t))
{
case init:InitList(L); printf("初始化成功\n"); break;
case getelem:
cout << "位置:" ;
cin >> i;
if (!GetElem(L, i, e))
printf("不在表长内\n");
else
printf("系数:%f指数:%d\n", e.coef, e.expn);
break;
case locate:
cout << "系数/指数" ;
cin >> e.coef >> e.expn;
i = LocateElem(L, e);
if (i)
printf("位置在%d\n", i);
else
printf("未找到\n");
break;
case insert:
cout << "位置:";
cin >> i;
cout << "系数/指数" ;
cin >> e.coef >> e.expn;
if (!InsertList(L, i, e))
printf("插入失败\n");
break;
case del:
cout << "位置:" ;
cin >> i;
if (!DeleteList(L, i))
printf("删除失败\n");
break;
case watch:
WatchList(L);
break;
case END:
return;
case other:
printf("WRONG\n");
break;
default:
break;
}
}
}