线性表顺序存储结构
一、基本操作
①定义
typedef struct{
ElemType *elem;//存储空间地址
int length;//当前长度
int listsize;//当前分配的存储容量
}SqList;
②初始化
void InitSqList(SqList *l){
l->elem=(ElemType *)malloc(sizeof(ElemType)*List_Init_Size);
//不要忘记判断它是否分配成功
if(!(l->elem)){
exit(OVERFLOW);//OVERFLOW宏定义为-2
}
l->length=0;
l->listsize=List_Init_Size;
}
③插入操作
Status insertSqList(SqList *l,int i,ElemType e){
int j;
ElemType *newbase;
//注意是length+1,因为在最后一个元素的后边的后边加一个元素就不叫插入了
if(i<1||i>(l->length)+1){
return ERROR;
}
if(l->length>=l->listsize){//如果长度超了的话要重新分配内存
newbase=(ElemType *)realloc(l->elem,(l->listsize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase){
return OVERFLOW;
}
l->elem=newbase;
l->listsize+=LISTINCREMENT;
}
//i以后的数后移
for(j=l->length;j>=i;j--){
*(l->elem+j)=*(l->elem+j-1);
}
*(l->elem+i)=e;
l->length++;
return e;
}
④删除操作
Status ListDelete_sq(SqList *l,int i){
int t;
int j;
if(i<1||i>l->length){
return ERROR;
}
t=*(l->elem+i);
for(j=i+1;j<=l->length;j++){
*(l->elem+j-1)=*(l->elem+j);
}
l->length--;
return t;
}
二、栗子
#include <stdio.h> #include <stdlib.h> #define OVERFLOW -2///判断内存分配是否成功时用,如果不成功返回OVERFLOW #define ERROR 0 #define List_Init_Size 100 #define LISTINCREMENT 10 typedef int ElemType; typedef int Status;//函数返回值的类型 typedef struct{ ElemType *elem;//存储空间地址 int length;//当前长度 int listsize;//当前分配的存储容量 }SqList; Status ListDelete_sq(SqList *l,int i); Status insertSqList(SqList *l,int i,ElemType e); void InitSqList(SqList *l); int main() { int t; int i; SqList l; InitSqList(&l); printf("%d\n",l.length); //插入1、2、3、4、5、6、7、8、9、10 for(i=1;i<=10;i++){ insertSqList(&l,i,i); } printf("%d\n",l.length); for(i=1;i<=l.length;i++){ printf("%d ",*(l.elem+i)); } putchar('\n'); t=ListDelete_sq(&l,5); printf("删除:%d\n",t); for(i=1;i<=l.length;i++){ printf("%d ",*(l.elem+i)); } return 0; } void InitSqList(SqList *l){ l->elem=(ElemType *)malloc(sizeof(ElemType)*List_Init_Size); ///不要忘记判断它是否分配成功 if(!(l->elem)){ exit(OVERFLOW);//OVERFLOW宏定义为-2 } l->length=0; l->listsize=List_Init_Size; } Status insertSqList(SqList *l,int i,ElemType e){ int j; ElemType *newbase; ///注意是length+1,因为在最后一个元素的后边的后边加一个元素就不叫插入了 if(i<1||i>(l->length)+1){ return ERROR; } if(l->length>=l->listsize){///如果长度超了的话要重新分配内存 newbase=(ElemType *)realloc(l->elem,(l->listsize+LISTINCREMENT)*sizeof(ElemType)); if(!newbase){ return OVERFLOW; } l->elem=newbase; l->listsize+=LISTINCREMENT; } //i以后的数后移 for(j=l->length;j>=i;j--){ *(l->elem+j)=*(l->elem+j-1); } *(l->elem+i)=e; l->length++; return e; } Status ListDelete_sq(SqList *l,int i){ int t; int j; if(i<1||i>l->length){ return ERROR; } t=*(l->elem+i); for(j=i+1;j<=l->length;j++){ *(l->elem+j-1)=*(l->elem+j); } l->length--; return t; }
三、总结
①特点:逻辑关系上相邻的两个元素在物理存储位置上也相邻。
②优点:1)可以随机存取表中任一元素O(1),
2)存储空间使用紧凑。
③缺点:1)在插入删除某一元素时需要移动大量元素O(n),
2)预先分配空间需要按最大空间分配,利用不充分