Loading [MathJax]/jax/output/CommonHTML/fonts/TeX/AMS-Regular.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >线性表的顺序存储

线性表的顺序存储

作者头像
老齐
发布于 2023-03-02 08:52:48
发布于 2023-03-02 08:52:48
1.6K00
代码可运行
举报
文章被收录于专栏:老齐教室老齐教室
运行总次数:0
代码可运行

线性表的顺序存储

线性表的定义和特点

n (n0)

个数据特性相同的元素构成的有限序列称为线性表

  • 元素的个数
n (n0)

为线性表的长度

n=0

时称为空表

  • 元素具有相同的特性,即属于同一数据对象
  • 相邻数据元素之间存在着序偶关系

特点:

  • 存在唯一的一个被称作“第一个”的数据元素
  • 存在唯一的一个被称为“最后一个”的数据元素
  • 除第一个之外,每个数据元素均只有一个前驱(直接前驱)
  • 除最后一个之外,每个数据元素均只有一个后继(直接后继)

顺序存储

定义和特点

线性表的顺序表示:用一组地址连续的存储单元依次存储线性表的数据元素,这种表示也称为线性表的顺序存储结构顺序映像。通常,称这种存储结构的线性表为顺序表(Sequential List)。

特点:

  • 逻辑上相连的数据元素,物理次序也是相邻的。
  • 随机存取的存储结构:只要确定了存储线性表的起始位置,线性表中任一数据元素都可以随机存取。

比较:

  • 线性表:逻辑结构。
  • 顺序表、链表:物理结构。

结构

设第一个数据元素

a1

的存储地址是

LOC(a1)

LOC

即 Location 的前三个字母,也将第一个数据元素的地址称为基地址,或起始位置),每个数据元素占用

L

个存储单元,并以所占的第一个单元的存储地址作为数据元素的存储起始位置,则线性表中第

i

个数据元素的存储位置:

LOC(ai)=LOC(a1)+(i1)×L,(1in)

高级语言中的数组类型也有随机存取的特性,因此,通常用数组来描述数据结构中的顺序存储结构。

顺序表的实现

静态分配:存储空间固定

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#define MAXSIZE 100    //顺序表可能达到的最大长度
typedef struct {
    ElemType data[MAXSIZE];   // 顺序表中的数据元素
    int length;               //当前长度
}SqList;    // 顺序表的结构类型为 SqList

动态分配

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#define InitSize 100    //初始化表的长度
typedef struct{
    ElemType *data;    // 动态分配数组的指针,存储空间的基地址
    int length, MaxSize;    // 当前长度和最大容量
}SqList;

注意 : 静态分配一旦空间占满后面再加入的数据会溢出;动态分配的空间一旦被占满,会先开辟一块比原来更大的空间用来存放原来的数据和新数据,再释放原来已满的空间,而不是直接在原来的空间上拓展新空间。因为顺序存储分配的存储空间都是连续的。

C 语言分配和释放内存空间

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
L.data = (ElemType*)malloc(sizeof(int)*InitSize); //分配空间

