#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;
}
}
}