数据结构与算法分析之顺序存储结构的建立,插入和删除操作

  • 绪论
    线性表是最简单的一种数据结构,它可以用来描述:n个数据元素的优先序列。记为:L=(a1,a2,…..,an)
    按照存储结构它又可以分为顺序存储结构和链式存储结构。而其中线性表的顺序存储结构是最简单最常用的数据结构。

  • 定义:
    用一段连续地址依次存储表中的数据元素。

  • 性质:
    顺序存储结构封装需要三个属性:
    1.存储空间的起始位置,对于数组data来说,它的位置就是线性表存储空间的存储位置。
    2.最大存储容量:数组的长度MaxSize
    3.线性表的当前长度:Length

  • 时间复杂度–O(n)
    关于时间复杂度的分析:
    1.若插入和删除的字符位置正好在表的尾部,这时候只需要进行一次操作,因此复杂度为O(1);
    2.在其它位置,复杂度均为O(n);

  • 关于顺序存储表的优缺点分析:
    优点:
    1.表中元素的逻辑关系仅仅是顺序关系,无需增加额外的存储空间。
    2.可以快速的进行存取元素
    缺点:
    1.删除和插入需要移动大量数据
    2.无法确定容量

  • 线性表的顺序存储结构的定义:
    顺序表的内容就包括数据和长度。

#define MaxSize 20  
struct list  
{  
    int data[MAXLENGTH];  
    int length;  
};  
  • 线性表的顺序存储结构的查找:
    1.在建立的时候需要引入string 库函数以及命名域的声明
    2.三种特殊情况:线性表是空表;插入位置在表头之前和表尾之后。
    3.顺序表的查找过程:按照下标读入数据直接传递给指针。
#include 
using namespace std;
define false 0;
define true 1;
int GetElem(string L,int i,int *e)
{
    if(L.length()==0||i<1||i>L.length())
        return 0;
    else
        *e=L.data[i-1];

    return  1;
}
  • 顺序表的插入操作:
    插入操作中需要注意几个地方:
    1.引入的表是指针的形式,也就是说L是一根指向表地址的指针,因为后面的操作需要直接修改表本身的参数,例如表的长度,表的元素等,所以用指针进行
    2.先判断三种特殊情况,和上面相同,分别是:空表,表头和表尾。
    3.插入操作一般分三步:
    1)插入前空出位置,剩下的元素依次向后移动
    向后移动操作,实现方式就是每个元素向后移动一位。这种操作的方向从后向前更加合适,不会造成元素的覆盖。因为本质就是数组,所以下标是从0开始的。
    2)插入相应的元素
    在i-1的位置插入元素e;
    3)表长加1
int ListInsert(string* L,int i,int e)
 {
     int k;
     if(L->length == MAXSIZE)
         return 0;
     if(i<1||i>L->length)
         return 0;
     if(i<=L->length)
     {
         for(k=L->length;k>=i;k--)
         {
             L->data[k+1]=L->data[k];
         }

     }
    L->data[i-1]=e;
    L->length++;

    return 1;
 }
  • 顺序表的删除操作
int ListDelete(string* L,int i,int *e)
 {
     int k;
     if(L->length()==0)
         return 0;
     if(i>L->length()||i<1)
         return 0;
     *e=L->data[i-1];
     if(ilength())
     {
         for(k=i;k<=L->length();k++)
         {
             L->data[k-1]=L->data[k];
         }
     }
     L->length--;
     return 1;
 }
  • 顺序表的删除操作
    实现代码过程:
    1.同样,删除操作需要修改表的属性:表长和表的元素,因此调用的是表的指针。
    2.三个边界情况
    3.因此是删除操作,也是三个步骤:
    1)确定删除位置
    2)删除位置后的元素依次向前移动,向前移动采用累加的方式
    3)表的长度+1。
int ListDelete(string* L,int i,int *e)
 {
     int k;
     if(L->length()==0)
         return 0;
     if(i>L->length()||i<1)
         return 0;
     *e=L->data[i-1];
     if(ilength())
     {
         for(k=i;k<=L->length();k++)
         {
             L->data[k-1]=L->data[k];
         }
     }
     L->length--;
     return 1;
 }

你可能感兴趣的:(c++,数据结构)