顺序表
顺序表在储存数据前会申请一块连续空间。
对于顺序表的使用,和以前使用动态分配实际差不多。
初始化:
- 动态分配内存存入head
- length初始为0,size初始固定。
- 赋值一个空间,length加一
插入:
- 判断是否有足够空间(是否需要realloc),插入位置是否正确。
- 将插入位置后的元素,逐个后移。
- 将元素插入到指定位置。
- length加一。
删除:
- 判断删除位置是否正确。
- 循环,将删除后的元素逐个往前一位
- length减一
查找:
- 循环,查看元素是否相等
更改:
- 查找到需要更改元素
- 赋新值
#include <iostream> using namespace std; #define SIZE 5 struct table{ int *head;//指针用来指向动态分配空间地址 int length;//当前顺序表长度 int size;//动态申请大小 }; table initTable(){ table t; t.head = new int[SIZE]; if (!t.head) { cout << "初始化失败!" << endl; exit(1); } t.length = 0; t.size = SIZE; return t; } table InsertFunc(table a, int elem, int pos) { if (pos > a.length + 1 || pos < 1) { cerr << "位置错误" << endl; return a; } if (a.size = a.length) { a.head = (int *)realloc(a.head, (SIZE + 1) * sizeof(int)); if (!a.head) { cerr << "分配失败" << endl; return a; } } a.size = SIZE + 1; for (int i = a.length - 1; i >= pos - 1; --i) { a.head[i + 1] = a.head[i]; } a.head[pos - 1] = elem; a.length++; return a; } table Delete(table a, int pos) { if (pos > a.length || pos < 1) { cerr << "位置错误" << endl; return a; } for (int i = pos - 1; i < a.length - 1; ++i) { a.head[i] = a.head[i + 1]; } a.length--; return a; } int Find(table t, int elem) { for (int i = 0; i < t.length; ++i) { if (t.head[i] == elem) { return i + 1; } } cout << "未查询到" << elem << endl; return -1; } table Alter(table t, int elem, int pos) { t.head[pos - 1] = elem; return t; } void Display(const table& t){ for (int i = 0; i < t.length; ++i) { cout << t.head[i] << " "; } cout << endl; } int main() { table ta = initTable(); for (int i = 0; i < SIZE; ++i) { ta.head[i] = i; ++ta.length; } //ta.head = new int[SIZE + 1]{ 0,1,2 }; cout << "初始化数据,顺序表元素为:"; Display(ta); ta = InsertFunc(ta, 5, 6); cout << "插入数据后,顺序表元素为:"; Display(ta); ta = Delete(ta, 1); cout << "删除数据后,顺序表元素为:"; Display(ta); int pos = Find(ta, 2); if (pos != -1) { cout << "查询数据,位置为:" << pos << endl; } ta = Alter(ta, 12, 3); cout << "更改第三个位置的数据为12:"; Display(ta); system("PAUSE"); return 0; }