顺序表的相关知识

顺序表的基本操作

(1)顺序表的初始化

顺序表的初始化就是把顺序表 初始化为空的顺序表,只需把顺序表的长度length置为0即可;

void InitList(PSeqList L)
{
    if (L == NULL)
    {
        return;
    }
    L->length = 0;
}

(2)求顺序表的长度

顺序表的长度就是就顺序表中的元素的个数,由于在插入和删除操作中都有对数据表的长度进行修改,所以求表长只需返回length的值即可;

int LengthList(PSeqList L)
{
    if (L == NULL)
    {
        return 0;
    }
    return L->length;
}

(3)按序号查找

查找顺序表中第i个元素的值(按序号查找),如果找到,将将该元素值赋给e。查找第i个元素的值时,首先要判断查找的序号是否合法,如果合法,返回第i个元素对应的值。

int GetData(PSeqList L, int i)
{
    if (L->length < 1 || (L->length > LengthList(L)))
    {
        return 0;
    }
    //数据元素的序号从1开始,数组下表从0开始,第i个元素对应的数组下标为i-1;
    return L->data[i - 1];
}

(4)插入操作

在数据表的第i个位置插入元素,在顺序表的第i个位置插入元素e,首先将顺序表第i个位置的元素依次向后移动一个位置,然后将元素e插入第i个位置,移动元素要从后往前移动元素,即:先移动最后一个元素,在移动倒数第二个元素,依次类推;插入元素之前要判断插入的位置是否合法,顺序表是否已满,在插入元素之后要将表长L->length++;
 

int InsList(PSeqList L, int i, DataType e)
{

    //判断插入位置是否合法
    if (i < 1 || L->length >(LengthList(L) + 1))
    {
        printf("插入位置不合法!\n");
        return 0;
    }
    //判断顺序表是否已满
    else if (L->length >= ListSize)
    {
        printf("顺序表已满,不能插入!\n");
        return 0;
    }
    else
    {
        for (k = i; k <= L->length; k--)
        {
            L->data[k + 1] = L->data[k];
        }
        L->data[i - 1] = e;
        L->length++;   //数据表的长度加1
        return 1;
    }
    return 0;
}

(5) 删除操作

       删除表中的第i个元素e,删除数据表中的第i个元素,需要将表中第i个元素之后的元素依次向前移动一位,将前面的元素覆盖掉。移动元素时要想将第i+1个元素移动到第i个位置,在将第i+2个元素移动i+1的位置,直到将最后一个元素移动到它的前一个位置,进行删除操作之前要判断顺序表是否为空,删除元素之后,将表长L->length--;
 

int DelList(PSeqList L, DataType i, DataType* e)
{
    if (L->length < 1)
    {
        printf("表为空!\n");
        return  0;
    }
    *e = L->data[i - 1];
    for (k = i; k < L->length; k++)
    {
        L->data[k - 1] = L->data[k];
    }
    L->length--;
    return *e;
}

(6)按内容查找

       查找数据元素e在表中的位置,可以从表头开始一直遍历表中元素,如果找到与要查找元素e相等的元素,则返回元素在表中的位置,数组下标从0开始,则元素在表中对应的位置序号值应为对应数组下标加1,没有找到则返回0;

int Locate(PSeqList L, DataType e)
{
    for (k = 0; k < L->length; k++)
    {
        if (L->data[k] == e)
        {
            //k为e对应的数组下标,在表中对应序号应为k+1
            return k + 1;
        }
    }
    return 0;
}

 

# 题目重述 给定一个含有 $n$ 个整数的递增顺序表,删除所有值在区间 $[min, max]$ 内的元素(包括端点)。若顺序表为空或 $min \geq max$,则输出 `-1` 并退出;否则输出删除后的剩余元素,以空格分隔。 --- # 详解 本题要求使用**顺序表的基本知识**进行编程实现。顺序表是线性表的顺序存储结构,其特点是逻辑上相邻的元素在物理位置上也相邻,通常用数组实现。 尽管题目中提到“不用上面的输入输出结构代码”,但我们仍需基于**顺序表的核心操作思想**来设计程序:即通过数组和长度变量管理数据,并在连续空间中完成插入、删除等操作。 ### 核心步骤: 1. 定义一个结构体表示顺序表(含数组、当前长度); 2. 输入数据并初始化顺序表; 3. 判断合法性:表空或 $min \geq max$ → 输出 `-1`; 4. 遍历顺序表,将不在 $[min, max]$ 区间内的元素保留; 5. 更新顺序表长度,输出结果。 --- ### 正确实现代码(基于顺序表结构): ```c #include <stdio.h> #define MAXSIZE 1000 // 最大容量 // 顺序表结构体定义 typedef struct { int data[MAXSIZE]; // 存储元素的数组 int length; // 当前元素个数 } SqList; int main() { SqList L; // 输入元素个数 scanf("%d", &L.length); // 若顺序表为空,输出 -1 if (L.length == 0) { printf("-1\n"); return 0; } // 输入顺序表元素(递增) for (int i = 0; i < L.length; i++) { scanf("%d", &L.data[i]); } int min, max; scanf("%d %d", &min, &max); // 判断 min 和 max 是否合理 if (min >= max) { printf("-1\n"); return 0; } // 删除 [min, max] 范围内的元素:采用前移覆盖法 int k = 0; // 记录保留元素的位置 for (int i = 0; i < L.length; i++) { if (L.data[i] < min || L.data[i] > max) { L.data[k++] = L.data[i]; } } L.length = k; // 更新长度 // 输出删除后剩余的元素 for (int i = 0; i < L.length; i++) { printf("%d ", L.data[i]); } printf("\n"); return 0; } ``` --- ### 示例分析: 输入: ``` 5 1 2 3 4 5 2 4 ``` - 删除满足 $2 \leq x \leq 4$ 的元素:2, 3, 4; - 剩余:1, 5; - 输出:`1 5 ` 当输入为: ``` 0 2 4 ``` → 输出 `-1` 或输入: ``` 3 1 2 3 5 3 ``` → 因为 $min=5$, $max=3$, $min > max$ → 输出 `-1` --- # 知识点 - **顺序表的结构定义**:使用结构体封装数组与长度,体现数据的逻辑结构与物理存储。 - **元素删除机制**:通过遍历筛选非目标元素并前移,实现区间删除,保持存储连续性。 - **边界条件处理**:对空表及不合理参数(如 $min \geq max$)提前判断,保障程序正确性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值