顺序表;
是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。线性表采用顺序存储的方式存储就称之为顺序表。顺序表是将
表中的结点依次存放在计算机内存中一组地址连续的存储单元中。
顺序表的相关声明及其定义
#define MAXSIZE 10
typedef int DataType;
typedef unsigned int size_t;
typedef struct SeqList
{
DataType _array[MAXSIZE];
size_t _size;// 有效数据元素的个数
}SeqList, *PSeqList;
当加入数据的个数超过MAXSIZE,顺序表会自动增加。
顺序表的其余基本操作
///函数功能///
void InitSeqList(PSeqList pSeq);//初始化
void PushBack(PSeqList pSeq, DataType data);//尾插
void PopBack(PSeqList pSeq);//尾删
void PushFront(PSeqList pSeq, DataType data);//头插
void PopFront(PSeqList pSeq);//头删
void Insert(PSeqList pSeq, size_t pos, DataType data);//插入指定位置
void Erase(PSeqList pSeq, size_t pos);//删除指定位置
int Find(PSeqList pSeq, DataType data);//查找
void Remove(PSeqList pSeq, DataType data);//删除一个data
void RemoveAll(PSeqList pSeq, DataType data);//删除所以data
void PrintSeq(PSeqList pSeq);//打印顺序表
判满、判空函数
int checkFull(PSeqList pSeq);
int checkEmpty(PSeqList pSeq);
功能实现:
主要功能函数///
//初始化
void InitSeqList(PSeqList pSeq)
{
assert(NULL != pSeq);
memset(pSeq->_array, 0, MAXSIZE*sizeof(DataType));
pSeq->_size = 0;
}
//尾插
void PushBack(PSeqList pSeq, DataType data)
{
assert(NULL != pSeq);
if (0 == checkFull(pSeq))
return ;
pSeq->_array[pSeq->_size++] = data;
}
//尾删
void PopBack(PSeqList pSeq)
{
assert(NULL != pSeq);
if (0 == checkEmpty(pSeq))
return ;
--pSeq->_size;
}
//头插
void PushFront(PSeqList pSeq, DataType data)
{
size_t i = 0;
assert(NULL != pSeq);
if (0 == checkFull(pSeq))
return ;
i = pSeq->_size;
while (i > 0)
pSeq->_array[i--] = pSeq->_array[i-1];
pSeq->_array[0] = data;
++pSeq->_size;
}
//头删
void PopFront(PSeqList pSeq)
{
size_t i = 0; //定义为size_t,避免和pos比较时类型不匹配。发生隐式变换。
assert(pSeq);
if (0 == checkEmpty(pSeq))
return ;
while (i < (pSeq->_size-1))
pSeq->_array[i++] = pSeq->_array[i+1];
--pSeq->_size;
}
//插入指定位置数据
void Insert(PSeqList pSeq, size_t pos, DataType data)
{
size_t i = 0;
assert(NULL != pSeq);
if (0 == checkFull)
return ;
if (pos == 0)
PushFront(pSeq, data);
else if (pos >= pSeq->_size)
PushBack(pSeq, data);
else
{
i = pSeq->_size;
while (i < pos)
pSeq->_array[i--] = pSeq->_array[i-1];
pSeq->_array[pos] = data;
++pSeq->_size;
}
}
//删除指定位置数据
void Erase(PSeqList pSeq, size_t pos)
{
size_t i = 0;
assert(NULL != pSeq);
if (0 == checkEmpty(pSeq))
return ;
if (pos == 0)
PopFront(pSeq);
else if (pos == pSeq->_size-1)
PopBack(pSeq);
else if (pos >= pSeq->_size)
printf("error\n");
else
{
i = pos;
while (i < pSeq->_size-1)
pSeq->_array[i++] = pSeq->_array[i+1];
--pSeq->_size;
}
}
//查找data
int Find(PSeqList pSeq, DataType data)
{
size_t i = 0;
assert(NULL != pSeq);
if (0 == checkEmpty(pSeq))
return -1;
for (; i < pSeq->_size; i++)
if (pSeq->_array[i] == data)
return i;
return -1;
}
//删除一个data
void Remove(PSeqList pSeq, DataType data)
{
int pos = -1;
assert(NULL != pSeq);
if (0 == checkEmpty(pSeq))
return ;
if ((pos = Find(pSeq, data)) >= 0)
Erase(pSeq, pos);
}
//删除所有data
void RemoveAll(PSeqList pSeq, DataType data)
{
size_t size = 0;
size_t i = 0;
size_t count = 0;
assert(NULL != pSeq);
if (0 == checkEmpty(pSeq))
return ;
size = pSeq->_size;
for (; i < size-count; i++)
if (pSeq->_array[i] == data)
{
Erase(pSeq, i);
--i;
++count;
}
}
//打印顺序表
void PrintSeq(PSeqList pSeq)
{
size_t i = 0;
assert(NULL != pSeq);
for (; i < pSeq->_size; i++)
printf("%d->", pSeq->_array[i]);
printf("null\n");
}
/判满、判空函数功能//
int checkFull(PSeqList pSeq)
{
if (MAXSIZE <= pSeq->_size)
{
printf("Space is full!\n");
return 0;
}
return 1;
}
int checkEmpty(PSeqList pSeq)
{
if (0 == pSeq->_size)
{
printf("Space is empty!\n");
return 0;
}
return 1;
}