码迷,mamicode.com
首页 > 编程语言 > 详细

数据结构和算法-学习笔记4

时间:2014-12-17 13:04:04      阅读:185      评论:0      收藏:0      [点我收藏+]

标签:数据结构和算法

线性表两种存储结构-顺序存储

顺序存储结构代码:

#define MAXSIZE 20

typedef int ElemType;

typedef struct

{

    ElemType data[MAXSIZE];

    int length;

}SqList;

结构封装需要三个属性:

存储空间的起始位置,数组data,它的存储位置就是线性表存储空间的存储位置

线性表的最大存储容量:数组长度MAXSIZE

线性表的当前长度:length

地址计算方法:

假设ElemType占用的是C个存储单元,你们线性表中第i+1个数据元素和第i个数据元素的关系是

LOC(ai+1)=LOC(ai)+c

代码段:

bubuko.com,布布扣

插入操作:

思路:

①插入位置不合理,抛出异常

②线性表长度大于等于数组长度,则跑出异常或动态增加数组容量

③从最后一个元素开始向前遍历到第i个位置,分别将它们都向后移动一个位置

④将要插入元素填入位置i处

⑤线性表长+1

实现代码:

Status ListInsert(SqList *L,int i,ElemType e)

{

    int k;

    if(L->length == MAXSIZE)  //顺序线性表已经满了

    {

        return ERROR;

     }

    if(i<1 || i>L->length+1)  //当i不在范围内时

    {

        return ERROR;

    }

    if(i<=L->length)   //若插入数据不在表尾

    {

        //将要插入位置后数据元素向后移动一位

        for(K = L->length-1;k>=i-1;k--)

        {

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

        }

    }

    L->data[i-1] = e;//将新元素插入

    L->length++;


    return OK;

}


删除操作:

思路:

①如果删除位置不合理,抛出异常

②取出删除元素

③从删除元素位置开始遍历到最后一个元素位置,分别将它们都向前移动一个位置

④表长-1

代码实现:

Status ListInsert(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--;//线性表长度-1


    return OK;

}

时间复杂度:O(n)

线性表的顺序存储结构,在存、读数据时,不管是哪个位置,时间复杂度都是O(1)。而在插入或删除时,时间复杂度都是O(n),说明,它比较适合元素个数稳定,不经常插入和删除元素。

优点:

①无须为表示表中元素之间的逻辑关系而增加额外的存储空间

②可以快速地存取表中任意位置的元素

缺点:

①插入和删除操作需要移动大量元素

②当线性表长度变化较大时,难以确定存储空间的容量


数据结构和算法-学习笔记4

标签:数据结构和算法

原文地址:http://4790276.blog.51cto.com/4780276/1590929

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!