• 《数据结构》2.2顺序表(sequence list)


     1 //顺序表节点的定义
     2 typedef struct
     3 {
     4     datatype data[MAXSIZE];                //数组容量的上限
     5     int len;                            //记录最后一个元素的位置,相当于一个指针,表空时len=-1
     6 }SeqList;
     7 SeqlLst L;                                //定义一个顺序表L,表长n = L.len+1
     8 SeqList *L;                                //定义一个指向Seqlist类型的指针,L为指针变量,即顺序表的首地址
     9 
    10 //顺序表的初始化(initialize)
    11 SeqList *Init_SeqList()
    12 {
    13     SeqList *L;
    14     L = malloc(sizeof(SeqList));        //动态分配存储空间
    15     L->len = -1;
    16     return L;
    17 }
    18 
    19 //插入操作(指在表的第i个位置前插入值为e的新元素,i的有效范围1<=i<=n+1,时间复杂度O(n))
    20 int Insert_SeqList(SeqList *L, int i, datatype e)
    21 {
    22     int j;
    23     if(L->len == MAXSIZE-1)
    24     {
    25         printf("表满溢出"); return -1;    //表空间已满,不能插入
    26     }
    27     if(i<1 || i>L->len + 2)                //检查插入位置i是否有效
    28     {
    29         printf("位置错"); return 0;
    30     }
    31     for(j = L->len; j > i-1; j--)        //在数组中,第i个元素的下标为i-1
    32         L->data[j+1] = L->data[j];        //节点往后移动一个位置
    33     L->data[k-1] = e;                    //插入新元素e
    34     L->len++;                            //len仍指向最后一个元素
    35     return 1;                            //插入操作成功,返回
    36 }
    37 
    38 //删除操作(指将中第i个位置从线性表中删除掉,i的有效范围1<=i<=n,时间复杂度O(n))
    39 int Delete_SeqList(SeqList *L, int i)
    40 {
    41     int j;
    42     if(i<1 || i>L->len + 1)                //检查空表及删除位置的合法性
    43     {
    44         printf("不存在第i个元素"); return 0;
    45     }
    46     for(j = i; j <= L->len; j++)
    47         L->data[j-1] = L->data[j];        //节点向前移动一个位置
    48     L->len--;
    49     return 1;                            //删除成功
    50 }
    51 
    52 //按值查找(指在线性表中查找是否存在与给定值相等的数据元素,时间复杂度O(n))
    53 int Locate_SeqList(SeqList *L, datatype e)
    54 {
    55     int i = 0;
    56     while(i<=L.len && L->data[i] != e)
    57         i++;
    58     if(i > L->len) return -1;            //查找失败
    59     else return 1;                        //查找成功
    60 }
    61 
    62 //取表中元素(指根据所给序号i在线性表中查找相应数据元素,时间复杂度O(1))
    63 int Get_SeqList(SeqList *L, int i)
    64 {
    65     if(i < 1 && i > L->len+1)            //检查查找位置的合法性
    66     {
    67         printf("不存在第i个元素"); return 0;
    68     }
    69     else return L->data[i-1];
    70 }
    View Code

    算法思路:
    1.插入操作
        (1)将an~ai顺序向后移动一个位置,即an移动到an+1的位置……ai移动到ai+1的位置,为待插入的新元素让出位置;
        (2)将e放到空出的第i个位置;
        (3)修改len指针,使之恒指向当前表中最后一个元素。
    2.删除操作
        (1)将ai+1~an顺序向前移动一个位置;
        (2)修改len指针,使之仍指向当前表中最后一个元素。
    3.按值查找
        从第一个元素a1起依次与e比较,直到找到一个与相等的数据元素为止,返回它在顺序表中的存储下标;
        若查遍整个表都没有找到与e相等的元素,则返回-1,表示查找失败。
    4.取表中元素
        首先确认所查找数据元素序号是否合法,若合法则直接返回对应元素值。否则报错。

    亲爱的读者:如果觉得本文对你有所帮助,请点击推荐,分享给其他人!
  • 相关阅读:
    【BZOJ1010】【HNOI2008】玩具装箱
    【BZOJ1009】【HNOI2008】GT考试
    【BZOJ1008】【HNOI2008】越狱
    【BZOJ1007】【HNOI2008】水平可见直线
    【BZOJ1006】【HNOI2008】神奇的国度
    (考研)生产者消费者问题(赋代码)
    (考研)(精华)二叉树的知识结构图以及各种特殊的二叉树
    二叉树新的一种新建思路和遍历思路
    (简单但不容易写全对)逆置数组
    (经典)二叉树的层次遍历和快速排序
  • 原文地址:https://www.cnblogs.com/zhuangwei/p/5678847.html
Copyright © 2020-2023  润新知