#pragma once
#include<malloc.h>
#include<stdio.h>
typedef int DataType;
typedef struct SeqListD
{
Datatype* _array;
int _size;//有效元素的个数
int _capacity;//空间的总大小
}SeqListD, *PSeqListD;
_array为存放元素的指针,因为要动态的存储,所以不定义其所指空间的大小。
//初始化顺序表
void SeqListDInit(PSeqListD ps,int capacity)
{
if(NULL == ps)
return;
ps->_array = (Datatype*)malloc(capacity);
if(NULL == ps->_array)
{
printf("空间申请失败");
return;
}
}
先判断顺序表是否存在,之后给顺序表中的指针_array开辟空间大小为指定的capacity,还需判断空间是否申请成功
//尾插
void SeqListDPushBack(PSeqListD ps, DataType data)
{
if(NULL == ps)
return;
if(!CheckCapacity(ps))
{
printf("增容失败\n");
return;
}
ps->_array[ps->_size++] = data;
}
判断顺序表是否存在,调用增容函数(在该文章最后介绍),插入data并使size++,因为是动态的顺序表,所以不需要判断元素溢出的问题
//尾删
void SeqListDPopBack(PSeqListD ps)
{
if(NULL == ps)
return;
if(SeqListDEmpty(ps))
{
printf("元素个数为空\n");
return;
}
ps->_size--;
}
判断条件:顺序表是否存在,元素个数是否为空。然后直接将size--就行了
//任意位置的插入
void SeqListDInsert(PSeqListD ps, int pos, DataType data)
{
int i = 0;
if(NULL == ps || (pos < 0 && pos > ps->_size))
{
return;
}
if(!CheckCapacity(ps))
{
printf("增容失败\n");
return;
}
for(i = ps->_size-1;i >= pos;--i)
{
ps->_array[i+1] = ps->_array[i];
}
ps->_array[pos] = data;
ps->_size++;
}
判断条件:顺序表存在,pos大于0且小于size。先判断是否需要增容,将从后往前size-pos个元素全部向后移动一位,留出下标为pos的位置插入新的元素data,size++
//任意位置的删除
void SeqListDErase(PSeqListD ps, int pos, DataType data)
{
int i;
if(NULL == ps || (pos > ps->_size && pos < 0))
return;
if(SeqListDEmpty(ps))
{
printf("元素个数为空\n");
return;
}
for(i=pos-1; i < ps->_size; i++)
{
ps->_array[i] = ps->_array[i+1];
}
ps->_size--;
}
判断条件:顺序表存在,pos大于0且小于size,元素个数是否为空。将从后往前size-pos个元素全部向前移动一位(下标为pos的元素被覆盖),size--
//求元素个数
int SeqListDSize(PSeqListD ps)
{
return ps->_size;
}
返回值为size
//求元素个数上限
int SeqListDCapacity(PSeqListD ps)
{
return ps->_capacity;
}
返回值为capacity
//判断元素个数是否为空
int SeqListDEmpty(PSeqListD ps)
{
return 0 == ps->_size;
}
判断size是否为0,为空返回1,不为空返回0
//清空顺序表,但不改变空间的大小
void SeqListDClear(PSeqListD ps)
{
ps->_size = 0;
}
直接将size改成0
//销毁动态顺序表
void SeqListDDestroy(PSeqListD ps)
{
if(ps && ps->_array)//判断顺序表是否为空,判断顺序表中存放元素的数组是否为空
{
free(ps->_array);
ps->_capacity = 0;
ps->_size = 0;
}
}
释放array中的空间,将capacity和size置0
//判断是否给动态顺序表增容
int CheckCapacity(PSeqListD ps)
{
if(NILL == ps)
return 0;
if(ps->_size == ps->_capacity)
{
int newCapacity = 2*ps->_capacity;
ps->_array = (Datatype*) realloc(ps->_array, newCapacity);
if(NULL == ps->_array)
return 0;
ps->_capacity = newCapacity;
}
else return 0;
return 1;
}
先判断顺序表存在。再判断size的是否大于最大长度capacity,大于需要增容。每次增容的最大容量是之前最大容量的二倍(用空间换取时间),用realloc函数,给指针array所指向重新开辟空间,realloc能够同时实现开辟空间和将原空间的元素放入新空间的操作。实现完增容将capacity修改为增容后的容量.