数据结构——线性表的顺序表示与实现(顺序表)

简介: 数据结构——线性表的顺序表示与实现(顺序表)

线性结构的定义:


若结构是非空有限集,则有且仅有一个开始结点和一个终端结点,并且所有结点都最多只有一个直接前趋和一个直接后继。


可表示为:(a1 , a2 , ……, an)


线性表


线性结构表达式:(a1 , a2 , ……, an)


线性结构的特点:


① 只有一个首结点和尾结点;


② 除首尾结点外,其他结点只有一个直接前驱和一个直接后继。


简言之,线性结构反映结点间的逻辑关系是 一对一 的


线性结构包括线性表、堆栈、队列、字符串、数组等等,其中,最典型、最常用的是线性表


一、线性表的定义和特点


线性表的定义:用数据元素的有限序列表示



例1 分析26 个英文字母组成的英文表


( A,  B,  C,  D, ……  ,  Z)
        数据元素都是字母;     
        元素间关系是线性


例2 分析学生情况登记表



数据元素都是记录;


元素间关系是线性


同一线性表中的元素必定具有相同特性


顺序存储结构存在问题


存储空间分配不灵活


运算的空间复杂度高


总结


线性表中数据元素的类型可以为简单类型,也可以为复杂类型。


许多实际应用问题所涉的基本操作有很大相似性,不应为每个具体应用单独编写一个程序。


从具体应用中抽象出共性的逻辑结构和基本操作(抽象数据类型),然后实现其存储结构和基本操作


二、线性表的顺序表示和实现


线性表的顺序表示又称为顺序存储结构或顺序映像。


顺序存储定义:把逻辑上相邻的数据元素存储在物理上相邻的存储单

元中的存储结构。


简言之,逻辑上相邻,物理上也相邻


顺序存储方法:用一组地址连续的存储单元依次存储线性表的元素,

可通过数组V[n]来实现。



顺序表的类型定义


#define  MAXSIZE 100      // 最大长度
typedef  struct 
{
    ElemType  *elem;      // 指向数据元素的基地址
    int  length;            // 线性表的当前长度                                                      
 }SqList;


线性表的重要五大基本操作


1、初始化线性表L (参数用引用)


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


1、初始化线性表L (参数用指针)


Status InitList_Sq(SqList *L)       //构造一个空的顺序表L
{         
    L-> elem=new ElemType[MAXSIZE];   //为顺序表分配空间
    if(! L-> elem) exit(OVERFLOW);        //存储分配失败
    L-> length=0;                     //空表长度为0
    return OK;
}


2、销毁线性表L


void DestroyList(SqList &L)
{
  if (L.elem) delete[]L.elem;     //释放存储空间
}


3、清空线性表L


void ClearList(SqList &L) 
{
   L.length=0;                      //将线性表的长度置为0
}


4、求线性表L的长度


int GetLength(SqList L)
{   
  return (L.length);             
}


5、判断线性表L是否为空


int IsEmpty(SqList L)
{  
  if (L.length==0) 
    return 1;      
    else 
      return 0;
}


取值操作


(根据位置i获取相应位置数据元素的内容)


获取线性表L中的某个数据元素的内容


int GetElem(SqList L,int i,ElemType &e)
{  if (i<1||i>L.length) 
  return ERROR;   
   //判断i值是否合理,若不合理,返回ERROR
   e=L.elem[i-1];   //第i-1的单元存储着第i个数据
   return OK;
}


查找操作



// 在线性表L中查找值为e的数据元素
int LocateELem(SqList L,ElemType e)
{
      for (i=0;i< L.length;i++)
          if (L.elem[i]==e) 
            return i+1;                
      return 0;
}


插入操作(插在第i个结点之前)



算法步骤


(1)判断插入位置 i 是否合法。


(2)判断顺序表的存储空间是否已满。


(3)将第n至第i 位的元素依次向后移动一个位置,空出第i个位置。


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


(5)表长加1,插入成功返回OK。


// 在线性表L中第i个数据元素之前插入数据元素e 
Status ListInsert_Sq(SqList &L,int i ,ElemType e)
{
   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.length;         //表长增1
  return OK;
}


5.删除操作(删除第i个结点)



算法步骤


(1)判断删除位置i 是否合法(合法值为1≤i≤n)。


(2)将欲删除的元素保留在e中。


(3)将第i+1至第n 位的元素依次向前移动一个位置。


(4)表长减1,删除成功返回OK。


// 将线性表L中第i个数据元素删除
Status ListDelete_Sq(SqList &L,int i)
{
   if((i<1)||(i>L.length))
     return ERROR;   // i值不合法
   for (j=i;j<=L.length-1;j++)                   
    L.elem[j-1]=L.elem[j];        // 被删除元素之后的元素前移  
   --L.length;                    // 表长减1
  return OK;
}


三、顺序表(顺序存储结构)的特点


(1)利用数据元素的存储位置表示线性表中相邻数据元素之间的前后关系,即线性表的逻辑结构与存储结构一致


