数据结构(c语言版)( 2.2 顺序表)

1.顺序表的初始化
顺序表的初始化即构造一个空表,这对表是一个加工型的运算,因此,将L设为指针参数,首先动态分配存储空间,然后将表中last指针置为-1,表示表中没有数据元素。算法如下:

SeqList *init_SeqList( )
{ SeqList *L;
L=malloc(sizeof(SeqList));
L->last=-1;
return L;
}
设调用函数为主函数,主函数对初始化函数的调用如下:

main( )
{ SeqList *L;
L=init_SeqList( );
…
}
2.插入操作
线性表的插入是指在表的第i个位置上插入一个值为x的新元素,插入后使原表长为n的表(a1, a2, …, ai-1, ai, ai+1, …, an)成为表长为n+1的表:(a1, a2, …, ai-1, x, ai, ai+1, …, an)。i的取值范围为1≤i≤n+1。
顺序表上完成这一运算则通过以下步骤进行:
(1)将ai~an顺序向后移动,为新元素让出位置;
(2)将x置入空出的第i个位置;
(3)修改last指针(相当于修改表长),使之仍指向最后一个元素。

int Insert_SeqList(SeqList * L,int i,datatype x)
{ int j;
if ( L->last== MAXSIZE-1 )
{ printf(“表满”); return(-1); } /* 表空间已满,不能插入*/
if (i<1 || i>L->last+2) /* 检查插入位置的正确性*/
{ printf(“位置错”); return(0); }
for (j=L->last;j>= i-1;j–)
L->data[j+1]=L->data[j]; /* 结点移动 /
L->data[i-1]=x; /
新元素插入*/
L->last++; /* last仍指向最后一个元素*/
return (1); /* 插入成功,返回*/
}

在本算法中应注意以下问题。
(1)顺序表中数据区域有MAXSIZE个存储单元,所以在向顺序表中做插入时应先检查表空间是否满了,在表满的情况下不能再做插入,否则会产生溢出错误。
(2)要检验插入位置的有效性,这里i的有效范围是:1≤i≤n+1,其中n为原表长。
(3)注意数据的移动方向。
在这里插入图片描述
(4)在顺序表上做插入操作,平均需要移动表中一半的数据元素,显然其时间复杂度为O(n)

3.删除操作
线性表的删除运算是指将表中第i个元素从线性表中去掉,删除后使原表长为n的线性表(a1, a2, …, ai-1, ai, ai+1, …, an)成为表长为n-1的线性表(a1, a2, …, ai-1, ai+1, …, an),i的取值范围为1≤i≤n。
顺序表上完成这一操作的步骤如下:
(1)将ai+1~an顺序向前移动;
(2)修改last指针(相当于修改表长)使之仍指向最后一个元素。

算法:
int Delete_SeqList (SeqList *L; int i)
{ int j;
if ( i<1 || i>L->last+1) / * 检查空表及删除位置的合法性 */
{ printf (“不存在第i个元素”); return(0); }
for ( j=i;j<=L->last;j++ )
L->data[j-1]=L->data[j]; / * 向上移动 * /
L->last- -;
return(1); / * 删除成功 */
}
本算法注意以下问题:
① 删除第i个元素,i的取值为1≤i≤n,否则第i个元素不存在,因此,要检查删除位置的有效性;
② 当表空时不能做删除操作,因表空时L->last的值为-1,条件(i<1 || i>L->last+1)也包括了对表空的检查。
③ 删除ai之后,该数据已不存在,如果需要,先取出ai,再做删除。

在这里插入图片描述
顺序表中的删除操作示意图

删除算法的时间复杂度分析:与插入操作相同,删除操作的时间主要消耗在移动表中元素上,删除第i个元素时,其后面的元素ai+1~an都要向上移动一个位置,共移动了n-i个元素,所以平均移动数据元素的次数为:(n-1)/2
这说明:在顺序表上做删除操作时平均大约需要移动表中一半的元素,显然该算法的时间复杂度为O(n)。

4.按值查找
线性表中的按值查找是指在线性表中查找与给定值x相等的数据元素。在顺序表中完成该操作最简单的方法是:从第一个元素a1起依次和x比较,直到找到一个与x相等的数据元素,则返回它在顺序表中的存储下标或序号(二者差一);或者查遍整个表都没有找到与x相等的元素,返回-1。
算法:
int Location_SeqList (SeqList *L,datatype x)
{ int i=0;
while ( i<=L.last && L->data[i]!= x)
i++;
if ( i>L->last) return -1;
else return i; / *返回的是存储位置 */
}
本算法的主要运算是比较。显然比较的次数与 x 在表中的位置有关,也与表长有关。当a1=x时,比较一次成功。当an=x时比较n次成功。其平均比较次数为(n+1)/2,时间复杂度为O(n)。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值