线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素,使得线性表在逻辑结构上相邻的元素存储在连续的物理存储单元中,即:通过数据元素物理存储的连续性来反应元素之间逻辑上的相邻关系。采用顺序存储结构存储的线性表通常简称为顺序表。
顺序存储的线性表的特点:
1.线性表的逻辑顺序与物理顺序一致;
2. 数据元素之间的关系是以元素在计算机内“物理位置相邻”来体现
自定义头文件
#define ARRARY_SIZE 5
typedef int ELEM_TYPE;
typedef struct SeqList
{
ELEM_TYPE elem[ARRARY_SIZE];
int cursize;
}SeqList,*PSeqList;
void InitList(PSeqList pl);
int InsertPos(PSeqList pl, int pos,
ELEM_TYPE val);
int DeletePos(PSeqList pl, int pos);
int DeleteKey(PSeqList pl, ELEM_TYPE key);
int Search(PSeqList pl, ELEM_TYPE key);
bool IsFull(PSeqList pl);
void Show(PSeqList pl);
void Clear(PSeqList pl);
void Destroy(PSeqList pl);
函数实现:
1.初始化
2.按位置插入
3.按位置删除
4.按关键字删除
5.查找
#include<stdio.h>
#include<assert.h>
#include "SeqList.h"
void InitList(PSeqList pl)
{
assert(pl != NULL);
if (pl == NULL)
{
return;
}
pl->cursize = 0;
}
int InsertPos(PSeqList pl, int pos,
ELEM_TYPE val)
{
if (pl == NULL)
{
return 0;
}
if (pos < 0 || pos > pl->cursize || IsFull(pl))
{
return -1;
}
for (int i = pl->cursize - 1; i >= pos; --i)
{
pl->elem[i + 1] = pl->elem[i];
}
pl->elem[pos] = val;
pl->cursize++;
return 1;
}
int DeletePos(PSeqList pl, int pos)
{
if (pl == NULL)
{
return 0;
}
if (pos < 0 || pos > pl->cursize - 1)
{
return -1;
}
for (int i = pos; i < pl->cursize - 1; ++i)
{
pl->elem[i] = pl->elem[i + 1];
}
pl->cursize--;
return 1;
}
int DeleteKey(PSeqList pl, ELEM_TYPE key)
{
if (pl == NULL)
{
return 0;
}
//int i = 0;
//for (i; pl->elem[i] != key; ++i)
//{
// if (i == pl->cursize - 1)
// {
// return -1;
// }
//}
int index = Search(pl, key);
if (index < 0)
{
return -1;
}
for (int j = index; 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--;*/
DeletePos(pl, j);
j--;
}
}
return 1;
}
int Search(PSeqList pl, ELEM_TYPE key)
{
int rt = -1;
if (pl != NULL)
{
for (int i = 0; i < pl->cursize; ++i)
{
if (key == pl->elem[i])
{
rt = i;
break;
}
}
}
return rt;
}
bool IsFull(PSeqList pl)
{
return pl->cursize == ARRARY_SIZE;
}
void Show(PSeqList pl)
{
for (int i = 0; i < pl->cursize; ++i)
{
printf("%d ", pl->elem[i]);
}
printf("\n");
}
void Clear(PSeqList pl)
{
pl->cursize = 0;
}
void Destroy(PSeqList pl)
{
Clear(pl);
}