• 顺序表中基本操作


    前言:最近玩esp8266和ucos-iii以及在学c++比较多,接触的大部分都是指针、结构体、链表;刚好自己又在看数据结构(数据结构真的非常重要,要好好学,是学算法的敲门砖,哈哈哈),个人看法在对顺序表进行元素增和删操作,效率比较低(要移动非常多的其他元素),而我之前写的对链表操作,使用指针操作,效率就高多了。好了,来看今天的学习总结吧!

    一、顺序表的初始化:

    算法步骤:

    1、为顺序表L动态分配一个预定义大小的数组空间,使elem指向这段空间的基地址

    2、将表的当前长度设为0

    伪代码实现:

    Status InitList(SqList  &L)
    {
        //构造一个空的顺序表L 
       L.elem= new ElemType[MAXSIZE];//为顺序表分配一个大小为MAXSIZE的数组空间
       if(!L.elem)  exit(OVERFLOW);//存储分配失败退出
       L.length=0;//空表长度为0
      return OK;
    }

    二、取值操作:

    算法步骤:

    1、判断指定的位置序号i值是否合理(1<= i <=L.length),若不合理,则返回ERROR。

    2、若i值合理,则将第i个数据元素L.elem[i-1]赋给参数e,通过e返回第i个数据元素的传值

    为代码实现:

    Status GetElem(SqList L ,int i,ElemType &e)
    {
          if(i<1||i>L.length)   return EEROR;//判断i是否合理
         e=L.elem[i-1];
        return OK;
    }

    三、查找操作:

    算法步骤:

    1、从第一个元素起,依次和e相比较,若找到与e相等的元素L.elem[i],则查找成功,返回该元素的序号i+1;

    2、若查遍整个顺序表都没有找到,则查找失败,返回0

    伪代码实现:

    int LocateElem(SqList L,ElemType e)
    {
         //在顺序表L中查找值为e的数据元素,返回其序号
        for (i=0;i<L.length;i++)
        {
           if(L.elem[i]==e)  return  i+1;
          
        }
       return 0;
    
    }

    四、插入操作:

    算法步骤:

    1、判断插入位置I是否合法(i值的合法范围是1<= i<=n+1),若不合法则返回ERROR

    2、判断顺序表的存储空间是否已经满了,如果满了话,就返回ERROR

    3、将第n个至第i个位置的元素依次向后移动一个位置,空出第i个位置(i=n+1时无需移动)

    4、将要插入的新元素e放入第i个位置

    5、表长加一

    伪代码实现:

    Status ListInsert(SqList &L,int i ,ElemType e)
    {
         //在顺序表中第i个位置插入新的元素e,i 值的合法范围是1=< i <=L.length +1
        if((i<1)||(i>L.length+1))    return ERROR;   //i值不合法
        if(L.length==MAXSIZE)  return ERROR ;//存储空间已经满了
        for(j=L.length-1;j>=i+1;j--)  
        {
           L.elem[j+1]=L.elem[j];//插入位置及之后的元素往后移动
           L.elem[i-1]=e;//将元素e插入到第i个位置
           ++L.lenfth;//表长加一
           return OK;
         }
    }

    五、删除操作:

    算法步骤:

    1、判断删除为i是否合法(合法值为1<=i <=n),如果不合法就返回ERROR

    2、将第i+1个至第n个的元素依次向前移动一个位置(i=n时不要移动)

    3、表长减一

    伪代码实现;

    Status ListDelete(SqList  &L,int i)
    {
         //在顺序表中删除第i个元素,i值的合法取值范围是1<= i <= L.length
         if((i<1)||(I>L.length)    return ERROR;
        for(j=i;j<L.length-1,j++)
        {
            L.elem[j-1]=L.elem[j];//往前移动
            --L.length;
            return OK;
         }
    }

    六、总结;

            不管是顺序表还是单链表,最好的学习方法是,在了解基本概念后,能够马上用到实战当中去,这样可以加深自己的理解。好了,现在是凌晨00:49,洗完澡就睡,明天继续加油。

  • 相关阅读:
    Reverses CodeForces
    Palindrome Partition CodeForces
    Victor and String HDU
    Harry and magic string HDU
    Interesting HDU
    I Love Palindrome String HDU
    Substring UVA
    小明系列故事――女友的考验 HDU
    Walk Through Squares HDU
    使用ionic来build安卓apk时,报CordovaError: Requirements check failed for JDK 1.8 or greater
  • 原文地址:https://www.cnblogs.com/1121518wo/p/11415922.html
Copyright © 2020-2023  润新知