线性表的顺序存储结构

我么继续学习线性表! *^_^*

线性表的顺序存储结构   

线性表的顺序存储结构_第1张图片

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。

线性表的顺序存储结构_第2张图片

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)

线性表的顺序存储结构_第3张图片

删除算法大致思路:

(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(ilength)        //如果删除不是最后位置
    {
        for(k=i;klength;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;

                                                                     π_π

你可能感兴趣的:(算法,学习)