数据结构第二章线性表(一)①顺序表插入并递增有序(已知顺序表L中的元素递增有序排列,设计算法将元素x插入到表L中并保持表L仍递增有序)②删除顺序表元素③顺序表逆置

本文介绍了三个关于顺序表的操作:1. 插入元素并保持递增有序;2. 删除所有指定值的元素,空间复杂度为O(1);3. 实现顺序表的就地逆置,同样保持空间复杂度为O(1)。
摘要由CSDN通过智能技术生成

1、顺序表插入并递增有序

已知顺序表L中的元素递增有序排列,设计算法将元素x插入到表L中并保持表L仍递增有序。
/*顺序表插入并递增有序
已知顺序表L中的元素递增有序排列,设计算法将
元素x插入到表L中并保持表L仍递增有序。
*/
#include <iostream>
using namespace std;

const int MaxSize=100;
typedef int DataType;
DataType data[MaxSize];
int length=0;

void insertList(DataType elem)
{
   
   int i;
   for( i=length-1;i>=0&&data[i]>elem;i--)
   data[i+1]=data[i];
   data[i+1]=elem;
   length++;

}
void show()
{
   
    for(int i=0;i<length;++i)
        cout<<data[i]<<" ";
    cout&l
算法的基本思想是在顺序表S从后向前查找,找到第一个大于或等于x的元素的位置i,然后将x插入到位置i的前面。这样可以保持线性表有序性,并且只需要移动一次数据即可完成插入操作,满足时间复杂度为O(n),空间复杂度为O(1)的要求。 以下是C语言实现的算法代码: ```c #include <stdio.h> // 假设顺序表的最大长度定义为100 #define MAXSIZE 100 typedef struct { int data[MAXSIZE]; // 存储空间基址 int length; // 当前长度 } SqList; // 插入函数,将x插入顺序表S void InsertElement(SqList *S, int x) { int i = S->length - 1; // 从顺序表最后一个元素开始向前查找 // 查找插入位置 while (i >= 0 && S->data[i] > x) { i--; // 不断向前移动,直到找到第一个小于等于x的元素 } // 从尾开始直到位置i,所有元素向后移动一位 for (int j = S->length; j > i + 1; j--) { S->data[j] = S->data[j - 1]; } S->data[i + 1] = x; // 将x插入到位置i+1 S->length++; // 顺序表长度增加1 } int main() { SqList S; S.length = 0; // 初始化顺序表长度为0 // 这里可以添加代码初始化顺序表S,并添加一些元素 // 调用插入函数,插入元素x int x = 50; // 假设要插入元素为50 InsertElement(&S, x); // 输出插入后的顺序表 for (int i = 0; i < S.length; i++) { printf("%d ", S.data[i]); } printf("\n"); return 0; } ``` 在这段代码,我们首先定义了一个顺序表的结构体`SqList`,包含一个数组`data`用于存储数据元素,以及一个整数`length`用于记录顺序表的当前长度。`InsertElement`函数实现了上述的插入算法,它接受一个顺序表的指针和要插入元素x作为参数。在`main`函数,我们初始化了顺序表,并调用了`InsertElement`函数将元素x插入顺序表,最后输出了插入后的顺序表
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值