线性表顺序存储结构

一、基本操作

①定义

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)预先分配空间需要按最大空间分配,利用不充分

    

    

 

posted @ 2017-09-30 15:20  路人姜。  阅读(559)  评论(0编辑  收藏  举报