从结构性上考虑,一般将data 和last 封装成一个结构做为顺序表的类型:
typedef struct
{ datatype data[MAXSIZE];
int last;
} SeqList;
算法
顺序表的初始化即构造一个空表,这对表是一个加工型的运算,所以,将L设为指针参数,首先动态分配存储空间,而后,将表中last 指针置为-1,表示表中没有数据元素。算法以下:
SeqList *init_SeqList( )
{ SeqList *L;
L=malloc(sizeof(SeqList));
L->last=-1; return L;
}
算法2.1
设调用函数为主函数,主函数对初始化函数的调用以下:
main()
{SeqList *L;
L=Init_SeqList();
...
}函数
线性表的插入是指在表的第i个位置上插入一个值为x 的新元素,插入后使原表长为n的表:性能
成为表长为n+1 表:spa
i 的取值范围为1<=i<=n+1 。
顺序表上完成这一运算则经过如下步骤进行:
(1) 将ai~an 顺序向下移动,为新元素让出位置;
(2) 将x 置入空出的第i个位置;
(3) 修改last 指针(至关于修改表长),使之仍指向最后一个元素。
算法以下:
int Insert_SeqList(SeqList *L,int i,datatype x)
{ int j;
if (L->last==MAXSIZE-1)
{ printf("表满"); return(-1); } /*表空间已满,不能插入*/
if (i<1 || i>L->last+2) /*检查插入位置的正确性*/
{ printf("位置错");return(0); }
for(j=L->last;j>=i-1;j--)
L->data[j+1]=L->data[j]; /* 结点移动*/
L->data[i-1]=x; /*新元素插入*/
L->last++; /*last仍指向最后元素*/
return (1); /*插入成功,返回*/
}
算法2.2
本算法中注意如下问题:
(1) 顺序表中数据区域有MAXSIZE个存储单元,因此在向顺序表中作插入时先检查表空间是否满了,在表满的状况下不能再作插入,不然产生溢出错误。
(2) 要检验插入位置的有效性,这里i 的有效范围是:1<=i<=n+1,其中n 为原表长。
(3) 注意数据的移动方向。指针
线性表的删除运算是指将表中第i 个元素从线性表中去掉,删除后使原表长为n 的线性表:it
成为表长为n-1 的线性表:io
i 的取值范围为:1<=i<=n 。
顺序表上完成这一运算的步骤以下:
(1) 将ai+1~an 顺序向上移动。
(2) 修改last指针(至关于修改表长)使之仍指向最后一个元素。ast
算法以下:
int Delete_SeqList(SeqList *L;int i)
{ int j;
if(i<1 || i>L->last+1) /*检查空表及删除位置的合法性*/
{ printf ("不存在第i个元素"); return(0); }
for(j=i;j<=L->last;j++)
L->data[j-1]=L->data[j]; /*向上移动*/
L->last--;
return(1); /*删除成功*/
}
算法2.3
本算法注意如下问题:
(1)删除第i个元素,i的取值为1<=i<=n ,不然第i个元素不存在,所以,要检查删除位置的有效性。
(2)当表空时不能作删除,因表空时L->last的值为-1,条件(i<1 || i>L->last+1)也包括了对表空的检查。
(3)删除ai 以后,该数据已不存在,若是须要,先取出ai ,再作删除。
List