• 数据结构(C++)——顺序表


    顺序表和链表的比较

      1.存取方式

        顺序表可以随机访问,而链表只能从表头顺序查找。(因此经常查找顺序表某一个元素时,顺序表更适合)

      2.逻辑结构与物理结构

        顺序表中,逻辑上相邻的元素,其物理存储位置也相邻。链表中,逻辑相邻的元素,其物理存储位置不相邻。

      3.查找、插入和删除操作

        按值查找时,顺序表链表时间复杂度都为O(n)。

        按序号查找时,顺序表时间复杂度为O(1),而链表时间复杂度为O(n)。

        插入和删除元素中,顺序表平均移动半个表的长度,而链表只需要改变一下指针域的值就可以了。

        (因此,当线性表经常进行插入和删除元素时,选链表更合适)

      4.空间分配

        顺序表在静态存储分配的情形下,存储空间装满了就不能扩充;链表就不存在这个问题。

        

    顺序表结构

    #define MaxSize 50  //顺序表的最大长度
    
    typedef char ElemType; //ElemType为数据类型
    
    typedef struct    //顺序表的静态表示 
     {
        ElemType data[MaxSize];
        int length;    
    }SqList; 

    顺序表的初始化

    SqList CreateList()  //初始化顺序表 
    {
        SqList L;    
        L.length=0;   //初始化要将顺序表的长度初始化为0 
        
        return L;
    } 

    向顺序表插入元素

    bool InsertList(SqList &L,int i,ElemType d){    //插入元素 
        if(i<1||i>L.length+1||i>MaxSize)  //将数据插入在第i个位置 
        {                                    //插入的位置错误,返回false 
            return false;
        } 
        
        for(int j=L.length;j>=i;j--)  //从后往前,将下标i-1及以后的元素向后移一个位置,为插入的元素腾位置 
        {
            L.data[j]=L.data[j-1];    //插入元素是向后移动 
        }
        
        L.data[i-1]=d;                //低昂待插入的元素放的要插入的位置 
        L.length++;                   //插入完成后,长度加1 
         
        return true;                 //操作成功返回true 
    }

    删除顺序表中的元素

    bool DeleteList(SqList &L,int i,ElemType &e){   //删除顺序表中的元素 
        if(i<1||i>L.length){       
            return true;                //下标错误时,返回false 
        }
        
        e=L.data[i-1];                 //返回待删除的数据 
        
        for(int j=i;j<L.length;j++){     //从第i个开始向后 
            L.data[j-1]=L.data[j];
        }
        
        L.length--;                  //删除后长度减短 
        
        return true;                //操作完成,返回true 
    }

    查找顺序表中的元素

    int FindList(SqList &L,ElemType e){   //返回第一个与e相等的元素的次序号,找不到返回0 
        for(int i=1;i<=L.length;i++){
            if(L.data[i-1]==e){    //判断第i个元素是否等于e 
                return i;           //等于则返回位置 
            }
        }
        
        return 0;                  //遍历完顺序表还找不到 返回0 
    } 

    显示表内元素

    void PrintList(SqList &L){
        for(int i=0;i<L.length;i++)
        {
            cout<<L.data[i]<<' ';
        }
    }
  • 相关阅读:
    模板汇总——Tarjian
    CountHunter 6101 最优贸易 强联通缩点
    POJ-3662 Telephone Lines 二分+双端队列
    EF-获取自增ID值
    EF-记录程序自动生成并执行的sql语句日志
    EF-使用迁移技术让程序自动更新数据库表结构
    EF-关于类库中EntityFramework之CodeFirst(代码优先)的操作浅析
    javascript进阶笔记(3)
    javascript进阶笔记(2)
    javascript进阶笔记(1)
  • 原文地址:https://www.cnblogs.com/WP-WangPin/p/12739166.html
Copyright © 2020-2023  润新知