①定義函數
typedef struct{
ElemType *elem;//存儲空間地址
int length;//當前長度
int listsize;//當前分配的存儲容量
}SqList;spa
②初始化code
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;
}blog
③插入操做內存
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;
}it
④刪除操做io
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;
}class
#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); //插入一、二、三、四、五、六、七、八、九、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; }
①特色:邏輯關係上相鄰的兩個元素在物理存儲位置上也相鄰。List
②優勢:1)能夠隨機存取表中任一元素O(1),總結
2)存儲空間使用緊湊。
③缺點:1)在插入刪除某一元素時須要移動大量元素O(n),
2)預先分配空間須要按最大空間分配,利用不充分