zoukankan      html  css  js  c++  java
  • 线性表——(1)

    1.概念:线性表是由零个或多个数据元素组成的有限数列。

    2.线性表的抽象数据类型:

    (1)InitList(*L):初始化线性表,建立一个空的线性表L

    (2)ListEmpty(*L):判断线性表是否为空表,若为空则返回True,否则返回false

    (3)ClearList(*L):将线性表清空

    (4)GetElem(L,i,*e):将线性表L中的第i个位置元素值返回给e

    (5)LocateElem(L,e):在线性表L中查找与给定e值相等的元素,如果查找成功,返回该元素在表中序号表示成功,否则,返回0表示失败。

    (6)ListInsert(*L,i,e):在线性表L中第i个位置插入元素e。

    (7)ListDelete(*L,i,*e):删除线性表L中第i个位置元素,并用e返回其值。

    (8)ListLength(L):返回线性表L的元素个数。

    3.线性表两种存储结构:顺序存储结构和链式存储结构

    顺序存储结构:用一段地址连续的存储单元一次存储线性表的数据元素。

    顺序存储的结构代码:

    #define MAXSIZE 20
    typedef int ElemType;
    typedef struct
    {
      ElemType data[MAXSIZE];
      int length;  //线性表当前长度
    }SqList;
    Status Initlist_Sq(SqList &L)  //构造一个空的线性表L
    {
        L.elem = (ElemType *)malloc(LIST_INIT_SIZE *sizeof(ElemType));
        if (!L.elem) 
            {
                exit(OVERFLOW);        //存储分配失败
            }
        L.length = 0;     //空表长度为0
        L.listsize = LIST_INIT_SIZE;        //初始化存储容量
        return OK;
    }        //Initlist_Sq

    顺序存储结构封装的三个属性:

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

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

    (3)线性表的当前长度:length

    注:

    1.数组的长度与线性表的当前长度需要区分一下:数组的长度是存放线性表的存储空间的总长度,一般是初始化前后不变。而线性表的当前长度是线性表中元素的个数,是会动态变化的。

    2.数组下标从0开始,线性表内元素从1开始。

    LOC(ai+1) = LOC(a1)+(i-1)*C (C为数据类型所占字节数)

    getElem.c

    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
    }

    LocateElem(L,e)

    status LocateElem (L,e)
    {
        if L.length == 0
            {
                return 0
            }
        for ( i = 0; i < L.length ;i ++ )
            {
                if L.data[i] == e
                    {
                        return i+1
                    }
            }
        return 0
    }

    ListInsert(*L,i,e)

    思路:

    (1)判断i的值,是否满足: 1《i《L.length+1,若不满足返回错误。若满足,执行(2)

    (2)判断L.length是否已经达到MAXSIZE,若达到了,则可以报错返回,或者增加分配,执行(3)

    (3)在第i 个位置插入e,则应该是在L.data[i-1] = e,将原来的l.data[i-1]到最后都向后移动一位。同时表长加一。

    status listInsert(*L,i,e)
    {
        if( i < 1|| i > L.length+1)
        {
            return ERROR
        }                        //i的位置不合法,返回
      if (L.length >= MAXSIZE)
            {
                return ERROR
            }
        
        /*或者也可以增加分配*/
        if (L.length >= MAXSIZE)
            {
                newbase = (ElemType *)remalloc(L.elem,(MAXSIZE + LISTINCREMENT) *sizeof(ElemType0));
                if (!newbase)exit(OVERFLOW);  //存储分配失败
                L.elem = newbase;        //新基址
                MAXSIZE += LISTINCREMENT;    //增加存储容量
            }
        /*结束*/
        if(i < L.length+1)
        {
            for(j=L.length;j>i-1;j--)
            {
                L.data[j] = L.data[j-1]
            }
        }
        L.data[i-1] = e
        L.length++;
        return ok
    }

    ListDelete(*L,i,*e)

    status ListDelete(*L,i,*e)
    {
        if( L.length == 0 || i < 1 || i > L.length)
        {
            return ERROR
        }
        *e = L.data[i-1]
        if(i < L.length)
        {
            for(j=i;j<L.length;j++)
            {
                L.data[j-1] = L.data[j]
            }
        }
        L.length--;
        return OK
    }

     线性表的特点:

    •优点:
    –无须为表示表中元素之间的逻辑关系而增加额外的存储空间。
    –可以快速地存取表中任意位置的元素。
    •缺点:
    –插入和删除操作需要移动大量元素。
    –当线性表长度变化较大时,难以确定存储空间的容量。
    –容易造成存储空间的“碎片”。
  • 相关阅读:
    linux定时任务
    php与xpath使用操作文本节点
    php处理图片实现
    Yii源码阅读笔记
    Yii源码阅读笔记
    Yii源码阅读笔记
    Yii源码阅读笔记
    Yii源码阅读笔记
    Yii源码阅读笔记
    Yii源码阅读笔记
  • 原文地址:https://www.cnblogs.com/shixiaomiao/p/3973837.html
Copyright © 2011-2022 走看看