2016 - 2024

感恩一路有你

怎么让数组的元素后移一位 顺序表结点结构的定义?

浏览量:2220 时间:2023-03-25 18:30:14 作者:采采

顺序表结点结构的定义?

顺序表的定义

线性表的顺序存储也称为顺序表。它利用一组地址连续的存储单元将数据元素依次存储在一个线性表中,使得两个逻辑上相邻的元素在物理位置上也是相邻的。

假设线性表的元素类型是ElemType,线性表的顺序存储类型描述为:

#定义MaxSize 50

typedef结构

{

ElemType数据[MaxSize]

int长度

}SqList

一维数组可以静态或动态分配。在静态分配中,由于数组的大小和空间已经提前固定,一旦空间满了,添加新的数据就会溢出,导致程序崩溃甚至其他未知的异常。

在动态分配中,存储数组的空间是在程序执行过程中通过动态存储分配语句来分配的。一旦存储空间满了,就会打开另一个更大的存储区间来复制原来的元素,从而在不需要一次性分配大量空间的情况下,扩展存储数组的空间。

#定义InitSize 100

typedef结构

{

ElemType* dataPtr

int长度

int大小

}SqList

C语言的初始动态分配语句是:(elem type *)malloc(Sizeof(elem type)* initsize)。

C语言的初始化动态分配语句是:ElemType[InitSize]。

注意:动态存储不是市场存储,它也属于顺序存储。物理结构没有改变,它仍然与逻辑结构相邻,但分配的空间不再由编译器决定,而是在运行时分配。

2、序列表的特点

随机存取:通过首地址和元素序号,可以在单位时间O(1)内找到指定的元素。

存储密度高:存储密度高是因为每个节点的存储空间指的是数据元素的存储,没有额外的开销。

物理位置是相邻的:物理位置和逻辑位置是一样的,所以在插入和删除元素的时候移动大量的元素是很耗时的。这是所有与物理结构相邻的数据结构的通病。虽然访问速度很快,但是如果有频繁的添加、删除、移动等操作,效率会很低。

3.序列表上基本操作的实现

只显示了搜索、添加、删除等三个操作,其余的在线性表中比较简单,在比较复杂的链表中显示。

3.1、插入操作

在I (1 LTLTL中插入新元素e。序列表l的长度1)位。

bool list insert(SQL list ampL,int i,ElemType e)

{

if (ilt1 || igtL.lenGth 1) //判断我要插入的位置是否有效。

返回false

If (L.length gt MaxSize) //判断是否超出存储空间。

返回false

for(int j l . length j gt I j-)///将第I个元素及其后的元素向后移动一个位置。

[j] [j - 1]

[i-1] e //在第I个位置插入元素E。

L.length //序列表长度加1

返回true

}

最好的情况:在表的末尾插入(即in 1),原元素不移动,时间复杂度为O(1)。

最差情况:在头(即i1)插入时,所有元素都需要后移一位,元素后向语句执行n次,时间复杂度为O(n)。

平均情况:假设Pi(Pi1/(n-1))是在第I个位置插入一个节点的概率,在长度为n的序列表中插入一个节点时,移动节点的平均次数为n/2,时间复杂度为O(n)。

3.2.删除操作

删除序列表l中i(1ltiltL.length)位置的元素

bool list delete(SQL list ampL,int i,ElemTypeamp e)

{

If (ilt1 || igtL.length) //判断我要插入的位置是否有效。

返回false

E [i-1] //将要删除的数据保存到e。

For (int j i-1 j lt L.length j) //将第I个元素和后续元素向后移动一个位置。

[j] [j 1]

长度length-//序列表长度加1

返回true

}

时间复杂度与插入相同(平均而言,插入总是比删除每多一步操作,即插入操作,但不会引起数量级的变化,所以平均时间复杂度仍为O(N))。

3.3、按值搜索(顺序搜索)

在序列表中找到第一个元素值等于e的元素的位置,没有找到return -1。

int locate elem(SQL list L,const

倒序插入法的详细计算步骤?

插入排序法的基本操作是将一个数据插入。在有序数据中(一开始可以认为只有一个元素的序列是有序序列,即从第二个数据开始一个一个插入),从而得到一个新的增加1的有序数据。

该算法适合对少量数据进行排序,时间复杂度为O (n 2)。是一种稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含数组的所有元素,除了最后一个元素(让数组有更多的空间可以插入),第二部分只包含这个元素(也就是要插入的元素)。第一部分排序后,将最后一个元素插入排序后的第一部分。

插入排序的基本思想是:在每一步,将一条待排序的记录按照其键值的大小插入到先前排序的序列中的适当位置,直到所有记录都入。

为了避免重复比较是否出格,下面的插入排序使用 "哨兵 "。即在插入结束时,复制一份要插入的数据(a[0])的副本,一物两用,既能保存数据,又能有效防止搜索越界,反复检测是否越界。在每一轮中,比要插入的数字大的数字被一个一个地向后移动,最后一个[0]被正确地放在适当的位置。

1)存储在a [1] ~ a [n]中的数据,i2

②一[0]一[i],纪

3)如果a[j-1]gta[0],那么a[j]a[j-1],然后j-转到3)

4)a[j]a[0]

5)i若iltn,则ji,转3),否则结束。

排序后,a[1]~a[n]都是升序序列。

元素 数据 位置 序列 长度

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。