線性表順序存儲結構

1、基本操做

①定義函數

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

 

2、栗子

 

#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;
}

 

 

3、總結

①特色:邏輯關係上相鄰的兩個元素在物理存儲位置上也相鄰。List

②優勢:1)能夠隨機存取表中任一元素O(1),總結

    2)存儲空間使用緊湊。

③缺點:1)在插入刪除某一元素時須要移動大量元素O(n),

    2)預先分配空間須要按最大空間分配,利用不充分

相關文章
相關標籤/搜索