zoukankan      html  css  js  c++  java
  • 数据结构.线性表(1)——顺序表

     

    数据结构:相互之间存在一种或多种特定关系的数据元素的集合。

    线性表定义:

    零个或多个数据元素的有限序列。

    关键地方:

    1.首先它是一个序列:前驱后继

    2.线性表强调是有限的

    抽象数据类型:

    1.插入数据

    1)如果插入位置不合理,抛出异常;

    2)如果线性表长度大于等于数组长度,则抛出异常或动态增加容量;

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

    4)将要插入元素填入位置i处;

    5)表长加1

    2.删除数据

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

    2)取出删除元素

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

    4)表长减1

    顺序存储结构:

    线性表的顺序存储结构是一种随机存取的存储结构。由于高级程序设计语言(这里主要用指C)中的数组类型也有随即存取的特性,因此,通常用数组来描述数据结构中的顺序存储结构。(适合元素个数不太变化,而更多是存取数据的应用)

    1.三个关键点:

    1)存储空间的起始位置

    2)线性表的最大存储容量

    3)线性表的当前长度(与数组长度区分

    2.code

     1 ///Name:SqList
     2 ///Author:JA
     3 ///Date:2015-2-27
     4 
     5 
     6 
     7 ///线性表的动态分配顺序存储结构
     8 #define LIST_INT_SIZE 100   //初始分配量
     9 #define LISTINCREMENT 10    //分配增量
    10 typedef int ElemType;
    11 typedef int Status;
    12 
    13 typedef struct{
    14     ElemType *elem;  //存储空间基地址
    15     int length;     //当前长度
    16     int listsize;   //当前分配的存储容量
    17 }SqList;
    18 
    19 Status  InitList_Sq(SqList *L){
    20     //构造一个空的线性表L
    21     (*L).elem = (ElemType*)malloc(LIST_INT_SIZE*sizeof(ElemType));
    22     if (!(*L).elem) exit(OVERFLOW);  //存储分配失败
    23     (*L).length = 0;               //空表长度为0
    24     (*L).listsize = LIST_INT_SIZE;   //初始存储容量
    25     return OK;
    26 }//InitList_Sq
    27 
    28 ///在表L中第i个位置前插入新的元素e
    29 Status ListInsert_Sq(SqList *L, int i, ElemType e){
    30     ElemType *newbase,*p,*q;
    31     if (i<1 || i>(*L).length + 1) return ERROR;  //i值不合法
    32     if ((*L).length >= (*L).listsize){        //当前存储空间已满,增加分配
    33         newbase = (ElemType*)realloc((*L).elem, ((*L).listsize + LISTINCREMENT)*sizeof(ElemType));
    34         if (!newbase) exit(OVERFLOW);
    35         (*L).elem = newbase;
    36         (*L).listsize += LISTINCREMENT;
    37 
    38     }
    39     q = &((*L).elem[i - 1]);  //q为插入位置
    40     for (p = &((*L).elem[(*L).length - 1]); p >= q; --p) *(p + 1) = *p;  //插入位置及之后的元素后移
    41     *q = e;
    42     ++(*L).length;
    43     return OK;
    44 }//ListInsert_Sq
    45 
    46 ///在表L中删除第i个元素,并用e返回其值
    47 Status ListDelete_Sq(SqList *L, int i, ElemType *e){
    48     ElemType *p, *q;
    49     if (i<1 || i>(*L).length + 1) return ERROR;  //i值不合法
    50     p = &((*L).elem[i - 1]); //p为被删除元素的位置
    51     *e = *p;
    52     q = (*L).elem + (*L).length - 1;
    53     for (++p; p <= q;++p) *(p - 1) = *p;  //删除位置及之后的元素前移
    54     --(*L).length;
    55     return OK;
    56 }//ListDelete_Sq
    View Code

     

  • 相关阅读:
    Next Permutation leetcode java
    用户上网行为管理之Panabit
    ROS之冗余线路Recursive Route
    ros的romon功能介绍以及使用条件
    nf_conntrack: table full, dropping packet. 终结篇
    nf_conntrack满之解决方法nginx报502错误
    Ros之BGP学习87-88课
    ros关于动态路由ospf优先级cost和priority的区别和联系
    ros ppp隧道up或者down的时候,可以写脚本,脚本可以调用的参数$user $local-address $remote-address $caller-id $called-id $interface
    ROS 6.X目前限速比较稳定的一个脚本小包优先
  • 原文地址:https://www.cnblogs.com/joeaaron007/p/4303516.html
Copyright © 2011-2022 走看看