• 线性表顺序存储结构


    一、基本操作

    ①定义

    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
    ",l.length);
        //插入1、2、3、4、5、6、7、8、9、10
        for(i=1;i<=10;i++){
            insertSqList(&l,i,i);
        }
        printf("%d
    ",l.length);
        for(i=1;i<=l.length;i++){
            printf("%d ",*(l.elem+i));
        }
        putchar('
    ');
        t=ListDelete_sq(&l,5);
        printf("删除:%d
    ",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)预先分配空间需要按最大空间分配,利用不充分

        

        

  • 相关阅读:
    Element-ui 的 slot 关系理解
    关于Delegate委托和Event事件的学习
    JavaScript 中 prototype 与 __proto__
    正向代理与反向代理的个人理解
    MVC和三层架构
    关于SqlDataAdapter的思考
    关于C#连接Oracle数据库
    关于VS配置环境
    富文本的实现
    博客
  • 原文地址:https://www.cnblogs.com/LuRenJiang/p/7606118.html
Copyright © 2020-2023  润新知