线性表
Posted basonwoo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线性表相关的知识,希望对你有一定的参考价值。
零个或多个数据元素的有限序列,较复杂的线性表中,一个数据元素可以由若干个数据项组成
ADT 线性表(List)
Data
线性表的数据对象集合每个元素的类型均为Datatype,数据元素之间的关系是一对一的。
Operation
InitList(*L) :初始化操作,建立一个空的线性表L
ListEmpty(L) :若线性表为空,返回true,否则返回false
ClearList(*L) :将线性表清空
GetElem(L,i,*e) :将线性表L中第i个位置元素值返回给e
LocateElem(L,e) :在线性表L中查找与给定值e相等的元素,如果查找成功,返回该元素在表中序号表示成功;否则,返回0表示失败
ListInsert(*L,i,e) :在线性表L中第i个位置插入新元素e
ListDelete(*L,i,*e) :删除线性表L中第i个位置元素,并用e返回其值
ListLength(L) :返回线性表L的元素个数
endADT
实现两个线性表集合A和B的并集操作
/*将所有的在线性表Lb中但不在La中的数据元素插入到La中*/
void unionL(List *La,List Lb)
{
int La_len,Lb_len,i;
Elemtype e; /*声明与La和Lb相同的数据元素e*/
La_len = ListLength(*La); /*求线性表La长度*/
Lb_len = ListLength(Lb);
for(i=1;i<=Lb_len;i++)
{
GetElem(Lb,i,&e); /*取Lb中第i个数据元素赋给e*/
if(!LocateElem(*La,e)) /*La中不存在和e相同数据元素*/
ListInsert(La,++La_len,e);/*插入*/
}
}
线性表的顺序存储结构
用一段地址连续的存储单元一次存储线性表的数据元素,可以用C语言的一堆数组来实现
# define MAXSIZE 20 /*存储空间初始分配量*/
typedef int ElemType; /*ElemType类型根据实际情况而定,这里假设为int*/
typedef struct
{
ElemType data{MAXSIZE}; /*数组存储数据元素,最大值为MAXSIZE*/
int length; /*线性表当前长度*/
}Sqlist
- 存储器中的每个存储单元都有自己的编号,称之为地址。
获得元素操作
如果要实现GetElem操作,只需将第i个位置元素值返回。对程序而言,只要i的数值在数组下标范围内,就是把数组第i-1下标的值返回即可。
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
/*Status是函数的类型,其值是函数结果状态代码,如OK等*/
/*初始条件:顺序线性表L已存在,1≤i≤ListLength(L)*/
/*操作结果:用e返回L中第i个数据元素的值*/
Status GetELem(SqList L,int i,ElemType *e)
{
if(L.length==0 || i<1 || i>L.length)
return ERROR;
*e=L.data[i-1];
return OK;
}
这里返回值类型Status是一个整型,返回OK代表1,ERROR代表0。
插入操作
- 如果插入位置不合理,抛出异常;
- 如果线性表长度大于数组长度,则抛出异常或动态增加容量;
- 从最后一个元素开始向前遍历到第i个位置,分别将它们都向后移一位;
- 将要插入元素填入位置i处;
表长加1
/初始条件:顺序线性表L已存在,1≤i≤ListLength(L)/
/操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1/
Status ListInsert(SqList L,int i;ElemType e)
{
int 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;
}
删除操作
- 如果删除位置不合理,抛出异常;
- 取出删除元素;
- 从删除元素位置开始遍历到最后一个元素位置,分别将它们都向前移动一个位置;
表长减1
Status ListDelete(SqList L,int i,ElemType e)
{
int 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->data[k-1]=L->data[k];
}
L->length--;
return OK;
}
线性表的顺序存储结构,在存、读数据时,不管是哪个位置,时间复杂度都是O(1);而插入或删除时,时间复杂度都是O(n)。这说明,它比较是和元素个数不太变化,而更多是存取数据的应用。
以上是关于线性表的主要内容,如果未能解决你的问题,请参考以下文章
在android中的类内的对话框片段的线性布局中添加textview