(2)在访问线性表时,可以快速地计算出任何一个数据元素的存储地址。因此可以粗略地认为,访问每个元素所花时间相等



四、顺序表的优缺点


优点:


  • 存储密度大(结点本身所占存储量/结点结构所占存储量)


  • 可以随机存取表中任一元素


缺点:


  • 在插入、删除某一元素时,需要移动大量元素


  • 浪费存储空间


  • 属于静态存储形式,数据元素的个数不能自由扩充


相关文章
|
3月前
|
存储 编译器 C语言
数据结构-顺序表详解(看这篇就足够了,哈哈哈)
数据结构-顺序表详解(看这篇就足够了,哈哈哈)
74 2
|
7天前
|
存储 算法 测试技术
【C++数据结构——线性表】求集合的并、交和差运算(头歌实践教学平台习题)【合集】
本任务要求编写程序求两个集合的并集、交集和差集。主要内容包括: 1. **单链表表示集合**:使用单链表存储集合元素,确保元素唯一且无序。 2. **求并集**:遍历两个集合,将所有不同元素加入新链表。 3. **求交集**:遍历集合A,检查元素是否在集合B中存在,若存在则加入结果链表。 4. **求差集**:遍历集合A,检查元素是否不在集合B中,若满足条件则加入结果链表。 通过C++代码实现上述操作,并提供测试用例验证结果。测试输入为两个集合的元素,输出为有序集合A、B,以及它们的并集、交集和差集。 示例测试输入: ``` a c e f a b d e h i ``` 预期输出:
30 7
|
7天前
|
机器学习/深度学习 存储 C++
【C++数据结构——线性表】单链表的基本运算(头歌实践教学平台习题)【合集】
本内容介绍了单链表的基本运算任务,涵盖线性表的基本概念、初始化、销毁、判定是否为空表、求长度、输出、求元素值、按元素值查找、插入和删除数据元素等操作。通过C++代码示例详细解释了顺序表和链表的实现方法,并提供了测试说明、通 - **任务描述**:实现单链表的基本运算。 - **相关知识**:包括线性表的概念、初始化、销毁、判断空表、求长度、输出、求元素值、查找、插入和删除等操作。 - **测试说明**:平台会对你编写的代码进行测试,提供测试输入和预期输出。 - **通关代码**:给出了完整的C++代码实现。 - **测试结果**:展示了测试通过后的预期输出结果。 开始你的任务吧,祝你成功!
24 5
|
7天前
|
机器学习/深度学习 存储 C++
【C++数据结构——线性表】顺序表的基本运算(头歌实践教学平台习题)【合集】
本文档介绍了线性表的基本运算任务,涵盖顺序表和链表的初始化、销毁、判定是否为空、求长度、输出、查找元素、插入和删除元素等内容。通过C++代码示例详细展示了每一步骤的具体实现方法,并提供了测试说明和通关代码。 主要内容包括: - **任务描述**:实现顺序表的基本运算。 - **相关知识**:介绍线性表的基本概念及操作,如初始化、销毁、判定是否为空表等。 - **具体操作**:详述顺序表和链表的初始化、求长度、输出、查找、插入和删除元素的方法,并附有代码示例。 - **测试说明**:提供测试输入和预期输出,确保代码正确性。 - **通关代码**:给出完整的C++代码实现,帮助完成任务。 文档
24 5
|
21天前
|
数据库
数据结构中二叉树,哈希表,顺序表,链表的比较补充
二叉搜索树,哈希表,顺序表,链表的特点的比较
数据结构中二叉树,哈希表,顺序表,链表的比较补充
|
2月前
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习之顺序表【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
顺序表的定义和基本操作之插入;删除;按值查找;按位查找等具体详解步骤以及举例说明
|
2月前
|
存储 C语言
【数据结构】顺序表(c语言实现)(附源码)
本文介绍了线性表和顺序表的基本概念及其实现。线性表是一种有限序列,常见的线性表有顺序表、链表、栈、队列等。顺序表是一种基于连续内存地址存储数据的数据结构,其底层逻辑是数组。文章详细讲解了静态顺序表和动态顺序表的区别,并重点介绍了动态顺序表的实现,包括初始化、销毁、打印、增删查改等操作。最后,文章总结了顺序表的时间复杂度和局限性,并预告了后续关于链表的内容。
95 3
|
2月前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之顺序表习题精讲【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
顺序表的定义和基本操作之插入;删除;按值查找;按位查找习题精讲等具体详解步骤以及举例说明
|
3月前
|
存储 Java
数据结构第二篇【关于java线性表(顺序表)的基本操作】
数据结构第二篇【关于java线性表(顺序表)的基本操作】
52 6
|
2月前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之王道第2.3章节之线性表精题汇总二(5)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
IKU达人之数据结构与算法系列学习×单双链表精题详解、数据结构、C++、排序算法、java 、动态规划 你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!

热门文章

最新文章