顺序表的总结

mac2024-04-15  35

文章目录

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];//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; } } }
最新回复(0)