其中 ElemType*malloc 函数返回的一个指针,后再将指针的类型转换为数据元素类型的指针。``sizeof(int)*InitSize` 是

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
free(p);    //释放指针 p 所指的内存空间

应用举例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//malloc、free函数的头文件在stdlib.h中
#include <stdlib.h>
#define InitSize 10   //默认的最大长度
typedef struct{
    int *data;    //动态分配数组(顺序表)指针,即存储空间基地址
    int listsize;    //顺序表容量
    int length;    //顺序表当前长度
}SqList;

//初始化顺序表
void InitList(SqList &L){    // 构造空的顺序表 L
    L.data = (int *)malloc(InitSize*sizeof(int));    //申请一连续的内存空间
    L.length = 0;    // 空表的长度为 0
    L.listsize = InitSize;    //此处将顺序表容量(即最大长度)设置为默认值,后续有函数进行修改
}

//增加动态组的长度,传入的参数为指向顺序表的指针 L 和增加的容量 len
void IncreaseSize(SqList &L, int len){
    int *p = L.data;    //定义int类型的指针p,指向原顺序表的data指针,即初始化所分配的连续内存空间
    //重新分配一个连续的内存空间,大小为原顺序表大小+增加的容量
    L.data = (int *)malloc((L.MaxSize+len)*sizeof(int));   //扩容, 原data指针已经指向新的内存空间, 而原来的空间由p指针管理
    
    for(int i=0; i<L.length; i++){
        L.data[i] = p[i];    //将原顺序表的数据复制到新的内存空间
    }
    L.listsize = L.listsize + len;    //新顺序表容量
    free(p);    // 释放原来的内存空间
}

//向顺序表中追加数据
void AppendElem(SqList &L, int a){
    L.data[L.length] = a;    //将整数追加到顺序表中
    L.length++;
}

//主函数
int main(){
    SqList L;    //声明一个顺序表
    InitList(L);    //初始化顺序表,空表
    //追加10个整数
    for (int i=0; i<10; i++){
        AppendElem(L, i);
    }
    IncreaseSize(L, 5);    //顺序表扩容5个单位的空间
    return 0;
}

基本操作

创建动态分配顺序表类型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#define INITSIZE 10    //线性表存储空间的初始分配量
typedef struct
{
 ElemType *elem;     //存储空间基址
 int length;         //当前长度
 int listsize;        //当前分配的存储容量(以sizeof(ElemType)为单位) 
}SqList;

顺序表的初始化,即构造一个空的顺序表 L 。教材 [1] 的算法 2.1

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void InitList(SqList &L){ 
    // 为顺序表分配一个大小为 INITSIZE*sizeof(ElemType) 的内存空间
    L.elem=(ElemType*)malloc(INITSIZE*sizeof(ElemType)); 
    // 教材中使用 L.elem = new ElemType[INITSIZE] ,亦可
    if(!L.elem){
        exit(OVERFLOW);    //存储失败,退出
    }
    L.length = 0;    //空表长度为 0
    L.listsize = INITSIZE;
}

销毁顺序表。

初始条件:顺序表 L 已存在。

操作结果:销毁顺序表 L

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void DestroyList(SqList &L){
    free(L.elem);
    L.elem = NULL;
    L.length = 0;
    L.listsize = 0;
}

清空顺序表

初始条件:顺序表 L 已存在

操作结果:将顺序表设置为空表

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void ClearList(SqList &L){
    L.length = 0
}

判断顺序表是否为空

初始条件:已知顺序表 L

操作结果:若顺序表为空表,则返回 TRUE;否则返回 FALSE

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Status IsListEmpty(SqList L){
    if(L.length==0){
        return TRUE;
    }else{
        return FALSE;
    }
}

顺序表的长度

初始条件:已知顺序表 L

操作结果:返回顺序表中的数据元素个数,即顺序表长度

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int ListLength(SqList L){
    return L.length;
}

顺序表的取值(教材 [1] 的算法 2.2)

初始条件:已知顺序表 L

操作结果:取出第

个(位序)数据元素(对应的数组下标是

,即 elem[i-1] 是第

个数据元素。数组下标,也说成是数据元素的索引)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Status GetElem(SqList L, int i, ElemType &e){
    if (i<1 || i>L.length) return ERROR;   // 判断 i 是否合理
    e = L.elem[i-1];
    return OK;
}

时间复杂度

顺序表的查找(教材 [1] 的算法 2.3)

初始条件:已知顺序表 L

操作结果:根据指定元素值 e ,朝招顺序表中第一个与 e 相等的数据元素,若找到,则返回该数据元素的索引;若查找失败,返回 0

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int LocateElem(SqList L, ElemeType e){
    for (i=0; i<L.length; i++){
        if(L.elem[i] == e) return i;    \\查找成功,返回索引,如果返回位置序号,则是 i+1
    return 0;
    }
}

最好时间复杂度:

最坏时间复杂度:

平均时间复杂度:

顺序表的前驱

初始条件:已知顺序表 L 以及其中的一个元素 cur_e

操作结果:若 cur_e 不是第一个元素,返回 cur_e 的前驱;否则操作失败。

代码1:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Status PriorElem(SqList L, ElemType cur_e, ElemType &pre_e){
    for (i=1; i<L.length; i++){    //这里的 i 是索引,不是位序
        if(L.elem[i]==cur_e) {
            pre_e = L.elem[i-1];
            return OK;
        }else{
            return ERROR;
        }
        
    }
}

代码2:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Status PriorElem(SqList L,ElemType cur_e,ElemType *pre_e)
{   int i=2;    // 这里的 i 不是索引,是位序,对应着 while 中使用 i<=L.length
 ElemType *p=L.elem+1;
 while(i<=L.length&&*p!=cur_e)
 {
  p++;
  i++;
 }
 if(i>L.length)
  return INFEASIBLE; /* 操作失败 */
 else
 {
  *pre_e=*--p;
  return OK;
 }
}

顺序表的后继

初始条件:已知顺序表 L 以及其中的一个元素 cur_e

操作结果:若 cur_e 不是最后一个,则返回它的后继元素,否则操作失败。

代码1:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Status NextElem(SqList L, ElemType cure_e, ElemType &next_e){
    for (i=0; i<(L.length-1); i++){
        if (L.elem[i]==cure_e){
            next_e = L.elem[i+1];
            return OK;
        }else{
            return ERROR;
        }
    }
}

代码2:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Status NextElem(SqList L,ElemType cur_e,ElemType *next_e)
{   int i=1;
 ElemType *p=L.elem;
 while(i<L.length&&*p!=cur_e)
 {
  i++;
  p++;
 }
 if(i==L.length)
  return INFEASIBLE; /* 操作失败 */
 else
 {
  *next_e=*++p;
  return OK;
 }
}

向顺序表插入元素

初始条件:已知顺序表 L

操作结果:在第

个位置,插入一个新的数据元素 e (这里的

是位置序号,意思是讲原来顺序表的第

个到最后一个数据元素,依次向后移动一个位置,这样第 i 个位置就空出来了,然后将数据元素 e 放在此处。表现出来,就是将数据元素 e 插入到第

个位置的元素之前)

代码1:来自教材 [1] 的算法 2.4,此代码中当存储空间已满时,返回 ERROR

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Status ListInsert(SqList &L, int i, ElemType e){
    if ((i<1) || (i>L.length+1)) return ERROR; //若 i 不合法,则报错
    if (L.length==INITSIZE) 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 个位置,索引是 i-1
    ++L.length;    //数据表长度加 1
    return OK;
}

代码2:考虑存储空间满的情况下,增加分配

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#define INCREMENT 2  //增加的空间
Status ListInsert(SqList *L, int i, ElemType e){
    ElemType *newbase, *q, *p;
    if ((i<1)||(i>(*L).length+1)) return ERROR;  // i 不合法
    if ((*L).length>=(*L).listsize){    //当前存储空间已满,增加空间长度
        newbase = (ElemType *)realloc((*L).elem, ((*L).listsize+INCREMENT)*sizeof(ElemType));
        if (!newbase) exit(OVERFLOW);    //分配存储空间失败
        (*L).elem = newbase;             //新的基址
        (*L).listsize += INCREMENT;     //增加存储容量
    }
    q=(*L).elem+i-1;   //q为插入位置,此处与代码1中不同在于,采用了指针
 for(p=(*L).elem+(*L).length-1;p>=q;--p)   //插入位置及之后的元素右移
  *(p+1)=*p;
 *q=e;                 //插入e
 ++(*L).length;        //表长增1
 return OK;
}

最好时间复杂度:

最坏时间复杂度:

平均时间复杂度:

删除顺序表指定元素(教材 [1] 的算法 2.5)

初始条件:已知顺序表 L

操作结果:删除顺序表中指定的第

个数据元素

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Status ListDelete(SqList &L, int i){
   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;    //表长减 1
   return OK;
}

最好时间复杂度:

最坏时间复杂度:

平均时间复杂度:

合并两个顺序表(教材 [1] 的算法 2.15)

初始条件:已知顺序表 LA 和 LB

操作结果:如果将两个顺序表视为两个集合,则合并之后的集合中无重复元素。即,将 LB 中与 LA 中不相同的元素合并回到 LA 中(假设 LA 的容量足够)

算法步骤:

① 分别获取 LA 和 LB 的长度

② 从 LB 中第 1 个元素开始(这里是位序),循环

次,执行一下操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-LB 中查找第 $i~(1\le i\le n)$ 个数据元素,并赋给 `e`-LA 中查找元素 `e` ,如果不存在,则将 `e` 插入到 LA 的最后。

算法描述:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void MergeList(SqList &LA, SqList &LB){
   m = LA.length;    //亦可使用 ListLength(LA) 得到顺序表长度
   n = LA.length;
   for (i=1; i<=n; i++){
       GetElem(LB, i, e); // 取得 LB 中位序 i 的数据元素(索引 i-1),并赋值给 e
       if (!LocateElem(LA, e)){  //如果 LA 中没有元素 e
           ListInsert(LA, ++m, e);  // 则将 e 插入到 LA 尾部
       }
   }
}

时间复杂度

顺序有序表合并(教材 [1] 的算法 2.16)

初始条件:已知两个用顺序表表示的有序表 LA 和 LB

操作结果:假设两个 LA 和 LB 非递减排列,将二者合并之后得到的 LC 亦非递减排列。

算法步骤:

① 创建空表 LC,其长度为 LA.length + LB.length

② 指针 pc 初始化,指向 LC 的第一个元素。

③ 指针 papb 分别指向 LA 和 LB 的第一个元素。

④ 当 papb 均未达到表尾时,依次比较二者所指向元素的值,并从对应的顺序表中读取相应的数据元素插入到 LC 的尾部。

⑤ 若 pb 已经到大 LB 的表尾,则依次将 LA 的剩余元素插入到 LC 的尾部。

⑥ 若 pa 已经到大 LA 的表尾,则依次将 LB 的剩余元素插入到 LC 的尾部。

算法描述:

代码1:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void MergeList_Sq(SqList LA, SqList LB, SqList &LC){
   LC.length = LA.length + LB.length; 
   LC.elem = new ElemType[LC.length]; //为合并后的新表分配一个数组空间
   pc = LC.elem;    //指针 pc 指向新表的第一个元素
   pa = LA.elem;
   pb = LB.elem;
   pa_last = LA.elem + LA.length - 1;    //指针 pa_last 指向 LA 的最后一个元素
   pb_last = LB.elem + LB.length -1;
   while ((pa<=pb_last) && (pb<=pb_last)){    //LA、LB 均未到表尾
       if (*pa <= *pb){    // 将两表中较小的元素插入到 LC
           *pc = *pa;      // 教材 [1] 中的写法更简洁:*pc++ = *pa++
           *pa++;
       }else{
           *pc = *pb;    // *pc++ = *pb++
           *pb++
       }
       *pc++;
   }
   while (pa<=pa_last){  // LB 已到表尾,依次将 LA 中剩余元素插入 LC 的尾部
       *pc++ = *pa++;
   }
   while (pb<=pb_last){  // LA 已到表尾,依次将 LB 中剩余元素插入 LC 的尾部
       *pc++ = *pb++;
   }
   //上述亦可以写成:
   //while (pa<=pa_last){
       //*pc = *pa;
       //*pa++;
       //*pc ++
   //}
   
}

时间复杂度

;空间复杂度

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-01-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 老齐教室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
顺序线性表
线性表的顺序表示和实现 线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素。 线性表的第一个数据元素a1的存储位置,通常称作线性表的起始位置或基地址。 只要确定了存储线性表的起始位置,线性表中任一数据元素都可随机存取,所以线性表的顺序存储结构是一种随机存取的存储结构。 数组类型有随机存取的特性,因此通常都用数组来描述数据接哦故中的顺序存储结构。由于线性表的长度可变,且所需最大存储空间随问题不同而不同,在C语言中可用动态分配的一维数组,如下描述。 /* 线性表的动态分配顺序存储结构 */
猿人谷
2018/01/17
7690
顺序线性表
线性表的顺序表示和实现(参考严蔚敏版)
在顺序表中,删除一个元素和插入一个元素的操作非常相似。删除一个元素即是将i位置之后的所有元素向前移一位。
跋扈洋
2021/05/19
8420
线性表的顺序表示和实现(参考严蔚敏版)
数据结构-线性表顺序存储
由n(n>=0)个数据特性相同的元素构成的有限序列称为线性表,(n=0)的时候称为空表。 一个数据元素可以是简单的一个数据,一个符号,也可以是复杂的若干个数据项的组合
姓王者
2024/11/04
1030
数据结构(1)-线性表
线性表是一种常用的数据结构。在实际应用中,线性表都是以栈、队列、字符串、数组等特殊线性表的形式来使用的。由于这些特殊线性表都具有各自的特性,因此,掌握这些特殊线性表的特性,对于数据运算的可靠性和提高操作效率都是至关重要的。  线性表是一个线性结构,它是一个含有n≥0个结点的有限序列,对于其中的结点,有且仅有一个开始结点没有前驱但有一个后继结点,有且仅有一个终端结点没有后继但有一个前驱结点,其它的结点都有且仅有一个前驱和一个后继结点。
黄规速
2022/04/14
2380
线性表的基本代码(存储结构、插入、删除)c语言
一、线性表的顺序/单链表存储的结构代码 顺序存储 #define MAXSIZE 20 typedef int ElemType; typedef struct { ElemType data[MAXSIZE]; int length; }SqList; 链式存储 typedef struct Node { ElemType data; struct Node* next; }Node; typedef struct Node* LinkList; 顺序存储的插入、删除操作 Status ListI
亦小河
2022/11/14
1.2K0
数据结构——顺序表
基本概念和术语 数据:客观事物的符号表示,是所有能输入到计算机中并被计算机程序处理的符号的总称。如:整数、实数、字符串、图形、图像、声音等经过特殊编码后的数据。 数据元素:数据的基本单位,在计算机中通常作为一个整体进行考虑和处理。(数据元素也称为元素、记录等)。数据元素用于完整地描述一个对象,如:学生记录、树中棋盘的一个格局、图中的一个顶点等。 数据项:组成数据元素的、有独立含义的、不可分割的最小单位。例如:学生基本信息表中的学号、姓名、性别等。 数据对象:性质相同的数据元素的集合,是数据的一个子集。(只要
ruochen
2021/06/28
7090
数据结构——顺序表
数据结构顺序表C实现(14个用户接口)
将顺序表(ADT SqList)的数据对象,数据关系及基本操作(函数)用C语言实现,并测试。
里克贝斯
2021/05/21
4940
数据结构顺序表C实现(14个用户接口)
线性表详解01
看着比较复杂,这就是结构体,struct typedef是重命名,比如这个重命名为了SqList
学编程的小程
2023/10/11
1660
C语言--顺序表的实现
#include<stdio.h> #define list_init_size 100 typedef struct{ int data[list_init_size]; int length; }Seqlist; void creat(Seqlist &L);//建立线性表 void show(Seqlist L);//显示线性表 void insert(Seqlist &L,int position,int e); //插入数据e,位置为position void so
王也518
2022/10/26
1.5K0
线性表的顺序存储结构的实现及其应用(C/C++实现)
存档--- 1 #include <stdio.h> 2 #include <stdlib.h> 3 typedef int ElemType; 4 #define MAXSIZE 10 5 #include "SqList.h" 6 7 void main() 8 { 9 SqList myList; 10 int i = 1,x,sum = 0,n; 11 InitList(myList); 12 scanf("%d",&x); 13 whil
Angel_Kitty
2018/04/09
5070
线性表的顺序存储结构的实现及其应用(C/C++实现)
数据结构(2)线性表的顺序存储
数据结构这门课,自从大二没学好之后一直想找机会学,之前也学过一段时间,但也只进行到了栈和队列,这学期在过完C++后,又拿出来学这门重要且难学的课,又一次打开学过几次的线性表的顺序存储,但这一次的学习发现了很多漏洞,也学会了一些新的东西。所以这篇文章不会从头到尾长篇大论的讲述整个线性表的顺序存储是怎么个事,仅仅是把自己遇到的问题以及新学到的内容记录下来,加深一下自己的印象。
mumumu
2022/12/26
2290
数据结构(2)线性表的顺序存储
线性表(二)
在开始这篇文章之前,我先把程序当中用到的一些头文件以及预定义给出 #include <stdio.h> #include <stdlib.h> #define MAXSIZE 100 //线性表初始分配空间大小 typedef int ElemType //预定义ElemType为int类型标识符  #define ERROR -1    //预定义ERROR的值为-1  #define OK 1        //预定义OK的值为1 l 线性表的顺序存储表示 算法描述: 线性表中的数据元素我们一般用结
mathor
2018/06/22
4660
数据结构 线性表操作
该文介绍了数据结构中线性表的基本操作,包括插入、删除、查找和输出操作。还介绍了顺序表的概念以及实现这些操作的基本代码。
Kindear
2018/01/03
5530
线性表的顺序存储——顺序表
线性表的顺序存储又称为顺序表, 它是用一组地址连续的存储单元依次存储线性表中的数据元素. 逻辑上相邻的两个数据元素在物理位置上同样相邻.
后端码匠
2021/01/20
8990
线性表的顺序存储——顺序表
数据结构之线性表
基本概念 线性表(List):由零个或多个数据元素组成的有限序列。 特征: 1.线性表是一个序列。 2.0个元素构成的线性表是空表。 3.线性表中的第一个元素无前驱,最后一个元素无后继,其他元素有且只有一个前驱和后继。 4.线性表是有长度的,其长度就是元素个数,且线性表的元素个数是有限的,也就是说,线性表的长度是有限的。 线性表抽象数据类型 基于线性表的特征,线性表可以做如下操作:  InitList(*L);//初始化操作,建立一个空的线性表  ListEmpty(L);//若线性表为空,返回true,否
xiangzhihong
2018/02/05
7210
数据结构之线性表
实验一 线性表的基本操作
一、线性结构的顺序表基本操作 实验目的 1.学会定义单链表的结点类型、线性表的顺序存储类型,实现C程序的基本结构,对线性表的一些基本操作和具体的函数定义。 2.掌握顺序表的基本操作,实现顺序表的插入、删除、查找以及求并集等运算。 3.掌握对多函数程序的输入、编辑、调试和运行过程。 实验要求 1.预习C语言中结构体的定义与基本操作方法。 2.对顺序表的每个基本操作用单独的函数实现。 3.编写完整程序完成下面的实验内容并上机运行。 实验内容 1.编写程序实现顺序表的下列基本操作: (1)初始化顺序表La。 (2)将La置为空表。 (3)销毁La。 (4)在La中插入一个新的元素。 (5)删除La中的某一元素。 (6)在La中查找某元素,若找到,则返回它在La中第一次出现的位置,否则返回0。 (7)打印输出La中的元素值。 2.(选做)编写程序完成下面的操作: (1)构造两个顺序线性表La和Lb,其元素都按值非递减顺序排列。 (2)实现归并La和Lb得到新的顺序表Lc,Lc的元素也按值非递减顺序排列。 (3)假设两个顺序线性表La和Lb分别表示两个集合A和B,利用union_Sq操作实现A=A∪B。 二、单链表基本操作(选做) 实验目的 1. 学会定义单链表的结点类型、线性表的链式存储类型,实现对单链表的一些基本操作和具体的函数定义,了解并掌握单链表的类定义以及成员函数的定义与调用。 2. 掌握单链表基本操作及两个有序表归并、单链表逆置等操作的实现。 实验要求 1.预习C语言中结构体的定义与基本操作方法。 2.对单链表的每个基本操作用单独的函数实现。 3.编写完整程序完成下面的实验内容并上机运行。 实验内容 1.编写程序完成单链表的下列基本操作: (1)初始化单链表La。 (2)在La中插入一个新结点。 (3)删除La中的某一个结点。 (4)在La中查找某结点并返回其位置。 (5)打印输出La中的结点元素值。 2.构造一个单链表L,其头结点指针为head,编写程序实现将L逆置。(即最后一个结点变成第一个结点,原来倒数第二个结点变成第二个结点,如此等等。)
谙忆
2021/01/20
7320
数据结构 || 顺序表
1.代码存在逻辑错误,即算法的设计思路不能完美实现删除的需求。 2.算法的效率很低,会浪费很多的时间。
用户10271432
2022/12/19
4540
数据结构 || 顺序表
2024重生之回溯数据结构与算法系列学习【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
可以放弃治疗,顺序表的表长刚开始确定后就无法更改(存储空间是静态的),同时如果提前初始化太多的空间而不用,又会造成资源的浪费,因此动态分配应运而生。
盛透侧视攻城狮
2024/10/22
1350
2024重生之回溯数据结构与算法系列学习【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
【数据结构】线性表----顺序表详解
顺序表(SeqList)属于线性表的同一种,它同样具有线性的存储结构,以下是百度百科关于顺序表的定义:
Skrrapper
2024/06/18
2050
【数据结构】线性表----顺序表详解
顺序存储 c++
#define TRUE 1 #define FALSE 1 #define ERROR 0 #define MAX_SIZE 100 #define OK 1 /**顺序存储 * * */ class ShunList{ typedef struct{ int data; }ElemType; typedef struct{ ElemType *data; int length; }SqList; static
lascyb
2022/01/13
4480
相关推荐
顺序线性表
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验