所谓“零基础”二刷数据结构--1-线性表-顺序表
作者:互联网
·什么是线性表?
先来简单的说说什么是线性表,所谓的线性表就是一种可以在任意位置插入和删除的存储结构,它是由若干个相同数据类型的线性结构。
·顺序表
顺序表用的是一组地址连续的数据元素依次存在线性表中,所以两个元素不仅逻辑上相邻而且物理上也相邻。第1个元素存储在线性表起始位置,第i个元素和第i+1个元素紧挨着,其中i表示数据元素在线性表中的位序。需要注意的的是我们常用的数组的下标是从0开始的,而线性表中的下标是从1开始的,不要混淆。
静态分配:数组的大小和空间是分配好的,使用时直接对数组元素操作就可以,但是一旦空间为空,也就是被占满了,再向里面插入数据就会溢出,而导致插入失败。
动态分配:通过动态存储分配空间,空间满了后,就会分配一块更大的存储空间来存放原来的数据,但是动态分配依然是顺序存储而不是链式存储。
·基本操作
·静态分配及初始化
typedef struct{ int data[maxsize]; int length; //数组长度 }sqlist; void Initlist(sqlist &L){ int i; for(i = 0 ; i < maxsize ; i++){//初始化数组,清除脏数据 L.data[i]=0; L.length=0; } printf("初始化成功\n"); }
·动态分配及初始化
typedef struct{ int *data; int maxsize; int length; }sqlist; void InitList(sqlist &L){ L.data=(int *)malloc(Initsize*sizeof(int)); L.length=0; L.maxsize=Initsize; }
·插入操作:在点i个位置插入新的元素e,如果i小于1或者大于数组长度,则插入失败;如果插入成功,从第i个元素开始(包括i)往后元素依次后移一个位置,之后把e存在原来i的位置。之后顺序表的长度+1,这就完成了插入操作。
bool ListInsert(sqlist &L,int i,int e){ int j; if(i > L.length+1 || i < 1){//先判断i是否合法 return false; } if(L.length >= maxsize){ return false; } for(j = L.length;j >= i;j--){ //从i开始,后面的元素依次后移一位 L.data[j] = L.data[j-1]; } L.data[i-1] = e; //原来i的位置插入e L.length ++; //长度+1 printf("插入成功\n"); }
·删除操作:跟插入为逆操作,如果删除第i个元素,先判断i是否合法,如果合法就从第i+1个元素开始依次向前移动一个位置,以后顺序表的长度-1。
bool ListDelete(sqlist &L,int i){ int j; if(i>L.length || i < 0){ //判断i是否合法 return false; } for(;i<L.length;i++){ L.data[i-1]=L.data[i]; //i后面的元素依次前移一位 } L.length --; //长度-1 printf("删除成功\n"); }
·查找操作:按值查找,依次遍历各个元素,直到查到第一个元素值等于e的元素,并返回该元素的位序。
int ListFindZhi(sqlist L,int e){ int i; for(i = 0 ;i < L.length ; i++){ if(L.data[i] == e) //找到等于e的元素 return (i+1); //返回其下标 } }
·排序操作:利用冒泡法对顺序表进行排序。
void ListSort(sqlist &L){ //冒泡法排序 int i,j,temp; for(i = L.length;i > 0; i --){ for(j = 0;j < i-1 ; j ++){ if(L.data[j] > L.data[j+1]){ temp = L.data[j]; L.data[j] = L.data[j+1]; L.data[j+1] = temp; } } } printf("排序成功\n"); }
·删除重复元素:将一个有序数组中的重复元素删除,产生一个不含重复元素的有序数组。
bool ListQvchong(sqlist &L){ //删除重复元素 int left = 0,right = 1,length = 0; //left在第1个元素,right在第2个元素,长度为0 if(L.length < 0) return false; for(; right < L.length; right++){ //每次判断right均向右移 if(L.data[left] != L.data[right]){ //左右值相等,left+1并让其等于right的值 L.data[++left] = L.data[right]; length ++; //长度+1 } } L.length = length; printf("删除重复元素成功\n"); }
顺序表的各个元素是顺序存储的,只不过顺序表的下标是从1开始,数组是从0开始,其它的增删改查操作跟数组操作类似。顺序表也算法题的一个重点,这类题实现起来比较容易且代码量少,但却拥有最优的性能,希望大家可以对顺序表有更深的理解。
标签:线性表,--,元素,length,二刷,int,sqlist,data 来源: https://www.cnblogs.com/zhang-a-d/p/14803772.html