文章目录
0.结构体1.初始化2.取值3.查找4.插入5.删除6.输出顺序表菜单
#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];
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;
}
return 0;
}
bool
InsertList(SqList
&L
, int i
, Polynomial e
){
if (i
<1 || i
>(L
.length
+ 1)){printf("超出表的范围,"); return false
;}
if (L
.length
== MAXSIZE
){ printf("表满,"); return false
; }
for (int j
= L
.length
- 1; j
>= i
-1; j
--)
L
.elem
[j
+1] = L
.elem
[j
];
L
.elem
[i
- 1] = e
;
++L
.length
;
return true
;
}
bool
DeleteList(SqList
&L
, int i
){
if (i
<1 || i
>L
.length
)return false
;
for (; i
< L
.length
; 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;
}
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");
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];
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;
}
return 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
;}
if (L
.length
== MAXSIZE
){ printf("表满,"); return false
; }
for (int j
= L
.length
- 1; j
>= i
-1; j
--)
L
.elem
[j
+1] = L
.elem
[j
];
L
.elem
[i
- 1] = e
;
++L
.length
;
return true
;
}
5.删除
从第i+1个数(i项)开始往前挪一位,直到表尾
bool
DeleteList(SqList
&L
, int i
){
if (i
<1 || i
>L
.length
)return false
;
for (; i
< L
.length
; 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中的元素实际上相当于整数
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");
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;
}
}
}