数据结构中,线性表的顺序存储结构就是,把线性表中的所有元素按照其逻辑顺序依次存储在计算机存储器中指定存储位置开始的一块连续的存储空间中。
因此,线性表的顺序存储结构是利用数组来实现的,数组的基本类型就是线性表中元素的类型。
顺序表的实现可以是静态的也可以是动态的,不过静态比较浪费内存,所以采用动态内存分配来实现顺序表。
maloc函数:
void *malloc(int size);
说明:malloc 向系统申请分配指定size个字节的内存空间。返回类型是 void* 类型。
realloc函数
使用例子如下:
char* p = malloc(1024);
char* q = realloc(p,2048);
1.如果 当前连续内存块足够 realloc 的话,只是将p所指向的空间扩大,并返回p的指针地址。 这个时候 q 和 p 指向的地址是一样的。
2.如果 当前连续内存块不够长度,再找一个足够长的地方,分配一块新的内存,q,并将 p指向的内容 copy到 q,返回 q。并将p所指向的内存空间删除。
这样也就是说 realloc 有时候会产生一个新的内存地址 有的时候不会。所以在分配完成后。我们需要判断下 p 是否等于 q。并做相应的处理。
//在头文件中定义顺序表的结构体
typedef struct Seqlist{
SeqType* data;//顺序表指针
size_t size;//顺序表大小
size_t capacity;//容量
}Seqlist;
//在对顺序表初始化的时候进行动态内存开辟
void Seqlist_init(Seqlist *seq){
if (seq == NULL){
printf("seq指针为空指针");
return;
}
seq->capacity = LIST_SIZE_INIT;//LIST_SIZE_INIT是宏定义的一个值
seq->data = (SeqType *)malloc(seq->capacity * sizeof(SeqType));
if (seq->data != NULL){
seq->size = 0;
}
}
//如果顺序表已满,则需要扩充
void Seqlist_if_full(Seqlist* seq){
if (seq == NULL){
printf("seq指针为空指针");
return;
}
if (seq->size == LIST_SIZE_INIT){
SeqType* new_data = (SeqType*)realloc(seq->data, sizeof(SeqType)*seq->capacity * 2);//用realloc函数直接对开辟的空间进行扩容
if (new_data != NULL){
free(seq->data);
seq->data = new_data;
seq->capacity *= 2;
}
}
}
动态顺序表,最后需要对顺序表开辟的内存空间进行销毁
void Destoryseqlist(pseqlist ps) //回收开辟的动态内存
{
assert(ps);
if(ps->data != NULL)
{
free(ps->data);
ps->data = NULL;//将开辟的指针的赋为空指针,防止成为野指针被使用
}
}