初学者学数据结构(二)

      浅谈线性表的逻辑结构和顺序存储结构

                                 线性表的逻辑结构

线性表是n个数据类型相同的元素组成的数据结构。

线性表中的数据有以下几个特点:

1.元素的类型相同;

2.元素的个数有限;

3.除了第一个元素外,每个元素都有且仅有一个被称为直接前驱的节点;

4.除了最后一个元素外,每个元素都有且仅有一个被称为直接后继的节点;

                   线性表的顺序存储结构

线性表的顺序存储是指用一组连续的存储空间存储线性表的各个数据元素,其特点是物理位置相邻。采用顺序存储结构的线性表称为顺序表。

假设有n个元素,每个元素占m个内存单元,第一个元素的存储地址为Loca1),称为基地址,第i个元素的存储地址记为Locai),计算方法:

Loc(ai) = Loc(a1)+(i-1)*m

所以只要知道基地址和每个元素所占的存储单元大小,就可以快速算出任何一个元素的存储地址,从而可以对表中数据元素的随机存取,所以顺序表是一种随机存取结构。

数组就是采用顺序存储结构表示,所以可以用一维数组类型来表述顺序表,除了数组,顺序表还应有长度属性。

ElemType data[];

int length;

ElemType泛指某种数据类型,具体类型视情况而定。length用来记录当前线性表的当前长度。为了把lengthdata数组联系起来,可以把其定义为结构体类型,如下:

                      #define MaxSize//数组的最大长度

                      typedef struct

                      {

                      ElemType data[MaxSize];

                        int length;

                      } SeqList

                   顺序表的基本操作

插入

顺序表的插入是指在指定位置插入一个元素,并把数组长度加一。

该运算的主要操作是将要插入位置后的元素向后移一个单位,用来空出要插入元素的位置。

算法如下:

void InsertListSeqList  *LElemType xint i

/* 因为要对表中元素进行修改,所以传人顺序表的指针型参数,x为要插入的元素,i为要插入的位置*/

{

     int k;

      If((i<1)||(i>L->length+1))

     {

          printf(非法输入);

          return;  

     }

     /*i的合法范围应在1和插入之前长度加一之间*/

     if(L->length>=MaxSize)

     {

      printf(空间溢出)

         return;

     }

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

     {

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

     }

     /*i位置后的元素后移*/

     L->data[i-1] = x;  //插入

     L->length++     //表的长度加一

删除

顺序表的删除操作是指在指定位置删除一个元素,并把数组长度减一。

该运算的主要操作是将要插入位置后的元素向前移一个单位,用来补上删除元素的位置。

算法如下:

void DeleteListSeqList  *Lint i

{

     int k;

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

     {

          printf(非法输入);

          return;  

     }

     /*i的合法范围应在1和删除之前长度之间*/

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

     {

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

     }

     /*i位置后的元素前移*/

     L->length--     //表的长度减一

查找

在顺序表中查找某元素,就是将该元素与表中一一进行比较,直到遇到第一个相等的元素,返回下标。若没有,返回-1

算法如下:

int LocatSeqSeqList  LElemType x

{

     int i;

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

       {

      If(L.data[i]==x)

          return i;

     }

     return -1;

此算法不牵扯如何数据修改,所以不用传指针。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值