数据结构第一天:线性表----顺序表

一、线性表的概念

线性表是n个具有相同数据类型的n个有限数据元素的集合,我们把集合的长度称为线性表的表长,其中除了第一个元素(只有一个直接后驱元素)跟最后一个元素以外,其他数据元素都有一个直接前驱元素跟一个直接后驱元素。

二、线性表的基本操作

InitList(&L):

初始化一个线性表,其中“&”是C++中的引用符,跟C语言中的指针效果一样。

ListInsert(&L , i  , e):

向线性表L中的第i个位置插入一个值为e的元素。

ListDelete(&L , i , e):

删除线性表L中第i个位置的元素,并用e返回。

Empty(L):

判断线性表L是否为空。

GetElem(L, i):

按位查找线性表L中第i个元素,如果有则返回其位序,没有返回空。

LocateElem(L,e):

按值查找线性表L中与给定关键字e相等的元素。

Length(L):

求线性表的表长,并返回表长。

PrintList(L):

打印/输出线性表L。

三、顺序表

学习一个数据结构应该从三个方面去学习:逻辑结构、存储结构、算法分析

1.逻辑结构与物理结构:顺序表也是一种线性表,它是利用一组地址连续的存储单元来依次存储线性表中的数据元素,从而使得表中逻辑上相邻的两个元素在物理位置上也相邻,的第1个元素存储在顺序表的起始位置,然后依次向后存储1.2.3.4.......i.....n。其中i是元素a在顺序表中的位序。

顺序表的存储方式利用数组实现,分为:静态分配和动态分配。由于顺序表是利用数组进行存储,所以要注意数组下标与顺序表的位序(数组下标从0开始,线性表中元素的位序从1开始)。

2.算法分析:

(1)顺序表的定义:

静态分配存储结构 

#define Maxsize 10               //表最大长度
typrdef struct {
    Elemtype data[MaxSize];    //一维数组实现,存储元素
    int length;                //表长
}SqList;                       //类型定义

动态分配存储结构

#define InitSize 100               //表初始最大长度
typrdef struct {
    Elemtype *data;              //指针
    int MaxSize length;        //数组的最大长度  当前数组中的元素个数
}SqList;                       //类型定义

(2)基本操作的实现:

(1)初始化

静态分配存储实现:只需要将 length 的值赋值为0就可以了;

void InitList(SqList &L)
{
    Length = 0;                      //表长为0
}

动态分配存储实现:实质上是当初始分配的空间存储满了之后,开辟一块新的存储空间,然后将原来表中的数据复制过去,然后释放原来那一片存储空间。

void InitList(SqList &L)
{
    L.data = (Elemtype *)malloc(sizeof(Emletype)*InitSize);  //malloc函数开辟空间用指针存储地址
    MaxSize = InitList;              //最大存储空间为初始值
    Length = 0;                      //表长为0
}

 (2)插入操作

在顺序表的第i(1<=i<=L.length + 1)个位置,插入新元素e,需判断插入的位置是否合法,若合法则需要将i之后的元素向后移动一个位置。(线性表中元素的位序从1开始)

bool ListInsert(SqList &L,int i,Elemtype e)
{
    if(i<1 || i>L.length + 1)            //判断插入位序是否合法
    {
        return false;
    }
    if(L.length >= MaxSize)                //判断是否已经存满
    {
        return false;
    }
    for(int j=L.length ; j>=i ; j++)        //i与i之后的元素向后移动一个位置
    {
        L.data[j] = L.data[j - 1];        
    }
    L.data[i] = e;                        //插入新元素
    L.length ++;                            //表长加一
    return true;
}

(3)删除操作

与插入操作一样,需要判空、位序是否合法,与插入不同的是,删除元素后,第i个元素之后的元素都要向前移动一个位置

bool ListDeletd(SqList &L,int i,Elemtype e)
{
    if(i<1 || i>L.length)            //判断插入位序是否合法
    {
        return false;
    }
    if(L.length == 0 )                //判空
    {
        return false;
    }
    e = L.data[i - 1];                    //将要删除的元素赋值给e
    for(int j=i ; j<L.length ; j++)        /i之后的元素向前移动一个位置
    {
        L.data[j - 1] = L.data[j];        
    }
    L.length --;                            //表长减一
    return true;
}

(4)按值查询

int LocateElem(SqList &L,Elemtype e)
{    
    for(int i = 0 ; i<L.langth ; i++)
    {
        if(L.data[i] == e)
        {
            return i+1;            //返回位序,数组下标从0 开始,故返回i+1
        }
    }
    return 0;
}

以上只是记录本人学习的过程,有不足之处,感谢大佬的指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值