线性表-顺序表

一.定义:具有相同特性数据元素的一个有限序列。

1.元素个数即线性表长度用n表示,n>=0.

    n=0表示线性表是一个空表(没有任何元素),线性表一般表示为:

                                (a1,a2,.....,ai,ai+1,an)

a1为表头元素,an为表尾元素。

顺序表

定义MaxSize表示线性表预估计不会超过的长度

#define MaxSize 50

struct ElemType

{

int address;

int quNum;

string cityName;

string shuoming;

};

采用结构体类型表示,元素类型为通用类型标识符ElemType的线性表的顺序存储结构类型描述如下:

typedef struct

{

ElemType data[MaxSize];//存放顺序表中的元素

int length;//存放顺序表的实际占用长度

}SqList;//顺序表的类型定义

1.建立顺序表

将给定的n个元素的数组的每个元素依次放入到顺序表中,并将n赋值给顺序表的长度。

void CreateList(SqList *&l,ElemType a[],int n)//由a中的n个元素建立顺序表

{

int i;

L=(SqList*)malloc(sizeof(SqList));//分配存放线性表的空间

for(i=0;i<n;i++)//放置数据元素

L->data[i]=a[i];

L->length=n;//设置长度

}

2.顺序表的基本运算算法

(1)初始化线性表InitList(L).

该运算的结果是构造一个空的线性表L。实际上只需分配线性表的存储空间,并将length域设置为0即可。

void InitList(SqList *&L)

{

L=(SqList *)malloc(sizeof(SqList));//分配存放线性表的空间

L->length=0;//置空线性表长度为0

}

时间复杂度为O(1)

(2)销毁线性表DestoryList(L)

void DestoryList(Sqlist *&L)

{

free(L);

}

本算法的时间复杂度为O(1)

(3)判线性表是否为空表ListEmpty(L)

bool ListEmpty(SqList*L)

{

return (L->length==0);

}

(4)求线性表的长度ListLength(L)

该运算返回顺序表L的长度。实际上只需要返回length域的值即可。

int ListLength(SqList*L)

{

return (L->length);

}

算法时间复杂度为O(1)

(5)输出线性表DispList(SqList *L)

该运算顺序显示L中各元素的值。

void DispList(SqList *L)

{

int I;

for(i=0;i<L->length;i++)//扫描顺序表输出各元素的值

printf(“%d”,L->data[i]);

printf(“\n”);

}

时间复杂度O(L->length)

(6)求线性表中某个数据元素值GetElem(L,i,e)

该运算用e返回L中第i ( 1<=i<=length(L) )个元素的值。

bool GetElem(SqList *L,int I ,ElemType &e)

{

if(i<1||i>L->length)

return false;//参数错误时返回false

e=L->data[i-1];//取元素值

return true;//成功找到元素时返回true

}

本算法时间复杂度为O(1)

(7)按元素值查找LocateElem(L,e)

该运算顺序查找第一个值域与e相等的元素的逻辑序号。若这样的元素不存在,则返回值为0

int LocateElem(SqList*L,ElemType e)

{

int i=0;

while(i<L->length&&L->data[i]!=e)

i++;                                                 //查找元素e

if(i>=L->length)                            //未找到时返回0;

return 0;

else

return i+1;                                    //找到后返回其逻辑序号

}

本算法中基本运算为while循环中i++语句,故时间复杂度为O(L->length)

(8)插入数据元素ListInsert(L,i,e)

bool ListInsert(SqList *&L,int i,Elemtype e)

{

int j;

if(i<1||i>L->length+1)

return false;                                          //      参数错误时返回false

i--;                                                            //将顺序表逻辑序号转换为物理序号

for(j=L->length;j>I;j--)                         //      将data[i]及后面元素后移一个位置

L->data[j]= L->data[j-1];

L->data[i]=e;                                        //插入元素e

L-length++;                                            //顺序表长度增1

return true;                                           //成功插入返回true

}

本算法时间复杂度与插入位置有关,平均时间复杂度为O(n),n为单链表中数据节点的个数。

(9)删除数据元素ListDelete(L,i,e)

bool ListDelete(SqList *&L,int i,ElemType &e)

{

int j;

if(i<1||i>length)

return false;                                 //参数错误时返回false

i--;                                                   //将顺序表逻辑序号转换为物理序号

e=L->data[i];   

for(j=I;j<L->length-1;j++)          //data[i]之后的元素前移一个位置

L->data[j]=L->data[j+1];

L->length--;                         //顺序表长度减1

return true;                        //成功删除后返回true

}

转载于:https://my.oschina.net/u/3672754/blog/1543325

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值