14.数据结构-顺序表

1.基本概念

1.数据(Data) 数据即信息的载体,是能够输入到计算机中并且能被计算机识别、存储和处理的符号总称。

 2.数据元素(Data Element) 数据元素是数据的基本单位,又称之为记录(Record)。一般,数据元素由若干基本项(或称字段、域、属性)组成。  

2.数据的逻辑结构

表示数据运算之间的抽象关系

按每个元素可能具有的直接前趋数和直接后继数将逻辑结构分为“线性结构”和“非线性结构”两大类。

集合——数据元素间除“同属于一个集合”外,无其它关系

20938a3b1b074bdcb9019b2aeceea6f8.png

线性结构——一个对一个,如线性表、栈、队列

eb44fa827b9342f28149c922d05bb717.png

树形结构——一个对多个,如树

9b4e43bafd9b4d40be81c16437cd3c1c.png

图状结构——多个对多个

d981ea9fb57248c39ae4124cfef588b4.png

3.数据的存储结构

存储结构:逻辑结构在计算机中的具体实现方法。

存储结构是通过计算机语言所编制的程序来实现的,因而是依赖于具体的计算机语言的。

3.1顺序存储

将数据结构中各元素按照其逻辑顺序存放于存储器一片连续的存储空间

如c语言的一维数组,如表 L=(a1,a2,……,an)的顺序结构

bbe95a98b2c54bd883881c5fe3cebca1.png

8a2ca7859ccf4b218a0575044cd500ae.png09c87f3e264249e790467a149e3b7deb.png

3.2 链式存储(重点)

将数据结构中各元素分布到存储器的不同点,用地址(或链指针)方式建立它们之间的联系

eb51e47a6d16451086b24d625cfd505d.png

数据结构中元素之间的关系在计算机内部很大程度上是通过地址或指针来建立的。

3.3索引存储

在存储数据的同时,建立一个附加的索引表,即索引存储结构=数据文件+索引表

8ba5745380a9417497a0f05e7ba06107.png

3.4散列存储

根据数据元素的特殊字段(称为关键字key),计算数据元素的存放地址,然后数据元素按地址存放

ff1f5caf03744a3b9d11d5b4e72e053b.png

057e22d5cc554ac997edd480c1b93617.png

4.线性表

线性表是包含若干数据元素的一个线性序列

记为: L=(a0, ...... ai-1, ai, ai+1 ...... an-1)

L为表名,ai (0≤i≤n-1)为数据元素;

n为表长,n>0 时,线性表L为非空表,否则为空表。

 

线性表L可用二元组形式描述:         

        L= (D,R)

即线性表L包含数据元素集合D和关系集合R  

         D={ai | ai∈datatype ,i=0,1,2, ∙∙∙∙∙∙∙∙∙n-1 ,n≥0}  

        R={<ai , ai+1> | ai , ai+1∈D, 0≤i≤n-2}

                关系符<ai, ai+1>在这里称为有序对

                表示任意相邻的两个元素之间的一种先后次序关系

                ai是ai+1的直接前驱, ai+1是ai的直接后继

线性表的特征:

        1) 对非空表,a0是表头,无前驱;

        2) an-1是表尾,无后继;

        3) 其它的每个元素ai有且仅有一个直接前驱ai-1和一个直接后继ai+1。

5.线性表顺序存储

若将线性表L=(a0,a1, ……,an-1)中的各元素依次存储于计算机一片连续的存储空间。

设Loc(ai)为ai的地址,Loc(a0)=b,每个元素占d个单元 则:Loc(ai)=b+i*d            

f1fba1a3ac214549b659213b34839543.png

5.1顺序存储结构的特点

逻辑上相邻的元素 ai, ai+1,其存储位置也是相邻的

对数据元素ai的存取为随机存取或按地址存取

存储密度高

        存储密度D=(数据结构中元素所占存储空间)/(整个数据结构所占空间)

顺序存储结构的不足:

        对表的插入和删除等运算的时间复杂度较差。

6.顺序存储结构的表示

在C语言中,可借助于一维数组类型来描述线性表的顺序存储结构

#define  N 100       
typedef   int  data_t;
typedef  struct                     
{   data_t data[N]; //表的存储空间
     int last;   
}   sqlist, *sqlink;   	        

687645e7d6a74f1ea3072a38cb7c03d9.png

7.顺序表的实现

设线性表 L=(a0,a1, ……,an-1),对 L的基本运算有:

创建接口

typedef int data_t;
#define N 128

typedef struct{
    data_t data[N];
    int last;
}sqlist,*sqlink;

7.1建立一个空表:list_create(L)

sqlink list_create(sqlink L){
    sqlink L;
    L = (sqlink)malloc(sizeof(sqlist));
    if(L == null){
        printf("list malloc failed\n");
        return L;    
    }
    memset(L,0,sizeof(sqlist));
    L->last=-1;
    return L;
}

memset 函数用于设置一块内存的内容为指定的值。其原型为:

void *memset(void *s, int c, size_t n);
  • s 是指向要设置的内存块的指针。
  • c 是要设置的值,通常是一个无符号字符。
  • n 是要设置的字节数。

7.2置空表:list_clear(L)

int list_clear(sqlink L){
    if(L == NULL){
        return -1;
    }
    memset(L,0,sizeof(sqlist));
    L->last=-1;
    return 0;
}

7.3判断表是否为空:list_empty (L)。若表为空,返回值为1 , 否则返回 0

int list_empty(sqlink L){
    if(L == NULL){
        return -1;
    }
    if(L->last=-1){
        return 1;
    }
    else{
        return 0;
    }
}

7.4求表长:length (L)

int length(sqlink L){
    if(L == NULL){
        return -1;
    }
    return (L->last+1);
}

7.5取表中某个元素:GetList(L , i ), 即ai。要求0≤i≤length(L)-1

int GetList(sqlink L, int i){
    if(L == NULL){
        return -1;
    }
    if(i > L->last || i < 0){
        return -1;
    }
    return L->data[i];
}

7,6定位运算:Locate(L,x)。确定元素x在表L中的位置(或序号)

98277554e68d45f0b848d64f6644ec4d.png

int Locate(sqlink L, data_t x){
    if (L == NULL){
        return -2;
    }

    int i; // 初始化 i
    for(i=0; i<=L->last; i++){
        if(L->data[i] == x){
            return i;
        }
    }

    return -1; // 在循环外返回 -1,表示元素不在表中
}

 7.7 插入 元素:list_insert(L,value,pos)

//1. 判断顺序表是否满
//2.pos ∈[0,last+1]
//3.移动  从后往前
//4.存新值
int  list_insert(Sqlink L, data_t value, int pos){
    if(L->last == N-1){
        return -1;
    }
    if(pos < 0 || pos > L->last+1){
        return -1;
    }
    for(int i = i->last;i>=pos;i++){
        L->data[i+1] = L->data[i];
    }
    L->data[pos]=value;
    L->last++;
    return 0;
}

 

 

  • 17
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ARM小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值