zoukankan      html  css  js  c++  java
  • 数据结构-顺序表

    从结构性上考虑,通常将data 和last 封装成一个结构作为顺序表的类型:
    typedef struct
    { datatype data[MAXSIZE];
    int last;
    } SeqList;

    1.顺序表的初始化


    顺序表的初始化即构造一个空表,这对表是一个加工型的运算,因此,将L设为指针参数,首先动态分配存储空间,然后,将表中last 指针置为-1,表示表中没有数据元素。算法如下:
    SeqList *init_SeqList( )
    { SeqList *L;
    L=malloc(sizeof(SeqList));
    L->last=-1; return L;
    }
    算法2.1

    设调用函数为主函数,主函数对初始化函数的调用如下:
    main()
    {SeqList *L;
    L=Init_SeqList();
    ...
    }

    2. 插入运算


    线性表的插入是指在表的第i个位置上插入一个值为x 的新元素,插入后使原表长为n的表:

    (a1,a2,... ,ai-1,ai,ai+1,... ,an)

    成为表长为n+1 表:

    (a1,a2,...,ai-1,x,ai,ai+1,...,an ) 。

    i 的取值范围为1<=i<=n+1 。

    顺序表上完成这一运算则通过以下步骤进行:
    (1) 将ai~an 顺序向下移动,为新元素让出位置;
    (2) 将x 置入空出的第i个位置;
    (3) 修改last 指针(相当于修改表长),使之仍指向最后一个元素。

    算法如下:
    int Insert_SeqList(SeqList *L,int i,datatype x)
    { int j;
    if (L->last==MAXSIZE-1)
    { printf("表满"); return(-1); } /*表空间已满,不能插入*/
    if (i<1 || i>L->last+2) /*检查插入位置的正确性*/
    { printf("位置错");return(0); }
    for(j=L->last;j>=i-1;j--)
    L->data[j+1]=L->data[j]; /* 结点移动*/
    L->data[i-1]=x; /*新元素插入*/
    L->last++; /*last仍指向最后元素*/
    return (1); /*插入成功,返回*/
    }
    算法2.2

    本算法中注意以下问题:
    (1) 顺序表中数据区域有MAXSIZE个存储单元,所以在向顺序表中做插入时先检查表空间是否满了,在表满的情况下不能再做插入,否则产生溢出错误。
    (2) 要检验插入位置的有效性,这里i 的有效范围是:1<=i<=n+1,其中n 为原表长。
    (3) 注意数据的移动方向。

    3. 删除运算DeleteList(L,i)


    线性表的删除运算是指将表中第i 个元素从线性表中去掉,删除后使原表长为n 的线性表:

    (a1,a2,... ,ai-1,ai,ai+1,...,an)

    成为表长为n-1 的线性表:

    (a1,a2,... ,ai-1, ai+1,... ,an)。

    i 的取值范围为:1<=i<=n 。

    顺序表上完成这一运算的步骤如下:
    (1) 将ai+1~an 顺序向上移动。
    (2) 修改last指针(相当于修改表长)使之仍指向最后一个元素。

    算法如下:
    int Delete_SeqList(SeqList *L;int i)
    { int j;
    if(i<1 || i>L->last+1) /*检查空表及删除位置的合法性*/
    { printf ("不存在第i个元素"); return(0); }
    for(j=i;j<=L->last;j++)
    L->data[j-1]=L->data[j]; /*向上移动*/
    L->last--;
    return(1); /*删除成功*/
    }
    算法2.3

    本算法注意以下问题:
    (1)删除第i个元素,i的取值为1<=i<=n ,否则第i个元素不存在,因此,要检查删除位置的有效性。
    (2)当表空时不能做删除,因表空时L->last的值为-1,条件(i<1 || i>L->last+1)也包括了对表空的检查。
    (3)删除ai 之后,该数据已不存在,如果需要,先取出ai ,再做删除。

    4. 按值查找


    线性表中的按值查找是指在线性表中查找与给定值x相等的数据元素。在顺序表中完成该运算最简单的方法是:从第一个元素a1 起依次和x比较,直到找到一个与x相等的数据元素,则返回它在顺序表中的存储下标或序号(二者差一);或者查遍整个表都没有找到与x 相等的元素,返回-1。

    算法如下:
    int Location_SeqList(SeqList *L, datatype x)
    { int i=0;
    while(i<=L.last && L->data[i]!= x)
    i++;
    if (i>L->last) return -1;
    else return i; /*返回的是存储位置*/
    }
    算法2.4

    本算法的主要运算是比较。显然比较的次数与x在表中的位置有关,也与表长有关。当a1=x 时,比较一次成功。当an=x 时比较n 次成功。平均比较次数为(n+1)/2,时间性能为O(n)。
  • 相关阅读:
    UGUI Toggle控件
    UGUI Scrollbar控件
    利用头插法——创建、遍历链表
    函数指针
    opencv 图像通道操作
    三维点云匹配算法
    点与三角形位置关系
    室内场景mesh 的自动分块---用于加载显示,参数化等
    eigen 四元数
    string 、char*、const char *
  • 原文地址:https://www.cnblogs.com/summer-xwq/p/4174514.html
Copyright © 2011-2022 走看看