顺序表
用一组连续地址的内存单元存储整张线性表,称为顺序存储结构,这种存储结构下的线性表叫做顺序表
- 有唯一的表名来标识该顺序表
- 内存单元连续存储,一张顺序表要占据一块连续的内存空间
- 数据顺序存放,元素之间有先后关系
定义顺序表结构
typedef struct _seq
{
Data *pData; // 顺序表的存储空间
int maxSize; // 最大存储空间
int size; // 当前使用的空间
}Seq;
创建顺序表
Seq* Create()
{
Seq *s = (Seq*)malloc(sizeof(Seq)/sizeof(char));
if (NULL == s)
return NULL;
// 给顺序表分配空间
s->pData = (Data*)malloc(sizeof(Data)/sizeof(char) * INIT_SIZE);
if(NULL == s->pData)
{
free(s);
return NULL;
}
s->maxSize = INIT_SIZE;
s->size = 0;
return s;
}
顺序表重新分配空间
如果数据个数大于当前顺序表最大的存储空间,对当前顺序表存储空间进行扩展,调用realloc函数
realloc原型
extern void *realloc(void *mem_address, unsigned int newsize);
注意:申请的空间newsize是原空间大小再加上再次分配空间大小(maxSize+ADD_SIZE),而不是需要申请空间的大小(ADD_SIZE)
BOOL AgainMalloc(Seq* s)
{
if(NULL == s)
return ERROR;
int newSize = sizeof(Data)/sizeof(char)*(s->maxSize+ADD_SIZE);
Data* p = (Data*)realloc(s->pData, newSize);
if (NULL == p)
return FALSE;
s->pData = p;
s->maxSize += ADD_SIZE;
return TRUE;
}
顺序表尾插
从顺序表尾部添加数据,如果当前顺序表已经达到最大空间(maxSize),调用AgainMalloc()进行空间扩展
BOOL Insert_Last(Seq* s, Data data)
{
if (NULL == s)
return ERROR;
//重新分配空间
if (s->size == s->maxSize)
{
if (AgainMalloc(s) != TRUE)
return FALSE;
}
s->pData[s->size++] = data;
return TRUE;
}
顺序表头插
从顺序表头添加数据,如果当前顺序表已经达到最大空间(maxSize),调用AgainMalloc()进行空间扩展。
将顺序表中所有元素一次向后移动一个单元,空出第一个元素空间,插入数据。
BOOL Insert_Head(Seq* s, Data data)
{
//入口参数检测
if (NULL == s)
return ERROR;
//顺序表空间已满
if (s->size == s->maxSize)
{
if (AgainMalloc(s) != TRUE)
return FALSE;
}
//挪出第一个空间
int i = 0;
for (i = s->size-1; i>=0; i--)
{
s->pData[i+1] = s->pData[i];
}
s->pData[0] = data;
s->size++;
return TRUE;
}
顺序表任意位置插入
通过(size-1)定位到顺序表最后一个元素
PS:当前使用了空间为size,最后一个元素数组中的下标为size-1
将指定位置index后的和size-1之前的所有元素往后移位一个元素
将数据存入index所在空间,并将记录当前顺序表使用空间的size加一
BOOL Insert_Pos(Seq *s, int index, Data data)
{
if (NULL == s)
return FALSE;
//空间不够分配空间
if (s->size == s->maxSize)
{
if (TRUE != AgainMalloc(s))
return FALSE;
}
int i;
for (i = s->size-1; i >= index; i--)
{
s->pData[i+1] = s->pData[i];
}
s->pData[index] = data; //插入数据
s->size++; //当前使用空间+1
return TRUE;
}
删除顺序表中某个空间元素
类比顺序表的任意位置插入,先从size-1出向前寻找到index的位置,将index后所有元素向前挪一个空间,注意将当前顺序表使用空间size进行减一操作。
void Delete_Pos(Seq *q, int index)
{
if (NULL == q)
return;
int i = index;
for (i = index; i <= size-1; i++)
{
q->pData[i] = q->pData[i+1];
}
//别忘了将顺序表当前使用空间size进行减一操作
q->size--;
}