笔记(线性表)

1.1
线性表:
由n个数据元素组成的有限序列;
(a1,a2.a3.........an)
a1为起始结点;
an-1为an的直接前驱,an+1为an的直接后驱;
an为终端节点;
数据元素的长度为表的长度;
当n为0时为空表;
例:26个英文字母组成的英文表(A,B,C,D...Z)
逻辑特征:
在非空线性表中只有一个开始节点,仅有一个直接后继。
1.2
线性表的类型定义:
抽象数据类型线性表的定义如下(很长,不写了)
基本操作有
initlist(&L)构造一个空的线性表
destorylist(&L)删除线性表
clearlist(&L)清空线性表
listempty(L)判断线性表是否为空
listlength(L)返回线性表中元素个数
getekem(L,i,&e)用e返回表L中第i个数据元素
locateelem(L,e,compare())线性表已经存在,返回L中第一个与e满足compare()的数据元素的位序,若不存在则返回0
priorelem(L,cur_e,&pre_e)若cur_e时L的数据元素,且不是第一个,则用pre_e返回它的前驱
nextelem(L,cur_e,&next_e)若cur_e是L的数据元素,且不是最后一个,则用next_e返回他的后继
listinsert(&L,i,e)在L的第i个位置之前插入新的元素e,L的长度加1
listdelete(&L,i,&e)、删除表中第i个数据元素,长度减1
listtraverse(&L,visited())遍历表中每个元素并进行visited()
这些运算是逻辑结构上定义的运算,至于细节,需要确定了存储结构之后才考虑
接下来就是线性表的存储
1.3
两种基本的存储结构:顺序存储结构和链式存储结构
线性表的顺序表示和实现1
顺序存储定义:把逻辑上相邻的数据元素存储在物理上相邻的存储单元的存储结构。
线性表顺序存储结构占用一片连续的存储空间,也可以理解成没有间断点
假设线性表的每个元素占l个存储单元,则第i+1个数据元素的存储位置和第i个存储位置之间满足关系
LOC(ai+1)=LOC(ai)+l;(公式,由顺序存储结构定义得出的推论)
可以用一维数组表示顺序表。
线性表长可变,数组长度不可动态定义,创建线性表代码实现:

#define maxsize 20
typedef int elemtype;
typedef struct {
	elemtype data[maxsize];
	int length;
}Sqlist;

接下来是对于线性表的各种操作

获得元素操作:对于线性表的顺序存储结构来说,获取元素只要在数组下标范围内,将元素值返回即可。代码如下:

#define OK 1

#dedine ERROR 0

typedf int Status;

Status GetElem(Salish L,int i,Elemtype *e)

{

    if(L.length==0||i<1||i>L.length)

        return ERROR;

*e=L.data[i-1];

return OK;

}

插入操作:我们可以理解成排队,插入一个元素,这是后面的元素都要往后移一位,包括原先下标表示的值,并且表长加1。

代码如下:

Status ListInsert(Salish *L,int i,Elemtype e)

{

    int k;

    if(L->next==MAXSIZE)

        return ERROR;

    if(i<=L->length)

    {

        for(k=L->length-1;k>=i-1;k--)

             L->data[k+1]=L->data[k];

    }

    L->data[i-1]=e;

    L->length++;

    rerurn OK;

}

删除操作:只要找到删除的元素的位置下标,然后令从下标+1的元素开始,全部往前一位即可,然后表长-1。代码如下

Status ListDelete(Salish *L,int i,Elemtype *e){

    int k;

    if(L->length==0)

         return ERROR;

    if(i<1||i>L->length)

        return ERROR;

    *e=L->data[i-1];

    if(i<L->length)

{

    for(k=i;k<L->length;k++)

        L->data[k-1]=L->data[k];

}

L->length--;

return OK;

}

 

 

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值