数据结构之线性结构(顺序表)【一】

来源:互联网 发布:unity3d movietexture 编辑:程序博客网 时间:2024/05/17 17:54
顺序表是用向量实现的线性表,向量的下标可以看做结点的相对地址,因此顺序表的特点是逻辑上相邻的结点,其物理地址亦相邻。

顺序表类型定义:

#define  ListSize  100  //定义表空间大小,根据实际需要

typedef  int   DataType;//数据类型假定为int

typedef  struct  {

DataType  data[DataType],//data用于存放节点

int length,

}SeqList;

注:ListSize应该仔细选值,既要满足需求又不能过大,导致浪费存储空间。

基本操作:

初始化顺序表

void   InitList (SeqList *L)

{\\顺序表的初始化即将表的长度置为0

L->length = 0;

}

求表长

int    ListLength(SeqList *L)

{

return   L->legth;//返回length

}

取表中第i个结点

DataType GetElem(L,  i )

{

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

Error("position  error");

return  L-> data[i-1];

}

最重要的是插入和删除操作:

1.插入

线性表的插入运算是指在表的第i(1≤i≤n+1)个位置上,插入一个新结点x,使长度为n的线性表: 
          (a1,…,ai-1,ai,…an
变成长度为n+1的线性表: 
          (a1,…,ai-1x,ai,…an

注意:
     ① 由于向量空间大小在声明时确定,当L->length≥ListSize时,表空间已满,不可再做插入操作
     ② 当插入位置i的值为i>n或i<1时为非法位置,不可做正常插入操作

顺序表插入操作过程
  在顺序表中,结点的物理顺序必须和结点的逻辑顺序保持一致,因此必须将表中位置为n ,n-1,…,i上的结点,依次后移到位置n+1,n,…,i+1上,空出第i个位置,然后在该位置上插入新结点x。仅当插入位置i=n+1时,才无须移动结点,直接将x插入表的末尾。


具体算法描述:

void  InsertList(SeqList   *L,DataType x, int i)

{//在第i个结点插入元素x

int  j;

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

Error("position error");

if(  L->length >= ListSize )

Error("overflow");

for( j = L ->length; j>=i-1; j--) {

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

}

L->data[i] = x;

L-> length++;

}

算法分析:

1.问题的规模:  表的长度L->length(设为n)是问题的规模

2.移动结点的次数由表长n和插入位置决定

算法的时间主要花费在for循环中的结点后移语句上,该语句的执行次数是n-i +1;

当i= n+1:移动结点次数为0,即算法在最好时间复杂度O(1);

当i = 1;移动节点次数为n,即算法在最坏情况下时间复杂度是O(n)(一般我们所说的时间复杂度都是指最坏时间复杂度)


在顺序表上进行插入运算,平均要移动一半结点。

 删除

1.删除运算的逻辑描述
     
线性表的删除运算是指将表的第i(1≤i≤n)个结点删去,使长度为n的线性表
             (a1,…,ai-1ai,ai+1,…,an
   变成长度为n-1的线性表
             (a1,…,ai-1,ai+1,…,an
注意:
     
当要删除元素的位置i不在表长范围(即i<1或i>L->length)时,为非法位置,不能做正常的删除操作
2.顺序表删除操作过程
     在顺序表上实现删除运算必须移动结点,才能反映出结点间的逻辑关系的变化。若i=n,则只要简单地删除终端结点,无须移动结点;若1≤i≤n-1,则必须将表中位置i+1,i+2,…,n的结点,依次前移到位置i,i+1,…,n-1上,以填补删除操作造成的空缺.

3.具体算法描述
   
void DeleteList(SeqList *L,int i)
      {//从L所指的顺序表中删除第i个结点ai
        
 int j;
        if(i<1||i>L->length)
           Error("position error"); //非法位置
        for(j=i;j<=L->length-1;j++)
           L->data[j-1]=L->data[j]; //结点前移
        L->length--;                //表长减小
       }

4.算法分析

  ①结点的移动次数由表长n和位置i决定:
     i=n时,结点的移动次数为0,即为0(1)
     i=1时,结点的移动次数为n-1,算法时间复杂度分别是0(n)
  顺序表上做删除运算,平均要移动表中约一半的结点,平均时间复杂度也是0(n)。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 为缓解交通拥堵现状人们应该怎么办 告对方不知道对方出身日期怎么办 上海业余围棋4进3老不过怎么办 孩子想上学但又怕同学议论怎么办 在菲律宾黑了博彩老板的钱怎么办 九阴真经3d先遣服更新失败怎么办 公司核名通过不想用了怎么办 公司核名下来了不想注册了怎么办 家人受到小贷公司催款威胁怎么办 商标抽签资料提交上去有问题怎么办 花椒直播助手苹果版下载不了怎么办 在香港酒店住把床单弄上血了怎么办 综英美我能怎么办我也很绝望百度云 护照的名字中间有个空格怎么办 开车不小心压死黄鼠狼了怎么办 三户联保贷款一方不还怎么办 因为隔断中介违约…我该怎么办 上海居住证没下来换住址了怎么办 工商注册后大股东不注资怎么办 公司不给去办理变更股东信息怎么办 滴滴车主注册没有自己的车型怎么办 代办用虚假地址注册的公司怎么办? 写字楼注册公司租户不租了怎么办 租户没把公司迁出我该怎么办 租户不肯把户口迁出了业主怎么办 同片区个体户营业场所搬迁怎么办 个体领发票的本丢了怎么办 领房产证发票和合同丢了怎么办 税务登记证5年没有办怎么办 二证合一后税务登记证怎么办? 微信漂流瓶打招呼对方收不到怎么办 添加不上徽信好友的微信帐号怎么办 手机号码不用了微信密码忘了怎么办 别人用我的手机号码注册微信怎么办 电脑此网站的安全证书有问题怎么办 起诉离婚开庭时被告不到场怎么办 商标35类被别人注册了怎么办 商标被注销后被别人注册怎么办 电商35类商标被抢注怎么办 血小板太低怎么办可以吃水果吗? 微信好友删除了只记得昵称怎么办