顺序表:是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。线性表采用顺序存储的方式存储就称之为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。
存储结构:数据元素在计算机有两种不同的表示方法:顺序映像和非顺序映像;所以得到两种不同的存储结构:顺序存储结构和链式存储结构。而在这里我们的顺序表的存储结构是顺序存储结构。然后我们这样分析,从物理实际分析和逻辑分析它的存储情况,由它的特性是以数组的形式保存的,所以得出在物理上它是连续的,在逻辑上它也是连续的。
定长顺序表;长度一定,需要一个变量来记录有效长度,顺序表即为数组。具体的功能有:初始化,按位插入,按位删除,按值删除,查找,清空,删除,判空,打印。
若要修改main函数中,那么在函数中形参要以指针接受。
结构体定义如下:
#define ELEM_SIZE 5
typedef int ELEM_TYPE;
typedef struct SeqList
{
ELEM_TYPE elem[ELEM_SIZE];
int cursize;
}SeqList, *PSeqList;
初始化:
void InitList(PSeqList pl)
{
assert(pl != NULL);//判断p1不为空,即内存申请成功
pl->cursize = 0;//将有效长度置为空
}
按位插入:
- 判断指针是否为空(结构是否存在),
- 判断插入位置是否合法,表是否为满,
- 插入,(插入结束后有效长度加一)
int InsertList(PSeqList pl, int pos,ELEM_TYPE val)
{
assert(pl != NULL);
if (pl == NULL)
{
return 0;
}
if (pos < 0 || pos > pl->cursize || IsFull(pl))
{
return -1;
}
for (int j = pl->cursize - 1; j >= pos; --j)
{
pl->elem[j + 1] = pl->elem[j];
}
pl->elem[pos] = val;
pl->cursize++;
return 1;
}
按位删除:
- 判断指针是否为空(结构是否存在)
- 判断删除的位置是否合法
- 删除(删除结束后有效长度减一)
int DeleteListPos(PSeqList pl, int pos) { assert(pl != NULL); if (pl == NULL) { return 0; } if (pos < 0 || pos >= pl->cursize) { return -1; } for (int i = pos + 1; i < pl->cursize; ++i) { pl->elem[i - 1] = pl->elem[i]; } pl->cursize--; return 1; }
按值删除:
- 判断指针是否为空(结构是否存在)
- 查找是否存在key
- 若存在则删除(删除结束后有效长度减一)
int DeleteListKey(PSeqList pl, ELEM_TYPE key)
{
if (pl == NULL)
{
return 0;
}
//for (int i = 0; pl->elem[i] != key; ++i)
//{
// if (i == pl->cursize - 1)
// {
// return -1;
// }
//}
int index = SearchList(pl, key);
if (index < 0)
{
return -1;
}
for (int j = 0; j < pl->cursize; ++j)
{
if (pl->elem[j] == key)
{
for (int k = j; k < pl->cursize - 1; ++k)
{
pl->elem[k] = pl->elem[k + 1];
}
pl->cursize--;
j--;
}
}
return 1;
}
按值查找:
- 判断指针是否为空(结构是否存在)
- 判断是否存在key
int SearchList(PSeqList pl, ELEM_TYPE key)
{
int rt = -1;
if (pl != NULL)
{
for (int i = 0; i < pl->cursize; ++i)
{
if (pl->elem[i] == key)
{
rt = i;
break;
}
}
}
return rt;
}
清空:清空元素
void Clear(PSeqList pl)
{
pl->cursize = 0;
}
删除:结构不能使用,内存删除
void Destory(PSeqList pl)
{
Clear(pl);
}
判空:
bool IsFull(PSeqList pl)
{
return pl->cursize == ELEM_SIZE;
}
打印:
void Show(PSeqList pl)
{
for (int i = 0; i < pl->cursize; ++i)
{
printf("%d ", pl->elem[i]);
}
printf("\n");
}