顺序表的创建
之前有写过链表的实现,不过也只是贴了一长串代码,今天我想再重新写一个顺序表,包括具体实现以及算法的细节地方
那么,顺序表是什么呢?顺序表是线性结构的最基本的一种结构,由它发展处多种线性结构,栈,队列,循环队列。我们所说的顺序表,顺序指的是什么呢?是位置,是地址,多有的元素都依次排列在一条线上,这就是跟我们所学的数组是一样的。
顺序表所涉及的功能特征与数组完全一样,所以我们就用数组来定义,再定义一个变量length来记录顺序表随时变化的长度。
您有两种定义方式:
1.用结构体的方式定义——“封装思想”
1 typedef struct{ 2 int data[maxsize]; 3 int length; 4 }Sqlist;
2.直接使用数组定义
1 int data[maxsize]; 2 int length;
这两种方式都是可以的,您可以根据自己的喜好选择。本文中我们选择的是结构体定义
顺序表的特点是:最大长度不可变,长度从程序运行之前就已经固定。
插入元素的算法
假设数组元素是从小大大顺序排列,如下:
现在想要将元素5插入进去,该如何做呢?
首先我们需要找到我们即将插入的位置,元素5应该插入到元素4的右边,那么,元素5的下标就应当是3.
为了找到元素5插入位置的下标,我们只需要找到第一个比5大的元素(6)的下标,再记录下来就行了。所以有下面算法:
1 //找到第一个比 x 大的数字,返回其下标,如果未找到,则返回最后一位元素的下一位 2 3 int fineElem(Sqlist L,int x){ 4 int i; 5 for(i = 0;i<L.length;i++){ 6 if(x<L.data[i]){ 7 return i; 8 } 9 } 10 return i; 11 }
然后是插入工作,怎么插入呢:
方法显而易见。我们需要从最后一个元素依次向后挪,最后再实行插入工作。
void insertElem(Sqlist &L,int x){ int p,i; p = findElem(L,x); //p为大于x的第一个数字的下标 for(i = L.length-1;i>=p;i--){ L.data[i+1] = L.data[i]; } L.data[p] = x; L.length++; }
下面是一些重要算法,下面算法的不同之处在于更加的人性化,对于插入和删除位置提供合法性判断。
1 //按照元素值的查找算法 2 int findElem(Sqlist L,int e){ 3 int i; 4 for(i = 0;i<L.length;i++){ 5 if(e == L.data[i]) 6 return i; 7 } 8 return -1; 9 } 10 //插入数据元素的算法 11 int insertElem(Sqlist &L,int p,int e){ 12 int i; 13 if(p<0 || p>L.length || L.length == maxsize) //p可以等于L.length的原因:因为插入元素可以插入到L.data[length] 14 { 15 return 0; 16 } 17 for(i = L.length-1;i>=p;i--){ 18 L.data[i+1] = L.data[i]; 19 } 20 L.data[p] = e; 21 L.length++; 22 return 1; 23 } 24 //删除元素 p为下标 25 int deleteElem(Sqlist &L,int p,int &e){ 26 int i; 27 if(p<0 || p>L.length-1){ //如果指定删除的位置不合法,则返回0,L.length-1为最后一个元素的下标 28 return 0; 29 } 30 e = L.data[p]; //将删除的值保存起来,由e保存 31 for(i = p;i<L.length-1;i++){ 32 L.data[i] = L.data[i+1]; 33 } 34 L.length--; 35 return 1; 36 } 37 //初始化顺序表 38 void initList(Sqlist &L){ 39 L.length = 0; 40 } 41 int main(){ 42 Sqlist L; 43 int n,i; 44 cin>>n; 45 for(i = 0;i<n;i++){ 46 cin>>L.data[i]; 47 } 48 L.length = i; 49 return 0; 50 }