您的位置:首页 > 理论基础 > 数据结构算法

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

2011-07-21 22:38 423 查看
顺序表是用向量实现的线性表,向量的下标可以看做结点的相对地址,因此顺序表的特点是逻辑上相邻的结点,其物理地址亦相邻。

顺序表类型定义:

#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-1,x,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-1,ai,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)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: