#include <iostream> using namespace std; /************************************************************************/ /* 数据结构学习方法: 记住数据结构——所有的操作都是围绕数据结构进行的。不同的结构又不同的操作,结构决定操作。 动手写算法。 ——写算法的步骤:(必须先搞清数据+结构) 1 先写函数注释,即用自然语言描述算法的逻辑意义。 2 然后列出算法的步骤,第一步先验证参数合法性 3 最后再开始写代码。 重复以上动作,养成习惯,学习新的数据结构和算法会越来越快。 */ /************************************************************************/ // 定义数据 + 结构。 定义了一个顺序表数据结构。 所谓顺序表就是 数据元素的关系结构由 存储位置来表示的。 #define ELEMTYPE int #define MaxSize 100 typedef struct { ELEMTYPE data[MaxSize];// 用于存放数据 int length;//已有数据的长度 int size;//可容纳数据的长度 }list; /*定义各种操作,也就是所谓的 算法。所有操作都是基于 数据元素的,所以一定要记住上边的数据结构。 //初始化顺序表 //销毁顺序表 //清空顺序表 //求表长 //添加 //删除 //查找 //定位 */ /* 初始化顺序表*/ void initList(list &L ) { L.length =0; L.size = MaxSize;// ???????? ELEMTYPE* data = new ELEMTYPE[MaxSize];// 为顺序表分配内存.是否需要考虑空间分配失败的情况。 } /*销毁顺序表*/ void destroyList(list L) { delete[] (L.data); L.length =0; L.size = 0; } /*清空顺序表*/ void clearList(list& L) { L.length =0; } /*求表长*/ int getLenghtList(list L) { return L.length; } /*添加元素*/ bool addElem(list& L, ELEMTYPE x) { /*算法的步骤: 判断顺序表是否已满 添加数据到表尾 */ int length = L.length; //判断是否已满 if (L.length >= L.size) { cout<<"表已满 "; return false; } //如果没满,就添加 L.data[L.length] = x; L.length = L.length+1;// 表长加 1 return true; } /*删除数据,并移动后边的元素*/ ELEMTYPE deleteElem(list & L, int num) { /*算法的步骤: //判断顺序表不为空 //判断删除位置是否合法 //删除元素,并移动后边的元素 */ if (0 ==L.length )//判断表不为空 { cout<<"表为空"; return false; } if (num >L.length || num <1)// 判断删除位置是否正确 { cout<<"删除位置有误"; return false; } ELEMTYPE elemReturned = L.data[num -1]; //删除元素,并移动后边的数据.注意:表地址从 0开始计数 int i=0 ; for (i =num-1; i< (L.length-1);i++) { L.data[i] = L.data[i+1]; } --L.length ;// 修改表长 return elemReturned; } /*在表第num个位置,插入数据*/ bool insertList(list &L, int num, ELEMTYPE x) { /*算法步骤: 判断表是否已满 判断插入位置是否合法 插入数据,并移动后边的元素 */ if (L.length >= L.size)//判断表是否已满 { cout<<"表已满"<<endl; return false; } if (num >L.length || num < 1)//判断插入位置是否合法 { cout<<"插入位置不合法"<<endl; return false; } //插入数据,并移动后边的数据 int i =0; for (i =L.length ;i >=num ;i--) { L.data[i] = L.data[i-1]; } L.data[i] = x; L.length += 1; return true; } /*去表中的元素*/ ELEMTYPE getElemList(list L, int num) { /* 算法步骤: 判断参数是否合法 */ if (num >= L.length || num <1) { cout<<"您输入的序 "<<num <<" 越界"<<endl; } return L.data[num-1]; } /* 定位数据在表中的位置,并返回其值*/ int locateElemList(list L, ELEMTYPE x ) { /* 算法步骤: 判断参数是否合法 查找元素所在位置 返回位置 */ int i= 0; for (i = L.length ;i>=0 ;i--) { if (L.data[i] == x) { return i+1; } } return i; } /*输出表中所有元素*/ void printList(list &L) { int i = 0; for (i =0; i<L.length ;i++) { cout.width(5); cout<<L.data[i]; } cout<<endl; } int main() { list L; //------------//初始化顺序表 initList(L); //------------//添加顺序表元素 int num =10; int i = 0; for (i =0; i<num; i++) { addElem(L,i); } cout<<"插入数据元素成功!"<<endl; //------------ 插入数据 ELEMTYPE x; x=100; int pos = 1; insertList(L ,pos ,x); //------------ 求表长 int count = getLenghtList(L); cout<<"----表长为 "<<count<< endl; //-----------取表中的元素 x = getElemList(L,pos); cout<<"在第 "<<pos <<"个位置,元素为: "<<x<<endl; //------------定位元素位置 int position = locateElemList(L, 10); cout<<"数据 "<<x<<" 在表中的位置为 "<<position <<endl; //------------删除表中数据 ELEMTYPE elem = deleteElem(L,pos); cout <<"----删除的元素为___"<<x<<endl; //------------ 输出表中所有元素 cout<<"----输出所有元素: "<<endl; printList(L); //destroyList(L);//销毁表 return 1; }