数据结构 线性表之顺序存储

来源:互联网 发布:保持数据库数据一致性 编辑:程序博客网 时间:2024/06/05 22:31

1.线性表的定义:零个或多个相同类型的数据元素的有限序列。若元素为多个,则第一个元素无前驱,最后一个元素无后继,其他的每个元素都有且只有一个前驱和后继。线性表中的每个数据元素可以由若干个数据项组成,这时,数据元素称为记录record,线性表称为文件file。

2.线性表的抽象数据类型:

    线性表是一种数据结构,其元素之间存在一一对应的逻辑关系{D,S}。D表示数据元素,S表示数据元素之间的关系。

   线性表的抽象数据类型{D,S,P},其中{D,S}表示数据结构,P表示数据结构上的一组操作。

ADT ListData   /*一组带结构的数据元素*/Operation  INITIATE(L)  LENGTH(L)  GET(L,i)  LOCATE(L,x)  INSERT(L,i,b)

3.线性表的物理结构

3.1顺序存储结构:用一段地址连续的存储单元一次存储线性表的数据元素。C语言中用数组为例。

(1)描述线性表需要三个属性:存储空间的起始位置,线性表的最大存储容量(数组长度,即总的存储空间的长度),线性表的当前长度(线性表中数据元素的个数)。

(2)随机存取结构:LOC(ai)=LOC(a1)+(i-1)c;存取操作的时间复杂度为O(1)。

(3)插入:检验当前的list的长度是否超过定义的数组最大长度,检验插入的位置是否合理(插入第i个之前,因此i可以取length+1),移位(若插入的不在表尾),插入,表长加1。

(4)删除:检验list是否为空表,检验删除的位置是否合理,赋值,(若删除的不在表尾)移位,表长-1。

(5)时间复杂度:存取操作O(1),插入删除O(n)。插入平均移动次数为n/2,删除平均移动次数为(n-1)/2。

(6)顺序存储优点:无需表示元素之间的逻辑关系而额外增加存储空间。可以快速存取

     顺序存储缺点:删除插入操作需要大量移动元素。当线性表长度变化较大时,难以确定存储空间的容量。造成存储空间的碎片。

     适用:元素个数不太变化,更多是存取数据的应用。

#include <iostream>using namespace std;#define MAXSIZE 20#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0typedef int ElemType;typedef int Status;typedef struct{ElemType data[MAXSIZE];int length;}SqList;Status GetElem(SqList L, int i,ElemType *e){if(L.length == 0|| i<1 || i>L.length)return ERROR;*e = L.data[i-1];return OK;}Status PrintList(SqList *L){for(int i=1; i!=L->length;i++)cout<<L->data[i-1]<<" ";cout<<L->data[L->length-1]<<endl;return OK;}Status ListInsert(SqList *L, int i, ElemType e)  //在第i个位置之前插入新的数据元素e,L的长度加1{if( L->length == MAXSIZE) return ERROR;if( i<1 || i>L->length+1 ) return ERROR;if( i<=L->length ){for(int k=L->length;k>=i;k--)L->data[k]=L->data[k-1];}L->data[i-1]=e;L->length++;return OK;}Status ListDelet(SqList *L, int i, ElemType *e)//删除第L个元素,并返回它的值{if(L->length==0) return ERROR;if(i<1 || i>L->length) return ERROR;*e = L->data[i-1];if(i<L->length){for(int k=i+1;k!=L->length+1;k++)L->data[k-2] = L->data[k-1];}L->length--;return OK;}int main(){SqList List1;ElemType find_num;ElemType is_num=18;ElemType dl_num;List1.length = 0;cout<<"The original list: ";for(int i=1; i!=10; ++i){List1.data[i-1]=i;List1.length ++;cout<<List1.data[i-1]<<" ";}cout<<endl;cout<<"The find number: ";if(GetElem(List1,5,&find_num))cout<<find_num<<endl;cout<<"The list after insert: ";ListInsert(&List1,6,is_num);PrintList(&List1);cout<<"The list after deleat: ";ListDelet(&List1,3,&dl_num);PrintList(&List1);    system("pause");return 0;}


0 0