四、线性表的逻辑结构

线性表是具有相同特性的数据元素的有限序列(一个前驱和后继)

  • 9个基本运算(一次删一个)

数据结构(知识点碎片二)_线性表基本运算

数据结构(知识点碎片二)_顺序表_02

线性表的作用主要体现在两个方面:当一个线性表实现后,程序员可以直接使用它来存放数据,即作为存放数据的容器;另外程序员可以直接使用它的基本运算来完成更复杂的功能。


五、线性表的顺序存储结构

线性表的顺序存储结构简称为顺序表

一旦发现某个顺序表有存满并溢出的情况,很可能需要移动其他表以腾出位置为其扩充空间,导致不断地把大片数据移来移去(紧凑操作)。

插入删除:见缝插针或根据下标(常见);插入需从后往前挪,删除需从前往后挪(避免元素覆盖);总插入次数:n+n-1+n-2...+0 =n(n+1)/2,平均插入次数:n/2,时间复杂度O(n)。

查找位置:只需知道下标,支持随机存取(便于输入输出元素值)。

元素移动次数计算(有点类似数学期望,以插入元素为例):一般每个位置的概率相等即p=1/(n+1);在 i 位置(0~n)之前插入元素需移动 n-i 个元素;插入元素平均要移动的元素个数为 n/2,总移动次数(n+0)(n+1)/2,平均移动次数(n+0)(n+1)p/2。(删除元素与之一样逻辑)

  • 建表算法:
//顺序表建表算法
int A[maxSize]; 
int length;
int createList(int A[], int &length)//把元素一一存入数组中
{
   cin>>length;
   if(length > maxSize)
      return 0; //建表失败的标记
   for(int i=0; i<length; ++i)
      cin>>A[i]; 
   return 1;
}
  • 插入算法:可插入下标位置p的取值范围是:0到 length; 当表长length等于数组长度maxSize 的时候,不可以再插入元素; 移动元素从后往前进行。
//创建一个顺序表
int sqList[maxSize]	= {	1, 2, 3,... ,	n};	
int length = n;

//设计插入函数
int insertElem(int sqList[],int &length, int p, int e)
//注意:函数参数按照常规方法定义为数组,无需加“&”符号,即可在函数体内直接改变所传入数组的元素值,可以理解为,只要函数参数定义为数组,就是定义的引用型数组。
{
   if(p<0 || p>length || length==maxSize)
      return 0; //满足if里面不合法的条件时,结束函数返回0
   for(int i = length-1; i >= p; --i)
      sqList[i+1] = sqList[i]; 
   sqList[p] = e;
   ++length; 
   return l;
}
  • 删除算法:可删除元素下标p的取值范围是:0到 length - 1; 当表长 length 等于0的时候,不可以再删除元素; 移动元素从前往后进行。
//设计删除函数
int deleteElem(int sqList[], int &length, int p, int &e)//把删除的元素保存在函数参数e中
{
   if(p<0 || p>length-1) // p!=0的情况已经包含在条件中了
      return 0; 
   e= sqList[p]; //为了把删除的元素取出来,必须提前将它赋值给参数e
   for(int i = p; i<length-1; ++i)
      sqList[i] = sqList[i+1]; 
   --length; 
   return 1;
}




数据结构(知识点碎片二)_顺序表_03