顺序表中基本操作

前言:最近玩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,洗完澡就睡,明天继续加油。

原文地址:https://www.cnblogs.com/1121518wo/p/11415922.html

时间: 2024-10-13 12:28:22

顺序表中基本操作的相关文章

_DataStructure_C_Impl:在顺序表中查找元素

// _DataStructure_C_Impl:Search #include<stdio.h> #include<stdlib.h> #define MaxSize 100 #define IndexSize 20 typedef int KeyType; //元素的定义 typedef struct{ KeyType key; }DataType; //顺序表的类型定义 typedef struct{ DataType list[MaxSize]; int length; }

C++ 顺序表的基本操作

顺序表的基本操作: "seqlist.h"头文件 #ifndef SEQLIST_H_INCLUDED #define SEQLIST_H_INCLUDED #include <iostream> #include <stdlib.h> using namespace std; template <class Type> class SeqList { public: SeqList(size_t sz = INIT_SIZE); bool IsFu

c语言实现顺序表的基本操作

转自 https://www.cnblogs.com/rookiefly/p/3425075.html 原作者:Step by Step 经过三天的时间终于把顺序表的操作实现搞定了.(主要是在测试部分停留了太长时间) 1;线性表顺序存储的概念:指的是在内存中用一段地址连续的存储单元依次存储线性表中的元素. 2;采用的实现方式:一段地址连续的存储单元可以用固定数组或者动态存储结构来实现,这里采用动态分配存储结构. 3;顺序表的定义及操作集合:头文件为defs.h 1 #ifndef _DEFS_H

顺序表中的思路

在c语言当中判断数组的长度是比较麻烦的,不像其他语言可以通过对象的属性或者方法来获得长度. int arr[4]; int length = sizeof(arr)/sizeof(arr[0]); //数组占内存总空间,除以单个元素占内存空间大小 而有一种类似数组的数据结构叫线性表,可以用来很方便的获取数组的长度.其结构体为 typedef struct { int data[1024]; int last; } List; 该数据结构除了定义了一个长度为1024的数组外,还多定义一个变量las

数据结构:顺序表的基本操作

顺序表作业: #include <iostream> #include <cstdio> #include <cstdlib> using namespace std; typedef int T; class SeqList{ private: T *data; int MaxSize; ///顺序表最多可以存放的元素个数. int last; ///顺序表最后一个元素的下标,初始值为-1. public: SeqList(int sz); void Input();

【转载】顺序表中删除为x的所有元素,时间空间复杂度有要求

解法一: 首先确定顺序表L中的第一个值为x的元素位置i,然后依次检查L.data[i+1]~L.data[L.length-1]中每个元素L.data[j](i+1<=j<L.length),若L.data[j]!=x,则将L.data[j]存入L.data[i]中,并令i增1.最后顺序表长度为i.算法如下: void delall(Sqlist *l,int x) { int i=0,j; while(i<l->length && l->data[i]!=x

一个简单顺序表的基本操作

#include <stdio.h>#include <stdlib.h>#define Max_Size 100 /*线性表可能达到的最大长度*/typedef int DataType;typedef struct List{ DataType data[Max_Size]; /*用于存放数据元素数组 */ int length; /* 当前表长度*/}SeqList; void InitList (SeqList &L){ L.length=0;} int Loc

函数模板在c++动态顺序表中的大作用

函数模板提供了一种机制通过它我们可以保留函数定义和函数调用的语义在一个程序位置上封装了一段代码确保在函数调用之前实参只被计算一次. 函数模板提供一个种用来自动生成各种类型函数实例的算法程序员对于函数接口参数和返回类型中的全部或者部分类型进行参数化(parameterize)而函数体保持不变. 函数模板使用注意事项: 1.每个函数模板前边都需要添加模板声明例如:template<typename T> 2.在模板类的使用时,注意其类型改变,例如: template<typename T&g

在顺序表中插入一个元素

之前在创建了一个顺序表的功能函数,这个没有疑问,测试没有错误,但是在接下来的做插入功能的时候发现插入的时候用模块写,不调用这个创建的函数,很难做到这个.该怎么实现这个"高内聚,低耦合"的原则. #include <stdlib.h> #include "Orderfist.h" status InsertList_Sq( SqList L[] ) /* 在链表插入一个元素 */ { UINT32 Insert_position = 0U, Insert_