数据结构实验1.2: 顺序表的基本运算

news2025/5/19 9:05:00

文章目录

  • 一,问题描述
  • 二,基本要求
  • 三,算法分析
    • (1)插入算法
    • (2)删除算法
  • 四,参考程序
  • 五,运行效果


一,问题描述

创建一个顺序表,编程实现顺序表的下列基本运算:

  1. 在顺序表的第i个位置上插入m个新元素;
  2. 删除顺序表中元素值在x到y之间的所有元素。

二,基本要求

  1. 采用动态分配方式设计顺序表的存储结构;
  2. 插入算法必须考虑存储空间的动态扩充;插入和删除两种算法均必须满足时间复杂度为O(n),空间复杂度为O(1);
  3. 根据插入和删除的算法分析,请在参考程序中的下划线处填上适当的子句,完善参考程序;
  4. 设计测试数据,上机调试、测试参考程序,保存和打印测试结果,对测试结果进行分析,重点分析两种算法的性能是否达到第2条的要求;
  5. 运行效果图。
    在这里插入图片描述

三,算法分析

(1)插入算法

  1. 判断i、m的合法性;
  2. 判断L.length+m是否大于L.listsize,是则扩充空间;
  3. 将L中的第n到第i个元素逆序向后移动m个位置;
  4. 在位置i处插入m个新元素。(可以是已知数组,也可键盘输入);
  5. 调整L的参数,算法结束。

(2)删除算法

在线性表中设置两个初值为0的下标变量i和j,其中,i为比较元素的下标,j为赋值元素的下标。依次取线性表中下标为i的元素与x和y比较,假若是x到y之外的元素,则赋值给下标为j的元素。这种算法比删除一个元素后立即移动其后面的元素的效率高得多。

四,参考程序

#define MAXSIZE 10        //空间初始分配量
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>

typedef int Status;
typedef int ElemType;     //将元素类型定义为整型
typedef struct {
    ElemType* elem;     //存储空间基址
    int length;		   //当前顺序表中实际元素的个数
    int listsize;	       //当前分配的存储容量
} SqList;

Status  CreatList(SqList* L) {		// 建立有n个元素的顺序表
    int i;
    do {							// 若表的长度输入不合法,则循环输入
        printf("请输入元素个数:");
        scanf("%d", &L->length);
    } while (L->length <= 0 || L->length > MAXSIZE);
    L->elem = (ElemType*)malloc(MAXSIZE * sizeof(ElemType));
    if (!L->elem) return ERROR;
    for (i = 0; i < L->length; i++) {		// 依次输入n个元素
        printf("请输入第%d个元素值=>", i + 1);
        scanf("%d", &L->elem[i]);
    }
    return OK;
}

Status  InsertList(SqList* L, int i, int m, ElemType* E) {
    // 在顺序表L的第i个位置上插入m个新元素E[]
    if (i < 1 || i > L->length + 1 || m <= 0 || L->length + m > MAXSIZE) // 进行i、m的合法性判断
        return  ERROR;
    ElemType* p;
    int  j;
    if (L->length + m > L->listsize) {	//若顺序表空间不够,则需扩充空间
        p = (ElemType*)realloc(L->elem, (L->length + m) * sizeof(ElemType));
        if (!p) exit(OVERFLOW);
        L->elem = p;
        L->listsize = L->length + m;
    }
    for (j = L->length - 1; j >= i - 1; --j) 			// 移动元素
        L->elem[j + m] = L->elem[j];
    for (j = 0; j < m; j++)					// 插入元素
        L->elem[i + j - 1] = E[j];
    L->length = L->length + m;  // 修改表的长度
    return OK;
}// InsertList 

Status  DeleteList(SqList* L, int x, int y) {
    // 在顺序表L中删除其值介于x到y之间的所有元素
    if (x > y) return ERROR;
    int i, j;          // 临时变量j用于当前元素i前移的位置
    for (i = j = 0; i < L->length; i++)
        if (L->elem[i] >= x && L->elem[i] <= y)
            j++;
        else
            L->elem[i - j] = L->elem[i];  // 前移j个位置
    L->length -= j;
    return OK;
}

void PrintList(SqList L) {		// 输出顺序表中所有元素值
    int i;
    printf("顺序表中有%d个元素:\n", L.length);
    for (i = 0; i < L.length; i++)
        printf("%4d", L.elem[i]);
    printf("\n");
}

