线性表ADT实现含文档

线性表ADT及其实现(顺序储存)

1, 什么是线性表?

     线性表是具有相同特性的数据元素的一个有限序列。该序列中所含元素的个数叫线性表的长度,用length表示。当length=0时表表示线性表的元素个数为零。线性表的顺序存储结构称为顺序表,是把线性表中的所有元素按照其逻辑顺序一次存储到从计算机存储器中指定存储位置开始的一块连续的存储空间中。

2,线性表的ADT描述

      ADT List

{

数据对象:D={ ai | 0≤i≤length,length≥0,ai为int类型 }

数据关系:R={<ai,ai+1>|ai,ai+1∈D,i=0,2………,length-1}

基本运算:(1)初始化线性表InitList(p):构造一个空的线性表p,p为struct类型的指针。

         (2)销毁线性表DestroyList(p):释放线性表p占用的内存空间

         (3)判线性表是否为空表ListEmpty(p):若p为空表,则返回真,否则返回假

         (4)求线性表的长度ListLength(p):返回p中元素个数

         (5)输出线性表DispList(p):当线性表p不为空时,顺序显示p中各节点的值域

         (6)求线性表L中指定位置的某个数据元素GetElem(p,i,&e):用e返回p中第 i 个元素的值

         (7)查找元素LocateElem(p,e):返回线性表p中第1个与e相等的序号,找不到返回0

         (8)插入元素ListInsert(p, i, &e):在线性表p中的第i个位置插入元素e;

         (9)删除元素ListDelete(p, i, &e):在线性表p中删除第i个元素,用e返回删除的值;

}

3,线性表的基本操作

typedef struct

{

    int list[10001];

    int length;

}SQlist;

//构造一个空的线性表

SQlist* InitList(SQlist* pr)

{

    pr = (SQlist*)malloc(sizeof(SQlist));//申请线性表类型数据的内存空间

    pr->length = 0;//初始化元素个数为零

    return pr;

}

//释放线性表p占用的内存空间

void destorylist(SQlist* pr)

{

    free(pr);

}

//判线性表是否为空表, 若p为空表,则返回真,否则返回假

int listempty(SQlist* pr)

{

    if (pr->length == 0)

    {

       return true;

    }

    else

    {

       return false;

    }

}

//求线性表的长度,返回p中元素个数

int listlength(SQlist* pr)

{

    return pr->length;

}

//输出线性表,当线性表p不为空时,顺序显示p中各节点的值域

void Displist(SQlist* pr)

{

    for (i = 0; i < pr->length; i++)

    {

       printf("%d ", pr->list[i]);

    }

}

//求线性表L中指定位置的某个数据元素,用e返回p中第 i 个元素的值

int GetElem(SQlist* pr, int i, int& e)

{

    return e = pr->list[i - 1];

}

//查找元素,返回线性表p中第1个与e相等的序号,找不到返回0

int locateElem(SQlist* pr, int e)

{

    for (i = 0; pr->list[i] != e; i++);

    if (i == pr->length)

    {

       return 0;

    }

    else

    {

       return i+1;

    }

}

//插入元素,在线性表p中的第i个位置插入元素e;

void Listinsert(SQlist* pr, int i, int& e)

{

    if (i<0 || i>pr->length - 1)//插入位置不合法时,进行反馈

    {

       printf("插入位置不合法");

    }

    for (j = pr->length; j >= i; j--)

    {

       pr->list[j] = pr->list[j - 1];//将第i个位置及其第i个数据往后移位

    }

    pr->list[i-1] = e;//插入数据e

    pr->length++;//实时更新线性表中元素个数

}

//删除元素,在线性表p中删除第i个元素,用e返回删除的值;

void listdelete(SQlist* pr, int i, int& e)

{

    e = pr->list[i - 1];

    for (j = i - 1; j < pr->length - 1; j++)

    {

       pr->list[j] = pr->list[j + 1];//将第i位置的数据进行覆盖,且将第i位置以后的数据往前补位

    }

    pr->length--;//实时更新元素个数

}

3,程序运行结果及截图

  • listempty(p)的运算结果:
  • listlength(p)的运算结果:
  • GetElem的运算结果:
  • locateElem(p,1)的运算结果:
  • listInsert(p,4,5)的运算结果:
  • listDelete(p,3,e)的运算结果:

4,学习心得

            对于线性表的基本运算时,要注意线性表元素的个数,特别是在进行元素的插入和删除运算时,要记得更新元素的个数,否则在进行后续操作时,线性表的length将于实际线性表元素不符,将会产生bug,后续操作将无法得到正确的结果。此外,在进行插入或删除时,要注意插入元素的合法性,应在对应函数功能入口处对参数的合法性进行检验,增强程序的健壮性。

5,附源代码(无)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值