嵌入式团队培训_线性结构

一、线性表

定义:零个或多个数据元素的有限序列
要求:第一个元素无前驱,最后一个元素无后继,其他元素都有且只有一个前驱和后继

思考:循环链表?双向链表?

线性表的抽象数据类型ADT(书p45),其代码表示:

在list.h头文件中
#include <stdio.h>

//定义线性表长度大小
#define MAXSIZE 100

//增强代码可读性
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef int Status;


/**
 * 线性表的声明
 */
typedef struct list {
   
    //数据元素
    ElemType data[MAXSIZE];
    //线性表的长度
    int length;
}SqList;

//线性表CRUD功能声明
void initList(SqList* L); /*1.初始化一个空的线性表L*/
Status isEmpty(SqList L); /*2.判断线性表是否为空,空返回true*/
void clearList(SqList* L); /*3.清空线性表*/
int listLength(SqList L); /*4.返回线性表L的长度即元素个数*/
void getElem(SqList L,int i,ElemType* e); /*5.将线性表L中第i个位置元素值返回给e*/
int locateElem(SqList L,ElemType* e); /*6.将线性表L中元素值为e的,查找成功返回第i,否则返回0*/
Status listInsert(SqList* L,int i,ElemType e); /*7.在线性表L中第i个位置插入元素e,成功返回true*/
Status listDelete(SqList* L,int i,ElemType* e); /*8.在线性表L删除第i个位置的元素,并将其值返回给e,成功返回true*/

1、顺序存储

定义:用一段连续的地址存储单元依次存储线性表的数据元素。
要求:数据元素类型相同。
所以我们可以用一维数组来实现顺序存储结构。
在这里插入图片描述
第i个数据元素ai的存储位置:LOC(ai) = LOC(a1)+(i - 1)* c (c为每个数据元素占据的存储单元)

#define MAXSIZE 100 /*初始化空间分类量(内存分配)*/

//增强代码可读性
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef int Status;


/**
 * 线性表的声明
 */
typedef struct list {
   
    //数据元素
    ElemType data[MAXSIZE];
    //线性表的长度
    int length;
}SqList;

由于查找,修改操作过于简单,我们主要讲插入删除操作

首先分清这三个概念
下标:从0开始,例如a0,a1
第i个:从1开始,例如第一个元素(a0),第n个元素(an-1)
线性表长度L->length:数据元素的个数 n

/**
 * 插入条件:线性表L已经存在,且1 <= i <= listLength(L)
 * 操作:在线性表L中第i个位置之前插入元素e
 * @param L 线性表L
 * @param i 位置坐标
 * @param e 插入元素
 * @return 状态值
 */
Status listInsert(SqList* L,int i,ElemType e) {
   

    //1.算法的健壮性
    if (L->length == MAXSIZE) {
   /*线性表已经满了*/
        return ERROR;
    }
    /*或者if (listLength(*L) == MAXSIZE) {
        return ERROR;
    }*/
    
    if (i < 1 || i > L->length + 1) {
   /*i不在插入的范围内*/
        return ERROR;
    }
    
    if (i <= L->length) {
    /*此时i满足条件,并且不是在表尾进行插入*/
        //将第i个位置后面的元素,依次后移才有位置进行插入
        for (int k = L->length - 1; k >= i - 1; k++) {
   
            L->data[k + 1] = L->data[k];
        
  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值