zoukankan      html  css  js  c++  java
  • 线性表顺序存储结构

    一、基本操作

    ①定义

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

        

        

  • 相关阅读:
    13.2 抽像类与体类(Abstract & Concrete Classes) 简单
    13.3 深度隔离的界面(Deeply Parted interface) 简单
    计算天数(C++)_学习 简单
    13.1.2 纯虚函数(Pure Virutal Functions) 简单
    C++ operator关键字(重载操作符) 简单
    二月一共多少天 简单
    重载运算符操作_学习 简单
    计算两个日期之间的天数(C++) 简单
    1.2 连接信号和响应函数 简单
    用Android手机做台式机无线网卡
  • 原文地址:https://www.cnblogs.com/LuRenJiang/p/7606118.html
Copyright © 2011-2022 走看看