我么继续学习线性表! *^_^*
线性表的顺序存储结构
1、定义:指的是用一段地址连续的存储单元依次存储线性表的数据元素。
【线性表的每个数据元素的数据类型相同,因此,我们可以用一维数组来实现顺序存储结构】
2、结构代码
#define MAXSIZE 20 //存储空间初始分配量
typeof int ElemType //根据情况而定数据类型,这里假设为int
typeof struct
{
ElemType data [MAXSIZE]; //数组存储元素
int length; //length表示线性表长度
}SqList;
描述顺序存储结构的属性:
(1)存储空间的起始位置:数组data,它的存储位置就是存储空间的存储位置。
(2)线性表的最大储容量:MAXSIZE。
(3)线性表当前的长度:length。
【注意】数组长度与线性表长度的区别:
数组长度:存放线性表的存储空间的长度(一般是不变的)。
线性表长度:其中的数据元素的个数(这个长度是可以发生变化的)。
任何时刻,线性表长度<=数组长度
顺序存储结构的插入与删除
获得元素操作:
i的数值在数组下标的范围之内,就是把i-1的下标值返回即可。
代码如下:
#define OK 1
#define error 0
typeof int Status;
Status GetElem(SqList L,int i,ElemType *e)
{
if(L.length==0||i<1||i>L,length)
return error;
*e=L.data[i-1];
return OK;
}
初始条件:顺序线性表L存在,且1<=I<=ListLength(L)。
操作结构:用e返回L中第i个数据元素的值,第1个位置的数据从0开始。
插入操作:O(n)
插入算法的大致思路:
(1)如果插入位置不合理,抛出异常。
(2)如果线性表长度大于等于数组长度,则抛出异常或者动态增加容量。
(3)从最后一个元素开始向前遍历到第i个位置,分别将它们都向后移动一个位置。
(4)将要插入的元素填入到位置i。
(5)表长加1。
Status ListInsert(Sqlist *L,int i,ElemType e)
{
if((i<1) || (i>L->length+1)) //当i比第一位置小或比最后一位置后一位置还要大时
return ERROR;
if(L->length == MAXSIZE) //顺序线性表已满
return ERROR;
if(i <= L->length) //若插入数据不在线性表尾部
{
for(int j = L->length-1; j>=i-1;j--) //插入位置后的数据元素后移一位
{
L->data[j+1] = L->data[j];
}
}
L->data[i-1] = e; //插入新元素
L->length++;
return OK;
}
删除操作: O(n)
删除算法大致思路:
(1)如果删除位置不合理,抛出异常。
(2)取出删除元素。
(3)从删除元素位置开始遍历到最后一个元素位置,分别将它们都向前移动一个位置。
(4)表长减1。
Status ListDelete(Sqlist *L,int i,ElemType *e)
{
int k;
if(L->length == 0) //线性表为空表
return ERROR;
if((i<1) || (i>L->length)) //不确定删除位置
return ERROR;
*e=L->data[i-1];
if(i<L->length) //如果删除不是最后位置
{
for(k=i;k<L->length;k++) //将删除位置后的数据元素前移一位
L->data[k-1]=L->data[k];
}
L->length--;
return OK;
}
线性表顺序存储结构的优缺点:
优点:
(1)无需为表示表中元素之前的逻辑关系增加额外的存储空间。
(2)可以快速地存取表中任一位置的元素。
缺点:
(1)插入和删除元素操作需要移动大量的元素。
(2)当线性表长度变化较大时,难以确定存储空间的容量。
(3)造成存储空间的“碎片”。
线性表的链式存储结构
定义:n个结点(ai的存储映像)链结成一个链表。
特点:
一组任意的存储单元存储线性表的数据元素,存储单元可连续,可不连续。
【数据元素可以存在未被占用的任意位置】
数据域:存储数据元素信息的域。
指针域:存储直接后继位置的域。
指针(链):指针域中存储的信息。
结点:这两部分组成数据元素的存储映像。(第一个结点的存储位置叫头指针)
头结点:单链表的第一个结点前附设一个结点。
代码:
//线性表的单链表储存结构
typedef struct node
{
Elemtype date;
struct node *next;
} node;
typedef struct node *LinkList;
π_π