> 教育经验 > 什么是顺序存储介绍

什么是顺序存储介绍

什么是顺序存储介绍

顺序存储是所有的结点元素存放在一块连续的存储区域中,用存储结点的物理位置来体现结点之间的逻辑关系的存储方法。在高级语言中,一块连续的存储空间通常可用一个数组来表示。因此,顺序存储通常用一个数据元素类型的数组来存储。最经典的顺序存储结构是顺序表,将线性结构的元素按序存放在一个数组中。

顺序存储简介

顺序存储是指用一段地址连续的存储单元存储相邻数据元素,或把逻辑上相邻的结点存储在物理位置上相邻的存储单元中,结点之间的逻辑关系由存储单元的邻接关系来体现(逻辑与物理统一),要求内存中可用的存储单元的地址必须是连续的。优点:存储密度大,存储空间利用概率高。缺点:插入或删除元素时不方便。与顺序存储相对应是链接存储。这种方法主要用于线性的数据结构。对非线性结构也可以采用局部线性化的方法实现顺序存储。例如,在树形结构中可以把结点按某种规则排成序列,用顺序存储方法把结点内部的信息稠密地存放在一起,而对结点之间的关系采用其他的存放方法。

顺序存储主要使用数组,采用顺序存储的优点:可以随机访问数组中的元素,即通过下标去访问数组的元素;其缺点主要有二:其一,由于C语言中,数组一旦被声明,其长度即该结构占用的存储空间是固定的,申请的空间过大,造成空间的浪费同时也为维护该结构造成困难,申请过小,在程序运行过程中,有可能会造成结构空间不足,导致程序故障;其二,在插入,删除数据时,通常会导致大量数据的移动,在等概率的前提下,平均需要移动整个结构中一半的元素,如果元素个体比较复杂问题将更为明显。

顺序存储链接存储

数据元素之间的关系有两种不同的表示方法:顺序映象和非顺序映象,并由此得到两种不同的存储结构:顺序存储结构和链式存储结构。数据的存储结构,也称为数据的物理结构,是数据的逻辑结构在计算机中的实现。

链接存储方法它不要求逻辑上相邻的结点在物理位置上亦相邻,结点间的逻辑关系是由附加的指针字段表示的。由此得到的存储表示称为链式存储结构,链式存储结构通常借助于程序设计语言中的指针类型来实现。数据的链式存储结构可用链接表来表示。

其中data表示值域,用来存储节点的数值部分。P1, P2, …Pn(n≥1)均为指针域,每个指针域为其对应的后继元素或前驱元素所在结点(以后简称为后继结点或前驱结点)的存储位置。通过结点的指针域(又称为链域)可以访问到对应的后继结点或前驱结点,若一个结点中的某个指针域不需要指向其他结点,则令它的值为空(NULL)。在数据的顺序存储中,由于每个元素的存储位置都可以通过简单计算得到,所以访问元素的时间都相同;而在数据的链接存储中,由于每个元素的存储位置保存在它的前驱或后继结点中,所以只有当访问到其前驱结点或后继结点后才能够按指针访问到,访问任一元素的时间与该元素结点在链式存储结构中的位置有关。

顺序存储顺序表

顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,采用顺序存储结构的线性表通常称为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。

#define LIST_INIT_SIZE 10 #define LIST_INCREMENT 2 typedef struct{  ElemType *elem;   int length;   int listsize; }SqList;void InitList(SqList *L) {   L->elem=malloc(LIST_INIT_SIZE*sizeof(ElemType));  if(!L->elem)    exit(OVERFLOW);   L->length=0;   L->listsize=LIST_INIT_SIZE; }void DestroyList(SqList *L){   free(L->elem);  L->elem=NULL;  L->length=0;  L->listsize=0;}void ClearList(SqList *L){   L->length=0;}Status ListEmpty(SqList L){   if(L.length==0)    return TRUE;  else    return FALSE;}int ListLength(SqList L){   return L.length;}Status GetElem(SqList L,int i,ElemType *e){   if(iL.length)    return ERROR;  *e=*(L.elem+i-1);  return OK;}int LocateElem(SqList L,ElemType e,Status(*compare)(ElemType,ElemType)){       ElemType *p;  int i=1;   p=L.elem;   while(i<=L.length&&!compare(*p++,e))    ++i;  if(i<=L.length)    return i;  else    return 0;}Status PriorElem(SqList L,ElemType cur_e,ElemType *pre_e){       int i=2;  ElemType *p=L.elem+1;  while(iL.length)    return INFEASIBLE;   else  {    *pre_e=*--p;    return OK;  }}Status NextElem(SqList L,ElemType cur_e,ElemType *next_e){       int i=1;  ElemType *p=L.elem;  while(i<L.length&&*p!=cur_e)  {    i++;    p++;  }  if(i==L.length)    return INFEASIBLE;   else  {    *next_e=*++p;    return OK;  }}Status ListInsert(SqList *L,int i,ElemType e) {     ElemType *newbase,*q,*p;  if(iL->length+1)     return ERROR;  if(L->length>=L->listsize)   {    newbase=realloc(L->elem,(L->listsize+LIST_INCREMENT)*sizeof(ElemType));    if(!newbase)      exit(OVERFLOW);     L->elem=newbase;     L->listsize+=LIST_INCREMENT;   }  q=L->elem+i-1;   for(p=L->elem+L->length-1;p>=q;--p)     *(p+1)=*p;  *q=e;   ++L->length;   return OK;}Status ListDelete(SqList *L,int i,ElemType *e) {     ElemType *p,*q;  if(iL->length)     return ERROR;  p=L->elem+i-1;   *e=*p;   q=L->elem+L->length-1;   for(++p;plength--;   return OK;}void ListTraverse(SqList L,void(*vi)(ElemType*)){       ElemType *p;  int i;  p=L.elem;  for(i=1;i<=L.length;i++)    vi(p++);  printf(\"n\");}

技巧小贴士学习法