线性表的顺序表示

数据结构中的线性表用不同的语言书写

线性表的顺序表示指的是用一组地址连续的存储单元依此存储线性表的数据 元素。说白了就是一个可以自动增长长度的数组;首先数组是不可能动态增长的,必须手动更改内存大小,不同的语言有不同的实现方式,C语言使用malloc()函数 来动态扩展内存,其它的高级语言比如java则通过new对象来扩充,php语言是底层直接支持动态数组的,底层也是同样的原理封装。
C语言:

#include <stdio.h>
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10

struct SqList{
        int *elem;   //int 型元素的存储空间基地址
        int length;  //当前长度
        int listsize;  //当前分配的存储容量,可以存储几个int类型的数据类型,以sizeof(int)为单位
};
void InitList(struct SqList *l);
int addList(struct SqList *l,int i);
void show(struct SqList *l);
void main()
{
    struct SqList qs;
    InitList(&qs);
    int i=0;
    for(i;i<200;i++){
        addList(&qs,i);
    }
    show(&qs);
}
void InitList(struct SqList *l)
{
    l->elem=(int *)malloc(LIST_INIT_SIZE*sizeof(int)); //把动态分配的存储空间的首地址赋给elem
    if(!l->elem){ //若分配失败!退出
        exit(0);
    }
    l->length=0;
    l->listsize=LIST_INIT_SIZE;
}

int addList(struct SqList *l,int i)
{
    if(l->length>l->listsize){
        return -1;
    }
    l->elem[l->length]=i;
    l->length++;
}
void show(struct SqList *l)
{
    int i=0;
    for(i;i<l->length;i++){
        printf("%d ",l->elem[i]);
        if(i%10==0 && i!=0){
            printf("\n");
        }
    }
}

首先使用malloc()函数来扩展一定的初始内存,之后若元素超过数组长度,则使用calloc()函数分配一个连续的内存空间。
Java实现:

import java.util.ArrayList;


public class List {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ArrListManage arr=new ArrListManage();
        for(int i=0;i<11;i++){
            arr.add(i);
        }
        arr.show();
    }

}

class ArrListManage{
    private Object[] element=new Object[10];
    int size=0;

    public ArrListManage() {
        super();
        // TODO Auto-generated constructor stub
    }
    public void add(Object o){
        this.element[this.size++]=o;
    }
    public void show(){
        for(int i=0;i<this.size;i++){
            System.out.println(this.element[i]);
        }
    }

}

java语言初始化的时候就给了一个一定长度的数组,若元素超过这个长度,则再new一个按一个增长因子增长比例的内存空间出来,把原来的元素再复制过去,这是我看视频里面讲的。改天研究下源码。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值