int main()
{
    SqList  L;
    int  i, m = 3;						// 插入点及插入元素个数
    ElemType  E[] = { 23,24,25 };			// 待插入的新元素
    ElemType  x, y;
    printf("(1) 建立有n个元素的顺序表 ……\n");
    if (!CreatList(&L)) { printf("创建顺序表失败!\n");  return 0; }
    printf("当前顺序表如下:\n");
    PrintList(L);

    printf("(2) 在顺序表第i个位置上插入m个新元素……\n");
    printf("请输入插入位置i:");
    scanf("%d", &i);
    if (!InsertList(&L, i, m, E))
        printf("插入失败!\n");
    else {
        printf("插入成功!插入后的顺序表如下:\n");
        PrintList(L);
    }

    printf("(3) 在顺序表中删除其值介于x到y之间的所有元素……\n");
    printf("请输入被删元素下限值x:");
    scanf("%d", &x);
    printf("请输入被删元素上限值y:");
    scanf("%d", &y);
    if (!DeleteList(&L, x, y))
        printf("参数错误,删除失败!");
    else {
        printf("删除后的顺序表如下:\n");
        PrintList(L);
    }
    return 0;
}

五,运行效果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2326733.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【QT】QT中的信号与槽

QT中的信号与槽 一、信号与槽函数的作用二、如何关联信号与槽函数1、借助集成开发环境&#xff0c;右键转到槽函数示例代码&#xff1a; 2、调用connect函数手动关联信号与槽函数 三、扩展四、总结信号与槽的特点1、一个类如果要使用信号以及槽函数&#xff0c;那么该类的定义中…

使用Python爬虫获取1688商品(按图搜索)接口

一、引言 随着电商行业的不断发展&#xff0c;消费者对商品搜索的效率和准确性要求越来越高。1688作为国内领先的B2B电商平台&#xff0c;提供了丰富的商品搜索功能&#xff0c;其中按图搜索功能&#xff08;类似于淘宝的拍立淘&#xff09;极大地提升了用户的购物体验。本文将…

AI Agent拐点已至,2B+2C星辰大海——行业深度报告

大家好&#xff0c;我是吾鳴。 今天吾鳴要给大家分享一份由开源证券出品的关于AI Agent的报告&#xff0c;报告从AI Agent商业化应用、C端B端应用与布局&#xff0c;投资建议等方向介绍2025AI Agent新元年。报告一共28页PDF&#xff0c;文末有完整版下载地址。 内容摘要 2025年…

【CSS】- 表单控件的 placeholder 如何控制换行显示?

表单控件的 placeholder 如何换行展示&#xff1f; HTML 中&#xff0c;<textarea> 元素的 placeholder 属性默认情况下不支持换行。不过&#xff0c;可以通过以下几种方法来实现换行效果&#xff1a; 模版字符串 模板字符串可以轻松地创建多行字符串&#xff0c;而不…

node.js、npm相关知识

Node.js 是一个基于 Chrome V8 JavaScript 引擎 构建的开源、跨平台的 JavaScript 运行时环境&#xff0c;主要用于服务器端编程。它允许开发者使用 JavaScript 编写高性能的后端服务&#xff0c;突破了 JavaScript 仅在浏览器中运行的限制。 npm&#xff08;Node Package Man…

基于HTML5和CSS3实现3D旋转相册效果

基于HTML5和CSS3实现3D旋转相册效果 这里写目录标题 基于HTML5和CSS3实现3D旋转相册效果项目介绍技术栈核心功能实现原理1. HTML结构2. CSS样式设计2.1 基础样式设置2.2 容器样式2.3 图片样式 3. JavaScript实现4. 交互功能实现4.1 触摸和鼠标拖拽4.2 播放控制 项目亮点技术难点…

上市电子制造企业如何实现合规的质量文件管理?

浙江洁美电子科技股份有限公司成立于2001年&#xff0c;是一家专业为片式电子元器件(被动元件、分立器件、集成电路及LED)配套生产电子薄型载带、上下胶带、离型膜、流延膜等产品的国家高新技术企业&#xff0c;主要产品有分切纸带、打孔经带、压孔纸带、上下胶带、塑料载带及其…

vscode中的【粘滞滚动】的基本概念和作用,关闭了以后如何开启

1、粘滞滚动的基本概念和作用 ‌VSCode中的“粘滞”功能主要是指编辑器在滚动时的一种特殊效果&#xff0c;使得编辑器在滚动到某个位置时会“粘”在那里&#xff0c;而不是平滑滚动到底部或顶部。‌ 粘滞滚动的基本概念和作用 粘滞滚动功能可以让用户在滚动时更直观地看到当前…

