数据结构(C语言)读书笔记3:顺序表

来源:互联网 发布:啥软件可以看禁播动漫 编辑:程序博客网 时间:2024/04/30 11:21

1、线性表的定义和特点
   (1)定义:有n(n>=0)个数据特性相同的数据元素构成的有限序列称为线性表。
   (2)特点:【1】存在唯一的被称为“第一个”的数据元素。
              【2】存在唯一的被称作“最后一个”的数据元素。
              【3】除了第一个之外,其他的数据元素均只有一个前驱。
              【4】除了最后一个外,结构中的每个元素均只有一个后继。
2、线性表的抽象数据类型
 ADT List{
数据对象:D={ai | ai∈ElemSet,i=1,2,。。。。n}
数据关系:R={ <ai-1, ai > | ai-1, ai∈D, i = 2, ..., n }
基本操作:
       InitList ( &L )
   操作结果:构造一个空的线性表 L 。 等  
}ADT List

4、顺序表
   线性表的顺序表示是指用一组地址连续的存储单元依次存储线性表中的数据元素,这种表示称为线性表的顺序存储结构或者顺序映像。
  称这种存储结构的线性表为顺序表。
顺序表的特点:以物理位置相邻表示逻辑关系。
顺序表的优点:任意元素均随机存取。
顺序表的缺点:进行插入和删除操作时,需要移动大量数据元素。
一般来说,顺序表第i个元素ai的存储位置为:LOC(ai)=LOC(ai-1)+(i-1)*l;
通常用数组来描述数据结构中的顺序存储结构。
顺序表的存储结构:
  #define MAXSIZE 100
   typedef struct{
   ElemType *elem;
   int length;
}Sqlist;

顺序表的初始化:
算法思想:(1)、为顺序表动态分配一个预定义大小的数组空间,使elem指向这段空间的的基地址。(2)、将标的当前长度设为0;
构造一个空的顺序表。
Status InitList_Sq(Sqlist  &L){
L.elem=new ElemType[MAXSIZE];
if(!L.elem) exit(OVERFLOW);
L.length=0;
return OK;
}

查找:
 查找可以包括两种情况,一是给定元素的序号进行查找,二是根据给定的数据值进行查找。
对于前者,由于顺序存储结构的随机存取的特点,可以直接通过数组下标定位得到。
算法思想:(1)从第一个元素起,依次和e比较。(2)若第i个元素等于e,则查找成功,返回钙元素的位序i+1;
(3)若查遍整个顺序表都没有找到,则查找失败,返回0;
int LocateElem_Sq(Sqlist L,ElemType  e){
for(i=0;i<L.length;i++)
    if(L.elem[i]==e) return i+1;
return 0;
}

查找算法的时间复杂度为O(N);


插入:
线性表的插入运算是指在表的第 i (1 =< i =< n +1) 个位置上,
插入一个新结点 b,使长度为 n 的线性表 (a1, …, ai –1, ai, …, an) 
变成长度为 n + 1 的线性表 (a1, …, ai –1, b, ai, …, an) 

算法思想: 1)检查 i 值是否超出所允许的范围 (1 =< i =< n +1) ,若超出,
      则进行“超出范围”错误处理; 2)将线性表的第 i 个元素和它后面所有元素均后移一个位置; 3)将新元素写入到空出的第 i 个位置上; 4)使线性表的长度增 1。
Status  ListInsert_Sq(Sqlist &L,int i,ElemType  e){
if(i<1||i>L.length +1)return ERROR;
if(L.length==MAXSIZE)return ERROR;
for(j=L.length-1;j>=i-1;j--)
{
L.elem[j+1]=L.elem[j];
}
L.elem[i-1]=e;
++L.length;
return OK;
}

插入算法的时间复杂度为O(n);


删除:
线性表的删除运算是指将线性表的第 i (1 =< i =< n) 个结点
删除,使长度为 n 的线性表  (a1, …, ai –1, ai, ai +1, …, an)
变成长度为 n -1 的线性表 (a1, …, ai –1, ai +1, …, an);

算法描述:  1)  检查 i 值是否超出所允许的范围 (1  i  n),若超出,则进
     行“超出范围”错误处理; 2)  将线性表的第 i 个元素后面的所有元素均前移一个位置; 3)  使线性表的长度减 1。
Status ListDelete_Sq(SqList &L, int i, ElemType &e) {
if(i<1||i>L.length)return ERROR;
e=L.elem[i-1];
for(j=i;j<=L.length-1;j++)
L.elem[j-1]=L.elem[j];
--L.length;
return OK;

删除算法的时间复杂度为O(N);