2007.08.14学习内容

线性表顺序存储结构上的基本运算

查找操作

线性表有两种基本的查找运算。

按序号查找GetData(L,i):要求查找线性表L中第i个数据元素,其结果是L.elem[i-1]L->elem[i-1]

按内容查找Locate(L,e):要求查找线性表L中与给定值e相等的数据元素,其结果是:若在表L中找到与e相等的元素,则返回该元素在表中的序号;若找不到,则返回一个“空序号”,如-1

查找运算可采用顺序查找法实现,即从第一个元素开始,依次将表中元素与e相比较,若相等,则查找成功,返回该元素在表中的序号;若e与表中的所有元素都不相等,则查找失败,返回“-1”。

算法描述

int Locate(SeqList L,ElemType e)

       /*在顺序表L中依次存放着线性表中的元素,在表中查找与e相等的元素,

       L.elem[i]=e,则找到该元素,并返回i+1,若找不到,则返回“ -1 */

{

 i=0;       /*i为扫描计数器,初值为0,即从第一个元素开始比较*/

 while((i<=L.last)&&(L.elem[i]!=e))  

       i++; /*顺序扫描表,直到找到值为key的元素,或扫描到表尾而没找到*/

 if(i<=L.last)

       return(i+);      /*若找到值为e的元素,则返回其序号*/

else

       return(-1);      /*若没找到,则返回空序号*/

}

算法       线性表的查找运算

插入操作

线性表的插入运算是指在表的第i1in+1)个位置,插入一个新元素e,使长度为n的线性表(e1,…,ei-1ei,…,en)变成长度为n+1的线性表(e1,…,ei-1ei,…,en)。

用顺序表作为线性表的存储结构时,由于结点的物理顺序必须和结点的逻辑顺序保持一致,因此我们必须将原表中位置nn-1,…,i上的结点,依次后移到位置n+1n,…,i+1上,空出第i个位置,然后在该位置上插入新结点e。当i=n+1时,是指在线性表的末尾插入结点,所以无需移动结点,直接将e插入表的末尾即可。

例如:已知线性表(4915283030425162),需在第4个元素之前插入一个元素“21”,则需要将第9个位置到第4个位置的元素依次后移一个位置,然后将“21”插入到第4个位置,如图2.3所示。要注意区分元素的序号和西湖组的下标。

算法实现:

#define OK 1

#define ERROR 0

int InsList(SeqList *L,int i,ElemType e)

       /*在顺序表L中第i个数据元素之前插入一个元素e。插入前表长n=L->last+1,i的合法取值范围是

1iL->last+2*/

{

 int k;

 if ((i<1)||(i>L->last+2))/*首先判断插入位置是否合法*/

  {

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

   return(ERROR);

  }

 if(L->last>=maxsize-1)

  {

   printf("表已满无法插入");

   return(ERROR);

  }

 for(k=L->last;k>=i-1;k--)/*为插入元素而移动位置*/

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

 L->elem[i-1]=e;/*C语言数组中,第i个元素的下标为i-1*/

 L->last++;

 return(OK);

}

算法       线性表的插入运算

可以看出,当i=L->last+2时,语句L->elem[k+1]=L->elem[k]将不会执行,因为循环的终值大于初值,此时不需要移动元素,可直接在表尾插入e。当i=1时,语句L->elem[k+1]=L->elem[k]需执行n次,即将表中已存在的n个元素依次后移一个位置才能将e插入。因此,语句L->elem[k+1]=L->elem[k]的品读与插入位置i有关。

删除操作

线性表的删除运算是指将表的第i1in)个元素删去,使长度为n的线性表(e1,…,ei-1eiei+1,…,en)变成长度为n-1的线性表(e1,…,ei-1iei+1,…,en)。

例如:线性表(491521283030425162)删除第5个元素,则需将第6个元素到第10个元素依次向前移动一个位置,如图2.4所示。

算法描述:

int DelList(SeqList *L,int i,ElemType *e)

       /*在顺序表L中删除第i个数据元素,并用指针参数e返回其值.

       i的合法取值范围是1iL->last+1*/

{

 int k;

 if ((i<1)||(i>L->last+1))-

  {

   printf("删除位置不合法");

   return(ERROR);

  }

 *e=L->elem[i-1];/*将删除的元素存放到e所指向的变量中*/

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

    L->elem[k-1]=L->elem[k];/*将后面的元素依次前移*/

 L->last--;

 return(OK);

}

 

明天将继续学习用C语言描述的数据结构。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值