数据结构小结——顺序表(指针版)

来源:互联网 发布:伴奏制作软件 编辑:程序博客网 时间:2024/06/04 20:05

上一篇介绍的是基于柔性数组存储数据的顺序表,我个人感觉它和我这篇要介绍的基于给指针开辟空间存数据的顺序表差不多,都是使用堆内存,并且能够对数据存储空间调整大小。不过个人感觉用指针的写法能方便点。

假设存储的数据类型位int型,则线性表的顺序存储类型可以用结构体表示为:

typedef int SeqData;typedef struct _seqList{    SeqData *list;    int max_len;    int len;}SeqList;

这种数据是由给指针开辟空间来存储数据,占用的是堆内存,理论上只要机器的内存足够大,堆内存就足够大,所以这种顺序表不存在表满的情况。

顺序表具体怎么操作呢,其实很简单。下面将简单介绍,代码均只有片段。需要完整代码请直接下载(免积分)

首先要创建一个顺序表,即给表开辟空间:

SeqList *Create_List(){    // 创建一个顺序表    SeqList* s = (SeqList*)malloc(sizeof(SeqList)/sizeof(char));    if (s == NULL)    {        return NULL;    }    // 初始化顺序的成员    // 为顺序表分配存储空间    s->list=(SeqData*)malloc(sizeof(SeqData)/sizeof(char)*INIT_SIZE);    if (s->list == NULL)    {        free(s);  // 创建存储空间失败,先释放顺序表结点        return NULL;    }    s->max_len = INIT_SIZE;    s->len = 0;    return s;}

虽然没有表满的情况,但是储存空间会满,这时候需要增加内存空间:

int AgainMalloc(SeqList *s){    if (s == NULL)        return FALSE;    // 新申请空间的字节数    int new_size = sizeof(SeqData)/sizeof(char)*(INIT_SIZE + INCRESS_SIZE);    SeqData* tmp = (SeqData*)realloc(s->list, new_size);    if (tmp == NULL)    {        return FALSE;    }    s->list = tmp;    s->max_len += INCRESS_SIZE;    return TRUE;}

以一段尾插法为例,看看再分配空间的用法:

int Insert_Last(SeqList *s, SeqData data){    if (s == NULL)    {        return FALSE;    }    // 检测顺序表是否存满    if (s->len == s->max_len)    {        // 扩展空间        if (AgainMalloc(s) != TRUE)        {            return FALSE;        }    }    // 插入数据    s->list[s->len] = data;    s->len++;    return TRUE;}

看起来简单吧,没错,其实就是很简单。

原创粉丝点击