标签:
线性表的OPeration:
InitList(*L):初始化操作,创建一个为L的空的线性表;
ListEempty(L):判断L是否为空表,若线性表为空,则返回ture,否则返回false;
ClearList(*L):将线性表清空;
GetElem(L,i,*e):将线性表L中第i个位置元素值返回给e;
LocateElem(L,e):在线性表L中查找与给定值e相等的元素,若查找成功,返回元素在L中的序号表示成功,否则,返回0表示失败;
ListInsert(*L,i,e):在线性表L中第i个位置插入元素值e;
ListDetele(*L,i,*e):在线性表L中删除第i个位置元素,并用e返回其值;
Listlength(L):返回线性表L中的元素个数;
union.c//将A=AUB,将B中元素合并到A中代码段:
void unionL(List *La, List Lb)
{int La_len, Lb_len, i;
Elemtype e;//相同元素e
La_len=ListLength(*La);
Lb_len=ListLength(Lb);
for(i=1;i<=Lb_len;i++);
{GetElem(Lb,i,&e);
if(!LocateElem(La,e))
{LiseInsert(La,La_len++,e);
}
}
线性表的顺序存储结构:开辟初始地址,在连续地址中依次存放元素值。
#define MAXSIZE 20
typedef int Elemtype
typedef struct
{Elemtype data[MAXSIZE];
int length //线性表当前长度
}SqList;
顺序存储结构三个属性:(1)存储空间的起始位置,数组data;(2)数组的长度MAXSIZE;(3)线性表的当前长度length.
getElem.c//将线性表L中第i个位置元素值返回。
#define OK 1
#define Error 0
#define ture 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=data[i-1];
return 0K;
}
线性表插入算法:
Status ListInsert(SqList *L,int i,Elemtype e)
{int k;
if(L->length>MAXSIZE)
{return ERROR;}
if(i<1||i>L->length+1)
{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 ListDetele(SqList *L,int i,Elemtype *e)
{int k;
if(L->length==0)
{return ERROR;}
if(i<1||i>L->length)
{return ERROR;}
if(1<=i<L->length)//应该用for循环
{for(k=i;k<L->length;k++){L->data[i-1]=L->data[i];}}
L->length--;
*e=L->data[i-1];
return OK;}
线性表插入和删除操作的时间复杂度分析:
最坏情况,在第一个元素进行插入和删除操作,每个元素都要移动,时间复杂度为o(n);
最好情况,在最后一个元素进行插入和删除操作,不需要移动其他元素,时间复杂度为o(1);
平均情况,o(n-1/2)=o(0);
综上,顺序线性表的存取操作时间复杂度都为o(1),插入和删除操作都为o(n);
线性表顺序存储结构:
优点:无需为表示表中元素的逻辑关系而增加额外存储空间;可以快速存取表中任意位置元素
缺点:插入或删除操作需要移动大量的元素;当线性表长度变化较大时,难以确定存储空间的容量;容易造成存储空间的碎片
标签:
原文地址:http://www.cnblogs.com/liuyanhot/p/4494307.html