数据结构-2.4.顺序表的查找

一.按位查找:

例一:

以顺序表的静态分配为例:

#include<stdio.h>
#define MaxSize 10 //定义最大长度 
​
typedef struct
{
    int data[MaxSize]; //用静态的“数组”存放数据元素,最多存MaxSize个,且为int型,共4*10个字节 
    int length; //顺序表的当前长度 ,共4个字节 
}SqList; //顺序表的类型定义 (静态分配方式) 
​
​
//基本操作 - 初始化一个顺序表
void InitList(SqList &L)
{
    for(int i=0;i<MaxSize;i++)
    {
        L.data[i]=0; //将所有数据元素设置为默认初始值 ,可省 
    }
    L.length=4; //顺序表初始长度为0 ,因为一开始没存元素 
} 
​
​
//基本操作 - 按位查找
int GetElem(SqList L,int i) //i表示第几个元素 
{
    if(i>=1&&i<=L.length)
    {
        printf("第%d个元素为%d \n", i , L.data[i-1] );
        return L.data[i-1]; //第i个元素的索引为i-1 
    }
    else
    {
        printf("输入的i不合法");
    }
} 
​
​
int main()
{
    SqList L; //声明一个顺序表 
    InitList(L); //初始化顺序表
    for(int i=0;i<L.length;i++)
    {
        printf("顺序表的第%d个元素为%d \n",i+1,L.data[i]);
    }
    GetElem(L,2);//按位查找 
    return 0;
}

例二:

上述图片注意:data[0]后的data[1]不是紧跟着data[0],而是在占据data[0]该有的内存后才分配data[1]

(内存大小与所占字节有关,如整型占4个字节)

malloc函数返回的存储空间起始地址要转换为与数据元素的数据类型相对应的指针,是因为

虽然指针指向的都是同一个地址,但是如果指针所指向的数据类型给定义错了,那么在访问数据元素时也会出现问题。

#include<stdio.h>
#include<stdlib.h>
#define InitSize 10 //默认的最大长度 
​
typedef struct
{
    int *data; //指示动态分配数组的指针(动态分配)
    /*变量data是一个指针,指向了malloc函数给他分配的一整片连续内存空间的起始地址*/
    int MaxSize; //顺序表的最大容量
    int length; //顺序表的当前长度 
}SeqList; //顺序表的类型定义(动态分配方式) 
​
​
void InitList(SeqList &L)
{
    //用malloc函数申请一片连续的存储空间
    L.data = (int *)malloc( InitSize*sizeof(int) ); //用最大长度乘,因为开辟的是整个空间
    L.length = 10; //一开始长度赋值为10,与InitSize(默认的最大长度 )一样 
    L.MaxSize = InitSize; 
}
​
​
//增加动态数组的长度
void IncreaseSize(SeqList &L,int len) //len是拓展的长度 
{
    int *p=L.data; //把L.data给指针p 
    L.data = (int *)malloc( (L.MaxSize+len)*sizeof(int) ); //此时申请的就是另一片新内存空间 
    for(int i=0 ; i<L.length ; i++)
    {
        L.data[i]=p[i]; //将数据复制到新区域 
    }
    L.MaxSize=L.MaxSize+len; //顺序表最大长度增加len
    free(p); //释放原来的内存空间 (长度小的)
} 
​
​
​
//基本操作 - 按位查找
int GetElem(SeqList L,int i) //i表示第几个元素 
{
    if(i>=1&&i<=L.length)
    {
        printf("第%d个元素为%d \n", i , L.data[i-1] );
        return L.data[i-1]; //第i个元素的索引为i-1 
    }
    else
    {
        printf("输入的i不合法");
    }
} 
​
​
int main()
{
    SeqList L; //声明一个顺序表-->开辟连续的内存空间 
    InitList(L); //初始化顺序表
    //...往顺序表中随便插入几个元素...
    IncreaseSize(L,5); 
    return 0;
}

二.按位查找的时间复杂度:

能实现"随机存取"是因为所有顺序表当中所有的数据元素在内存里面都是连续存放的,并且这些数据元素的数据类型相同

-->所以每个数据元素的大小一样,因此只要知道了顺序表的起始地址和数据元素的大小,就可以查询元素。


三.按值查找:

例一:

显然,结构类型(结构体)的数据元素无法直接用==符号判断,需要对当中的每个元素依次判断才行,如下:


四.按值查找的时间复杂度:


五.总结:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值