IDEA如何设置以新窗口打开新项目

在 IntelliJ IDEA 中设置以新窗口打开新项目&#xff0c;可以通过以下两种方式实现&#xff1a; 方法 1&#xff1a;通过对话框提示选择新窗口 打开项目时&#xff1a; 当通过 File > Open&#xff08;或欢迎界面点击 Open&#xff09;选择新项目时&#xff0c;IDEA 会弹出对…

【含文档+PPT+源码】基于微信小程序的社交摄影约拍平台的设计与实现

项目介绍 本课程演示的是一款基于微信小程序的社交摄影约拍平台的设计与实现&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系…

Springboot集成Dubbo和Zookeeper框架搭建

目录 1.搭建环境 2.搭建步骤 3.效果展示 4.注意项 1.搭建环境如下图所示&#xff1a; 2.搭建步骤 2.1 目标概述 一共三个服务,一个公共接口服务,一个提供者服务,一个消费者服务。最终以浏览器或者postman查询接口,实现订单信息回显。最终项目结构如图所示&#xff1a; 2.2 …

发票管理自动化-发票查验接口让财务告别繁琐的核验流程

发票管理的效率与准确性直接影响着企业运营的顺畅性&#xff0c;在过去&#xff0c;财务人员查验发票时&#xff0c;需手工输入发票代码、号码、日期、金额、验证码等信息一张一张进行核验。整个过程不仅操作繁琐&#xff0c;而且极易出错。若遇到验证码难以辨认的情况&#xf…

基于modbusTcp连接Modbus Slave本地模拟服务通讯(C#编写ModbusTcp类库)(一)

C#编写ModbusTcp类库,模拟plc进行本地通信测试 Modbus是一个应用层协议,常用于工业自动化设备之间的通信,主要有两种传输方式:RTU和TCP。 常见的功能码包括读取线圈(01)、读取离散输入(02)、读保持寄存器(03)、读输入寄存器(04)、写单个线圈(05)、写单个寄存器(…

IS-IS:单区域集成配置与多区域集成配置

一、IS-IS概述 IS-IS&#xff08;Intermediate System to Intermediate System&#xff09; 是一种链路状态内部网关协议&#xff08;IGP&#xff09;&#xff0c;设计用于自治系统&#xff08;AS&#xff09;内部的路由选择。最初由ISO为OSI模型的无连接网络服务&#xff08;…

API 安全之认证鉴权

作者&#xff1a;半天 前言 API 作为企业的重要数字资源&#xff0c;在给企业带来巨大便利的同时也带来了新的安全问题&#xff0c;一旦被攻击可能导致数据泄漏重大安全问题&#xff0c;从而给企业的业务发展带来极大的安全风险。正是在这样的背景下&#xff0c;OpenAPI 规范…

[测试] Google Test | 主流的 C 测试框架

目录 GoogleTest 2. 准备工作 3. 测试 4.怎么用 Attention is All You Need 写项目代码的时候 边写边测试 非常重要&#xff0c;这样可以帮助我们减少很多的问题。 这篇文章后面 主要以 GoogleTest 为例&#xff0c;进行介绍最近找了些 gtest 相关的资料,学习了下.后面主要…

OpenCV 图形API(3)高层次设计概览

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 描述 G-API 是一个异构框架&#xff0c;提供了统一的 API 来使用多个支持的后端编程图像处理流水线。 关键的设计理念是在指定使用哪些内核和设备时保持流…

碰一碰发视频网页版本开发的源码搭建指南

引言 在数字化信息快速传播的时代&#xff0c;近场通信&#xff08;NFC&#xff09;技术为信息交互带来了新的便捷方式。通过网页版本实现碰一碰发视频功能&#xff0c;能够让用户在浏览器环境中轻松实现视频分享&#xff0c;拓展了视频传播的途径。本文将详细介绍碰一碰发视频…

【含文档+PPT+源码】基于Python爬虫二手房价格预测与可视化系统的设计与实现

项目介绍 本课程演示的是一款基于Python爬虫二手房价格预测与可视化系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 带你从零开始部署运行本套系统 该项…

Redis-16.在Java中操作Redis-Spring Data Redis使用方式-操作有序集合类型的数据

一. 操作有序集合类型的数据 package com.sky.test;import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.redis.core.*;imp…