数据结构之顺序表

    科技2023-11-04  105

    顺序表

    Tips①形参 实参 &②typedef 和 define的区别:③return 代码

    Tips

    ①形参 实参 &

    所有改变顺序表的函数的形参都是SqList &L ,不改变顺序表的函数的形参都是SqList L 形参SqList &L 改变顺序表后,能让实参也发生改变 形参SqList L 不能让实参也发生改变 详细原因可见c++学习

    ②typedef 和 define的区别:

    1.typedef 仅限于为类型定义符号名称。 typedef int ElemType; 2.#define 不仅可以为类型定义别名,也能为数值定义别名。 #define ok 1 #define ElemType int 3.typedef 是由编译器执行解释的,#define 语句是由预编译器进行处理的。

    ③return

    函数中无论什么地方,遇到return函数就结束了 return 表示从被调函数返回到主调函数继续执行,返回时可附带一个返回值,由return后面的参数指定。   注:return通常是必要的,因为函数调用的时候计算结果通常是通过返回值带出的。 如果函数执行不需要返回计算结果, 也经常需要返回一个状态码来表示函数执行的顺利与否(-1和0就是最常用的状态码),主调函数可以通过返回值判断被调函数的执行情况。 在程序中return 语句是返回方法的结果值,并终止当前方法

    代码

    注:注意while循环和switch语句的使用 剩下的内容都在都在代码注释里,请读者仔细阅读注释

    //注意:所有改变顺序表的函数的形参都是SqList &L 不改变顺序表的函数的形参都是SqList L // SqList &L 改变顺序表后,能让实参也发生改变 // SqList L 不能让实参也发生改变 详细原因可见c++学习 //注意typedef 和 define的区别 typedef int ElemType; //ElemType 可以是基本数据类型 (比如int) 也可以是构造数据类型 typedef int Status; //Status 是函数返回值类型,其值是函数结果状态代码。这里函数返回值类型是int #define MAXSIZE 100 #include <iostream> using namespace std; typedef struct { ElemType *elem; //存储空间的基地址(elem数组的第一个元素的地址) int length; }SqList; // 1.初始化 //构造一个空的顺序表 Status CreateList(SqList& L) { L.elem = new ElemType[MAXSIZE]; //为顺序表分配一个大小为MAXSIZE的数组空间 L.length = 0; return 1; } //2.取值,取出顺序表中第i个元素的值 void GetElem(SqList L, int i, ElemType& e) // &e 才能将e的值返回到实参中 { if (i<1 || i>L.length) cout << "ERROR" << endl; else e = L.elem[i - 1]; } /* ElemType GetElem(SqList L, int i) // &e 才能将e的值返回到实参中 { if (i<1 || i>L.length) cout << "ERROR" << endl; else return L.elem[i]; } */ //3.查找 //如果查找成功,返回序号。 如果查找失败,for循环结束后,返回-1 //当前功能仅可返回与e相等的第一个数的序号.还可以添加新的功能:①返回所有与e相等的序号②等等 //函数中无论什么地方,遇到return函数就结束了 /*return 表示从被调函数返回到主调函数继续执行,返回时可附带一个返回值,由return后面的参数指定。   注:return通常是必要的,因为函数调用的时候计算结果通常是通过返回值带出的。 如果函数执行不需要返回计算结果, 也经常需要返回一个状态码来表示函数执行的顺利与否(-1和0就是最常用的状态码),主调函数可以通过返回值判断被调函数的执行情况。 在程序中return 语句是返回方法的结果值,并终止当前方法*/ int SearchList(SqList L, ElemType e) { for (int i = 0; i < L.length; i++) { if (L.elem[i] == e) return i + 1; } return -1; } //4.插入 合法范围是 1=<i<=L.length+1 //特别注意一下for循环 int ListInsert(SqList &L, int i, ElemType e) { if (i < 1 || i>L.length + 1) //i值不合法 return -1; if (L.length == MAXSIZE) //当前存储空间已满 return -1; for (int j = L.length - 1; j >= i - 1; j--) //插入位置及之后的元素后移 { L.elem[j + 1] = L.elem[j]; } L.elem[i-1] = e; //将新元素e放入第i个位置 L.length++; return 1; //插入成功,返回1 } //5.删除 //在顺序表L中删除第i个元素,并用e返回其值 //i值的合法范围是1<=i<=L.length int ListDelete(SqList& L, int i,ElemType &e) { if (i < 1 || i>L.length) return -1; e = L.elem[i - 1]; //将欲删除的元素保留在e中 for (int j = i; j <= L.length - 1; j++) //被删除元素之后的元素前移 L.elem[j - 1] = L.elem[j]; L.length--; return 1; //删除成功,返回1 } int main() { SqList L; int i, res, temp, a, b, c, e, choose; cout << "1. 建立顺序表\n"; cout << "2. 输入数据\n"; cout << "3. 查找\n"; cout << "4. 插入\n"; cout << "5. 删除\n"; cout << "6. 输出数据\n"; cout << "7. 取值\n"; cout << "0. 退出\n\n"; choose = -1; while (choose != 0) //因为这个while循环,所以当输入0时会结束 { cout << "请选择:"; cin >> choose; switch (choose) { case 1: if (CreateList(L)) //创建顺序表 cout << "成功建立顺序表\n\n"; else cout << "顺序表建立失败\n\n"; break; case 2: //输入N个数 cout << "你想输入几个数:"; int N; cin >> N; cout << "请输入:\n"; for (i = 0; i < N; i++) cin >> L.elem[i]; L.length = N; cout << endl; break; case 3: //顺序表的查找 cout << "请输入所要查找的数:"; cin >> e; //输入e,代表所要查找的数值 temp = SearchList(L, e); if (temp != -1) cout << e << " 是第 " << temp << "个数.\n\n"; else cout << "查找失败!没有这样的数\n\n"; break; case 4: //顺序表的插入 cout << "请输入两个数,分别代表插入的位置和插入数值:"; cin >> a >> b; //输入a和b,a代表插入的位置,b代表插入的数值 if (ListInsert(L, a, b)) cout << "插入成功.\n\n"; else cout << "I插入失败.\n\n"; break; case 5: //顺序表的删除 cout << "请输入所要删除的数:"; cin >> c; //输入c,代表要删除数的位置 if (ListDelete(L, c, res)) cout << "删除成功.\n被删除的数是:" << res << endl << endl; else cout << "删除失败.\n\n"; break; case 6: //顺序表的输出 cout << "当前顺序表为:\n"; for (i = 0; i < L.length; i++) cout << L.elem[i] << " "; cout << endl << endl; break; case 7: cout << "请输入你想要取出第几个数:"; int x; cin >> x; ElemType t; GetElem(L, x, t); cout << t << endl; } } return 0; }
    Processed: 0.017, SQL: 8