顺序 存储
顺序存储定义:把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构。
顺序表由于其存储结构的特点,特别适合查找,更新,替换(其时间复杂度为O(1)),不适合频繁插入和删除(每一次插入和删除的时间复杂度都是O(n))
顺序表的优点:
存储密度大(结点本身所占存储量/结点结构所占存储量)
可以随机存取表中任一元素
顺序表的缺点:
在插入、删除某一元素时,需要移动大量元素
浪费存储空间
属于静态存储形式,数据元素的个数不能自由扩充
为克服着一缺点—->链表

1 ADT Sqlist{ 2 数据对象:D={是Elemset,Elemset的下标大于0} 3 数据关系:R1={一对一关系} 4 基本操作 5 6 //0.构造顺序表类型 7 struct sqlist 8 9 //1.初始化顺序表 10 Initialization(sqlist *L); 11 12 //2.删除顺序表 13 DestroyList(sqlist *L); 14 15 //3.清空顺序表 16 ClearList(sqlist *L); 17 18 //4.返回顺序表长度 19 ListLength(sqlist L); 20 21 //5.判断顺序表是否为空! 22 ListEmpty(sqlist L); 23 24 25 //6.插入数据 26 ListInsert(sqlist *L, int i, Book e); 27 28 //7.取值 29 GetElem(sqlist L,int i,Book *e); 30 31 //8.更新数据 32 UpdateList(sqlist *L,int i,Book e); 33 34 //9.查找 35 LocateElem(sqlist L, Book e); 36 37 //10.删除数据 38 ListDelete(sqlist *L, int i, Book e); 39 40 //11.遍历 41 TravelList(sqlist L); 42 }
实际应用 :图书存储
1.顺序表因为是连续空间存储,所以要提前设置表的最大长度

1 #define MAXSIZE 50 //最大长度 2 typedef struct{ //图书结构,元素里面放(图书SBIN号,名称) 3 int id; 4 char name[50]; 5 }Book;
2.顺序表类型

1 typedef struct{ 2 Book *elem; //存放基数地址 3 int length; //长度 4 }sqlist;
基本操作
1.初始化顺序表

1 void Initialization(sqlist *L){ //初始化顺序表 2 L->elem = (Book *)malloc(MAXSIZE*sizeof(Book)); //申请空间 3 if(!L->elem) 4 exit(-1); 5 L->length=0; 6 printf("初始化成功!\n"); 7 }
2.销毁顺序表 时间复杂度:O(1)

1 void DestroyList(sqlist *L){ //删除顺序表 2 free(L->elem); 3 L->length=0; 4 printf("顺序表删除成功!"); 5 }
3.清空顺序表 时间复杂度:O(1)

1 void ClearList(sqlist *L){ //清空顺序表 2 L->length=0; 3 }
4.返回顺序表长度 时间复杂度:O(1)

1 int ListLength(sqlist L){ //返回顺序表长度 2 return L.length; 3 }
5.判断顺序表是否为空 时间复杂度:O(1)

1 int ListEmpty(sqlist L){ //判断顺序表是否为空! 2 if(L.length==0) 3 return 1; 4 else 5 return 0; 6 }
6.插入数据 时间复杂度:O(n) 平均复杂度:n/2

1 void ListInsert(sqlist *L, int i, Book e){ //插入数据 2 if(i<1 || i>L->length+1){ 3 printf("插入位置不合理.\n"); 4 exit(-1); 5 } 6 if(L->length==MAXSIZE){ 7 printf("表已满!"); 8 exit(-1); 9 } 10 int j; 11 for(j=L->length-1;j>=i-1;j--) 12 L->elem[j+1]=L->elem[j]; 13 L->elem[i-1]=e; 14 L->length++; 15 16 }
7.取值 时间复杂度:O(1)

1 int GetElem(sqlist L,int i,Book *e){//1<= i <=L.length 2 if (i<1 || i>L.length){ 3 printf("取值位置不正确。\n"); 4 return 0; 5 } 6 *e=L.elem[i-1]; 7 return 0; 8 }
8.更新 时间复杂度:O(1)

1 int UpdateList(sqlist *L,int i,Book e){ 2 if (i<1 || i>L->length){ 3 printf("更新位置不正确。\n"); 4 return 0; 5 } 6 L->elem[i-1]=e; 7 return 0; 8 }
9.查找 时间复杂度:O(n) 平均复杂度:n/2

1 int LocateElem(sqlist L, Book e){ //查找 2 int i,a=0; 3 for(i=0; i<L.length; i++){ 4 if(L.elem[i].id==e.id && strcmp(L.elem[i].name,e.name)==0){ 5 printf("找到值为{%d:%s}的元素,其位置为%d\n",e.id,e.name, i+1); 6 return 0; 7 } 8 } 9 printf("没有找到元素!"); 10 return 0; 11 }
10.遍历 时间复杂度:O(n)

1 void TravelList(sqlist L){ // 遍历 2 int i; 3 for (i=0; i<L.length; i++){ 4 printf("第%d个元素为:%d,%s\n", i+1,L.elem[i].id,L.elem[i].name); 5 } 6 }
11.删除 时间复杂度:O(n) 平均复杂度:n-1/2

1 void ListDelete(sqlist *L, int i, Book e){ //删除数据 2 if(i<1 || i>L->length+1){ 3 printf("删除位置不合理.\n"); 4 exit(-1); 5 } 6 if(L->length==MAXSIZE){ 7 printf("表已满!"); 8 exit(-1); 9 } 10 int j; 11 for(j=i;j<L->length;j++) 12 L->elem[j-1]=L->elem[j]; 13 //L->elem[i-1]=e; 14 L->length--; 15 16 }
12.使用

1 int main(){ 2 sqlist a; 3 Book b={2,"xiaochunzhang"}; 4 Book c={3,"yuming"}; 5 Book d={4,"xiaoming"}; 6 Initialization(&a); 7 int i; 8 for(i=1;i<=5;i++){ 9 ListInsert(&a,i,b); 10 } 11 //DestroyList(&a); 12 ListInsert(&a,2,c); 13 //ListDelete(&a,2,c); 14 TravelList(a); 15 LocateElem(a,d); 16 return 0; 17 }