数据结构之线性结构(顺序表)【一】
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)。
顺序表类型定义:
#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)。
相关文章推荐
- 数据结构之:线性表的顺序表示和实现
- C语言 数据结构 线性表的顺序表示
- 线性表的顺序表示和实现 - 数据结构
- [数据结构一]线性表:顺序实现
- 数据结构之线性表——链表的顺序存储(数组描述)
- 数据结构——线性表的顺序存储
- C语言 数据结构 线性表 顺序表 线性表的顺序存储结构
- 数据结构与算法——线性表的顺序表示
- [SDUT](2116)数据结构实验之链表一:顺序建立链表 ---链式存储(线性表)
- 数据结构之线性结构(顺序栈)【六】
- 数据结构——线性表之顺序存储
- 数据结构(1)--- 线性表顺序表
- 数据结构之线性表(顺序表示)
- 【数据结构】顺序线性表的插入、删除、合并实现
- 数据结构之线性表之顺序表和链表(通过数据结构角度深入理解arrayList和linkedList的特性)
- 数据结构 线性表的顺序储存结构
- 数据结构(一):线性表的顺序存储结构-顺序表的实现
- 数据结构——简单线性表(顺序存储)
- 数据结构之线性表顺序存储
- 数据结构之线性表——链表的顺序存储(数组描述)