关于顺序表
线性表的顺序存储结构是把线性表中的所有元素按照其逻辑顺序依次存储到计算机存储器中指定存储位置开始的一块连续的存储空间中,如图所示
由于线性表中逻辑上相邻的两个元素在对应的顺序表中它们的存储位置也相邻,所以这种映射称为直接映射。
线性表的顺序存储结构简称为顺序表(sequential list)。
作业要求:
1.初始化顺序表L
2.依次插入a,b,c,d元素
3.输出顺序表L
4.输出顺序表L的长度
5.判断顺序表L是否为空
6.输出顺序表L的第3个元素
7.输出元素a的位置
8.在第4个元素位置上插入f元素
9.输入顺序表L
10.删除顺序表L的第3个元素
11.输出顺序表L
12.释放顺序表L
基本运算函数的语法:
InitList(&L):初始化线性表,构造一个空的线性表L
ListEmpty(&L):判断线性表L是否为空表,若L为空表,则返回真,否则返回假
ListLength(L):求线性表的长度,返回L中元素的个数
DispList(L):输出线性表
GetElem(L,i,&e):求线性表中某个数据元素值,用e返回L中第i(1≤i≤n)个元素的值
LocateElem(L,e):按元素查找,返回L中第一个值域与e相等的元素的序号,若不存在这样的元素则返回0
ListInsert(&L,i,e):插入数据元素,在L的第i(1≤i≤n+1)个位置插入一个新的元素e,L的长度加1
ListDelete(&L,i,&e):删除数据元素,删除L的第(1≤i≤n+1)个元素,并用e返回其值,L的长度减1
DestroyList(&L):销毁顺序表,释放线性表L占用的内存空间
本次用C语言进行实现
以下为实现代码:
#include "stdio.h"
#define MAXSIZE 20 /* 存储空间初始分配量 */
使用 typedef 关键字
定义 Status 函数类型和 ElemType 数据类型
在C/C++中,借助数组类型来实现顺序表,所以在定义ElemType数据类型时,需要确定好顺序表存入的数据是何种类型的变量,再定义ElemType的类型
typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
typedef char ElemType; /* ElemType类型根据实际情况而定,这里假设为char */
Status visit(ElemType c)
{
printf("%c", c);
return OK;
}
typedef struct
{
ElemType data[MAXSIZE]; /*data数组,存储数据元素*/
int length; /*length为线性表当前长度*/
}SqList;
Status DispList(SqList L) /*循环遍历,输出顺序表元素 */
{
int i;
for (i = 0; i < L.length; i++)
visit(L.data[i]);
printf("\n");
return OK;
}
Status InitList(SqList* L) /*初始化线性表,构造一个空的线性表L*/
{
L->length = 0;
return OK;
}
Status ListEmpty(SqList L) /*判断线性表是否为空表,若L为空表,则返回真,否则返回假*/
{
if (L.length == 0)
return TRUE;
else
return FALSE;
}
int ListLength(SqList L) /*返回表L中数据元素个数,即返回长度*/
{
return L.length;
}
Status GetElem(SqList L, int i, ElemType * e)
/*使用条件 ① 顺序表L已存在 ② 传入的i符合:1≤i≤ListLength(L)*/
{
if (L.length == 0 || i<1 || i>L.length)
/*用e返回L中第i个数据元素的值,i值位置,第一个位置的数组是从0开始*/
return ERROR;
*e = L.data[i - 1];
return OK;
}
int LocateElem(SqList L, ElemType e)
/*按元素查找,返回L中第一个值域与e相等的元素的序号,若不存在这样的元素则返回值0 */
{
int i;
if (L.length == 0)
return 0;
for (i = 0; i < L.length; i++)
{
if (L.data[i] == e)
break;
}
if (i >= L.length)
return 0;
return i + 1;
}
Status ListInsert(SqList * L, int i, ElemType e)
/*插入数据元素,在L的第i(1≤i≤n+1)个位置插入一个新的元素e,L的长度加1*/
{
char k;
if (L->length == MAXSIZE) /* 顺序线性表已经满 */
return ERROR;
if (i<1 || i>L->length + 1)/* 当i比第一位置小或者比最后一位置后一位置还要大时 */
return ERROR;
if (i <= L->length) /* 若插入数据位置不在表尾 */
{
for (k = L->length - 1; k >= i - 1; k--) /* 将要插入位置之后的数据元素向后移动一位 */
L->data[k + 1] = L->data[k];
}
L->data[i - 1] = e; /* 将新元素插入 */
L->length++;
return OK;
}
Status ListDelete(SqList * L, int i, ElemType * e)
/*删除数据元素,删除L的第(1≤i≤n+1)个元素,并用e返回其值,L的长度减1*/
{
char k;
if (L->length == 0) /* 线性表为空 */
return ERROR;
if (i<1 || i>L->length) /* 删除位置不正确 */
return ERROR;
*e = L->data[i - 1];
if (i < L->length) /* 如果删除不是最后位置 */
{
for (k = i; k < L->length; k++)/* 将删除位置后继元素前移 */
L->data[k - 1] = L->data[k];
}
L->length--;
return OK;
}
int DestroyList(SqList *&L) //释放线性表
{
free(L);
}
Tip: free()函数与malloc()函数一一对应,必须先用malloc()动态分配内存,才能用free()释放内存
运行结果:
初始化L后:L.length=0
在L的表头依次插入a~d后:L.data=abcde
线性表的长度为:L.length=5
顺序表L是否为空:0 (1:是,0:否)
顺序表的第3个元素:c
值为a的元素在第1个位置
在第4个位置插入的元素:c
插入元素后顺序表L.data=abcfde
删除的第3个元素为:c
删除第3个元素后顺序表L.data=abfde