线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素,使得线性表在逻辑结构上相邻的元素存储在连续的物理存储单元中,即:通过数据元素物理存储的连续性来反应元素之间逻辑上的相邻关系。采用顺序存储结构存储的线性表通常简称为顺序表。
顺序储存线性表的特点
下面我们逐个实现顺序表的基本操作
typedef struct
{
elemtype data[MAXSIZE]; //用数组储存顺序表中的元素
int length; //顺序表的长度 元素的个数
}SqList;
void InitList(SqList *L) //初始化顺序表L
{
L->length = 0;
}
只需将顺序表的长度置为0即可
int ListLength(SqList *L) //返回顺序表的元素个数
{
if (NULL == L)
return 0;
return L->length;
}
int GetElem(SqList L, int i,elemtype *e) //获得i位置的元素,用e返回
{
if (L.length == 0 || i < 1 || i > L.length)
{
printf("输入有误,查询不到该位置的元素!\n");
return 0;
}
*e = L.data[i - 1];
return 0;
}
int ListInsert(SqList *L, int i, elemtype e) //在i位置插入一个元素e
{
int k;
if (L->length == MAXSIZE)
{
printf("顺序表已满,不能再继续插入元素!\n");
return 0;
}
if (i < 1 || i > L->length + 1)
{
printf("插入位置不对,请重新输入!\n");
return 0;
}
for (k = L->length - 1; k >= i - 1; k--) //将要插入元素后的每个元素都向后移一位
L->data[k + 1] = L->data[k];
L->data[i - 1] = e; //将新元素插入
L->length++;
return 1;
}
int ListDelete(SqList *L, int i, elemtype *e) //删除i位置的元素,并用e返回其值
{
int k;
if (L->length == 0)
return 0;
if (i < 1 || i > L->length)
{
printf("输入有误,请重新输入!\n");
return 0;
}
*e = L->data[i - 1];
for (k = i; k < L->length; k++) //将删除元素后的每个元素前移一位
L->data[k - 1] = L->data[k];
L->length--;
return 0;
}
int LocateElem(SqList L, elemtype e) //查询元素e,如查到返回该元素的位置,反之,返回0
{
int k;
for (k = 0; k < L.length; k++)
{
if (L.data[k] == e)
{
printf("已查到%d,%d的位置为:", e, e);
return k + 1;
}
}
return 0;
}
int ShowList(SqList L) //打印顺序表
{
int i;
if (L.length == 0)
{
printf("顺序表为空!");
return 0;
}
for (i = 0; i < L.length; i++)
{
printf("第%d个元素为%d \n", i + 1, L.data[i]);
}
return 1;
}
到此,顺序表的基本操作就已经完成了,下面附上源码
源码:
#include
#include
#include
#define MAXSIZE 100 //顺序表的最大长度
typedef int elemtype; //元素类型
typedef struct
{
elemtype data[MAXSIZE]; //用数组储存顺序表中的元素
int length; //顺序表的长度 元素的个数
}SqList;
void InitList(SqList *L) //初始化顺序表L
{
L->length = 0;
}
int ListLength(SqList *L) //返回顺序表的元素个数
{
if (NULL == L)
return 0;
return L->length;
}
int GetElem(SqList L, int i,elemtype *e) //获得i位置的元素,用e返回
{
if (L.length == 0 || i < 1 || i > L.length)
{
printf("输入有误,查询不到该位置的元素!\n");
return 0;
}
*e = L.data[i - 1];
return 0;
}
int ListInsert(SqList *L, int i, elemtype e) //在i位置插入一个元素e
{
int k;
if (L->length == MAXSIZE)
{
printf("顺序表已满,不能再继续插入元素!\n");
return 0;
}
if (i < 1 || i > L->length + 1)
{
printf("插入位置不对,请重新输入!\n");
return 0;
}
for (k = L->length - 1; k >= i - 1; k--) //将要插入元素后的每个元素都向后移一位
L->data[k + 1] = L->data[k];
L->data[i - 1] = e; //将新元素插入
L->length++;
return 1;
}
int ListDelete(SqList *L, int i, elemtype *e) //删除i位置的元素,并用e返回其值
{
int k;
if (L->length == 0)
return 0;
if (i < 1 || i > L->length)
{
printf("输入有误,请重新输入!\n");
return 0;
}
*e = L->data[i - 1];
for (k = i; k < L->length; k++) //将删除元素后的每个元素前移一位
L->data[k - 1] = L->data[k];
L->length--;
return 0;
}
int LocateElem(SqList L, elemtype e) //查询元素e,如查到返回该元素的位置,反之,返回0
{
int k;
for (k = 0; k < L.length; k++)
{
if (L.data[k] == e)
{
printf("已查到%d,%d的位置为:", e, e);
return k + 1;
}
}
return 0;
}
int ShowList(SqList L) //打印顺序表
{
int i;
if (L.length == 0)
{
printf("顺序表为空!");
return 0;
}
for (i = 0; i < L.length; i++)
{
printf("第%d个元素为%d \n", i + 1, L.data[i]);
}
return 1;
}
int main()
{
elemtype e;
SqList list1;
InitList(&list1);
list1.data[0] = 1;
list1.data[1] = 2;
list1.data[2] = 3;
list1.data[3] = 13;
list1.data[4] = 23;
list1.data[5] = 54;
list1.length = 6;
printf("%d\n", LocateElem(list1, 23));
ShowList(list1);
printf("表长为%d\n", ListLength(&list1));
ListInsert(&list1, 7, 43);
printf("插入元素后的顺序表为:\n");
ShowList(list1);
printf("表长为%d\n", ListLength(&list1));
ListDelete(&list1, 4, &e);
printf("要删除的元素为%d\n", e);
printf("删除元素后的顺序表为:\n");
ShowList(list1);
printf("表长为%d\n", ListLength(&list1));
GetElem(list1, 4, &e);
printf("查询位置的元素为%d\n", e);
system("pause");
return 0;
}