C数据结构与算法——顺序表 应用

news2024/10/7 11:25:32

实验任务

(1) 掌握顺序表结构及其 C 语言实现;
(2) 掌握插入、删除等基本算法;
(3) 掌握顺序表的基本应用(将两个有序线性表合并为一个有序表)。

实验内容

  • 使用 C 语言实现顺序表的类型定义与算法函数;
  • 编写 main()函数,合理调用函数实现以下功能:
    • 创建 3 个顺序表 L1、L2 和 L3;
    • L1 数据内定(斐波拉契序列前 2-11 项):1、2、3、5…、55、89;
    • L2 数据随机产生,共 10 个,满足:
      • 第 1 个数为 4,其后每个数字比其前趋随机增加1~9
    • 分别显示 L1 和 L2 的内容;
    • 有序合并 L1 和 L2 到 L3 中;
    • 显示 L3 的内容;
    • 随机删除 L3 中第 1~10 个元素,显示 L3 的内容;
    • 随机产生 1 个[1, 100]之间的数字插入到 L3 中并保持有序,显示L3的内容。

实验源码

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define MAXSIZE 100
#define ERROR 0
#define OK 1

typedef int ElemType;

typedef struct {
    ElemType *elem;
    int length;
} SqList;

int InitList(SqList *list); // 顺序表的初始化

void Fibonacci(SqList *list, int length); // 斐波那契序列

void RandomNumber(SqList *list, int num); // 1-9随机数前趋叠加

void Combine(SqList *list1, SqList *list2, SqList *list3, SqList *temp); // 合并2个顺序表到1个

int DelSqList(SqList *list, int randNum); // 随机删除元素 1~10

int Insert(SqList *list, ElemType randNum, SqList *temp); // 插入某个元素,并且按顺序排序

int PrintSqList(SqList *list); // 输出顺序表

void BubbleSort(SqList *list); // 冒泡排序 好写,但效率不高

// 归并算法:空间换时间 稳定
void mergeSort(SqList *list, int left, int right, SqList *temp); // 归并排序:归分

void merge(SqList *list, int left, int mid, int right, SqList *temp); // 归并排序:分治

int InitList(SqList *list) {
    list->elem = (ElemType *) malloc(sizeof(SqList) * MAXSIZE);
    if (list->elem == NULL) {
        exit(ERROR);
    }
    list->length = 0;
    return OK;
}

void Fibonacci(SqList *list, int length) {
    int num1 = 0;
    int num2 = 1;
//    for (int i = 0; i < length; i++) {
//        if ((i + 1) % 2 != 0) { // 代码冗余了,直接一次循环赋值两次即可
//            num1 += num2;
//            list->elem[i] = num1;
//        } else {
//            num2 += num1;
//            list->elem[i] = num2;
//        }
//    }
    for (int i = 0; i < length;) {
        num1 += num2;
        list->elem[i++] = num1;
        num2 += num1;
        list->elem[i++] = num2;
    }
    list->length = length;
}

void RandomNumber(SqList *list, int num) {
    list->elem[0] = 4;
    srand(time(NULL));
    for (int i = 1; i < num; i++) {
        list->elem[i] = list->elem[i - 1] + rand() % 9 + 1; // max-min+1 ~ min
    }
    list->length = num;
}

void Combine(SqList *list1, SqList *list2, SqList *list3, SqList *temp) {
    int i = 0;
    for (; i < list1->length; i++) {
        list3->elem[i] = list1->elem[i];
    }
    for (int j = 0; j < list2->length; j++, i++) {
        list3->elem[i] = list2->elem[j];
    }
    list3->length = list1->length + list2->length;
    // 这里需要用到一个排序算法
    temp->length = list3->length;
    mergeSort(list3, 0, list3->length - 1, temp);
}

int DelSqList(SqList *list, int randNum) {
    if (randNum < 1 || randNum > 10 || list->length == 0) {
        exit(ERROR);
    }
    for (; randNum < list->length; randNum++) {
        list->elem[randNum - 1] = list->elem[randNum];
    }
    list->elem[--randNum] = 0; // 这里有一个BUG,由于申请了100个空间,所有没有用到的空间也有值且为0
    list->length--;
    return OK;
}

int Insert(SqList *list, ElemType randNum, SqList *temp) {
    if (randNum < 1 || randNum > 100 || list->length == 0) {
        exit(ERROR);
    }
    list->elem[list->length] = randNum;
    list->length++;
    //  这里需要用到一个排序算法
    temp->length = list->length;
    mergeSort(list, 0, list->length - 1, temp);
    return OK;
}

int PrintSqList(SqList *list) {
    if (list->length == 0) {
        exit(ERROR);
    }
    for (int i = 0; i < list->length; i++) {
        printf("%2d", list->elem[i]);
        if ((i + 1) % 10 == 0 && i != list->length - 1) {
            printf("\n    ");
        }
        if (i != list->length - 1) {
            printf(" -> ");
        }
    }
    printf("\n");
    return OK;
}

//void BubbleSort(SqList *list) { // 冒泡排序,弃用
//    ElemType temp;
//    for (int i = 0; i < list->length - 1; i++) {
//        int count = -1;
//        for (int j = 0; j < list->length - 1 - i; j++) {
//            if (list->elem[j] > list->elem[j + 1]) {
//                temp = list->elem[j];
//                list->elem[j] = list->elem[j + 1];
//                list->elem[j + 1] = temp;
//                count++;
//            }
//        }
//        if (count == -1) {
//            break;
//        }
//    }
//}

void mergeSort(SqList *list, int left, int right, SqList *temp) {
    if (left < right) {
        int mid = (left + right) / 2;
        // 左
        mergeSort(list, left, mid, temp);
        // 右
        mergeSort(list, mid + 1, right, temp);
        // 合并
        merge(list, left, mid, right, temp);
    }
}

void merge(SqList *list, int left, int mid, int right, SqList *temp) {
    int i = left;
    int j = mid + 1;
    int t = 0;
    while (i <= mid && j <= right) {
        if (list->elem[i] <= list->elem[j]) { // 左
            temp->elem[t++] = list->elem[i++];
        } else { // 右
            temp->elem[t++] = list->elem[j++];
        }
    }
    // 多余元素情况
    while (i <= mid) {
        temp->elem[t++] = list->elem[i++];
    }
    while (j <= right) {
        temp->elem[t++] = list->elem[j++];
    }
    // 拷贝元素到原数组
    t = 0;
    int tempLeft = left;
    while (tempLeft <= right) { // 有几个元素拷贝几个原则
        list->elem[tempLeft++] = temp->elem[t++];
    }
}

/**
 * <h2>顺序表实验</h2>
 * @return 0
 */
int main() {

    SqList L1, L2, L3, tempSL;
    if (InitList(&tempSL) != 1) {
        printf("tempSL初始化失败!!!\n");
    }

    printf("=========================== 顺序表编程实践 ===========================\n");

    if (InitList(&L1) == 1) {
        int length = 10;
        Fibonacci(&L1, length);
        printf("【顺序表L1已生成】\n");
        printf("L1:     ");
        PrintSqList(&L1);
    } else {
        printf("L1初始化失败!!!\n");
    }

    if (InitList(&L2) == 1) {
        int randNum = 10;
        RandomNumber(&L2, randNum);
        printf("【顺序表L2已生成】\n");
        printf("L2:     ");
        PrintSqList(&L2);
    } else {
        printf("L2初始化失败!!!\n");
    }

    if (InitList(&L3) == 1) {
        Combine(&L1, &L2, &L3, &tempSL);
        printf("【L1和L2有序合并到L3】\n");
        printf("L3:     ");
        PrintSqList(&L3);
    } else {
        printf("L3初始化失败!!!\n");
    }

    srand(time(NULL));
    int randNum1_10 = rand() % 10 + 1;
    printf("【随机删除L3中第%d个元素】\n", randNum1_10);
    DelSqList(&L3, randNum1_10);
    printf("L3:     ");
    PrintSqList(&L3);

    ElemType randNum1_100 = rand() % 100 + 1;
    printf("【随机产生数字%d插入到L3】\n", randNum1_100);
    Insert(&L3, randNum1_100, &tempSL);
    printf("L3:     ");
    PrintSqList(&L3);

    return 0;
}

实验结果

在这里插入图片描述

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

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

相关文章

Verilog parameter的用法

parameter简介 parameter”是Verilog HDL中的一个关键字&#xff0c;代表着参数型常量&#xff0c;即用parameter来定义一个标识符代表一个常量&#xff0c;这样可以提高程序的可读性与可维护性。 parameter应用场景 #&#xff08;parameter number500&#xff09; 表示定义一…

零代码开发平台免费,未来企业数字化转型常用工具

什么是零代码开发平台 零代码开发平台指的是一种软件开发工具&#xff0c;能够使开发人员在不编写代码的情况下构建应用程序或快速应用程序。它们一般是通过拖放的方式创建用户界面&#xff0c;配置业务逻辑&#xff0c;集成数据库等操作&#xff0c;节省开发周期和人力成本。…

安森美-深力科NC7SV08P5X能成为极高速、高驱动和低功耗应用的理想选择吗?

描述&#xff1a; 关于安森美-深力科NC7SV08P5X是飞兆超低功率 (ULP-A) TinyLogic 系列的一个 2 输入“与”门。 ULP-A 是要求极高速、高驱动和低功耗应用的理想选择。 用于宽低电压工作范围&#xff08;0.9 V 到 3.6 V VCC&#xff09;&#xff0c;适合驱动和速度要求高于 Ti…

需求分析的概念和原则

概念和原则 需求分析是指在软件开发和项目管理中&#xff0c;通过收集、理解、分析和记录用户和系统对系统或产品的需求&#xff0c;以确定其详细的特征和功能。它是一个关键的过程&#xff0c;旨在确保项目成功地满足用户的需求和期望。 在进行需求分析时&#xff0c;有一些…

常用数据聚类算法总结记录

本文的主要目的是总结记录日常学习工作中常用到的一些数据聚类算法&#xff0c;对其原理简单总结记录&#xff0c;同时分析对应的优缺点&#xff0c;以后需要的时候可以直接翻看&#xff0c;避免每次都要查询浪费时间&#xff0c;欢迎补充。 聚类算法是一种无监督学习的方法&am…

Docker安装 Nginx

相关文章&#xff1a; Docker容器之间的连接和通信(四)_做测试的喵酱的博客-CSDN博客 一、 Docker安装 Nginx 1.1、查看可用的 Nginx 版本 docker search nginx 1.2、安装最新 Nginx 版本 docker pull nginx:latest 1.3 查看本地镜像 docker images 1.4 运行容器 运行…

架构-新教材补充内容

系统工程 两分&#xff0c;需要计算的选择题 #mermaid-svg-opoH5AvD05BTqVHp {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-opoH5AvD05BTqVHp .error-icon{fill:#552222;}#mermaid-svg-opoH5AvD05BTqVHp .error-te…

关系型数据库全栈入选唯一厂商!GBASE南大通用的“可信”时刻

作为国产数据库的领军企业&#xff0c;业界公认的“可信”力量&#xff0c;GBASE南大通用深度参与大会&#xff0c;与各协会领导、学术大咖、技术领军共同论道我国数据库自立自强之路。 现在让我们一起盘点为期两天的议程中GBASE南大通用的“高光”时刻&#xff0c;且看GBASE是…

7.7工作总结

一、前言&#xff1a;这周三领导让我修改一个入库接口&#xff0c;需要加入三个参数&#xff0c;我直接把相应的数据加进去了忽略了这个参数是放在一个List中的同时还需要转成json的形式。因此我又修改了一遍。 二、错误的形式&#xff1a; 在接口文档中是这样的形式&#xff…

最新版Flink CDC MySQL同步Elasticsearch(一)

1.环境准备 首先我们要基于Flink CDC MySQL同步MySQL的环境基础上&#xff08;flink-1.17.1、Java8、MySQL8&#xff09;搭建Elasticsearch7-17-10和Kibana 7.17.10。笔者已经搭建好环境&#xff0c;这里不做具体演示了&#xff0c;如果需要Es的搭建教程情况笔者其他博客 注意…

【案例教程】GPT模型支持下的Python-GEE遥感云大数据分析、管理与可视化技术及多领域案例实践实践技术

随着航空、航天、近地空间等多个遥感平台的不断发展&#xff0c;近年来遥感技术突飞猛进。由此&#xff0c;遥感数据的空间、时间、光谱分辨率不断提高&#xff0c;数据量也大幅增长&#xff0c;使其越来越具有大数据特征。对于相关研究而言&#xff0c;遥感大数据的出现为其提…

海格里斯HEGERLS智能四向穿梭车系统是如何赋能企业降本增效的?

随着人工智能和物联网等新技术的更新迭代&#xff0c;物流行业数字化&#xff0c;智能仓储已成趋势。我国智能仓储在“互联网”战略的带动下快速发展&#xff0c;与大数据、云计算等新一代互联网技术深度融合&#xff0c;智能仓储整个行业向着运行高效、便捷、低成本的方向迈进…

Vision Transformer推理中线性-角度注意转换压缩自注意

文章目录 Castling-ViT: Compressing Self-Attention via Switching Towards Linear-Angular Attention at Vision Transformer Inference摘要本文方法实验结果 Castling-ViT: Compressing Self-Attention via Switching Towards Linear-Angular Attention at Vision Transform…

Angular 调试工具(Augury)

目录 1、简介 2、检验代码 3、Angury 本地构建和安装 3.1 添加到Chrome 浏览器&#xff1a; 3.2 添加到Firefox浏览器 4、项目中对应的Npm脚本 5、Augury 三大主要功能 5.1 组件树&#xff08;Component Tree&#xff09; 5.1.1 Component Tree 5.2 路由树&#xff0…

HarmonyOS学习路之开发篇—数据管理(对象关系映射数据库)

HarmonyOS对象关系映射&#xff08;Object Relational Mapping&#xff0c;ORM&#xff09;数据库是一款基于SQLite的数据库框架&#xff0c;屏蔽了底层SQLite数据库的SQL操作&#xff0c;针对实体和关系提供了增删改查等一系列的面向对象接口。应用开发者不必再去编写复杂的SQ…

港联证券|如何区分大盘股和小盘股?

1、依据个股的市值来区别。一般来说&#xff0c;大盘股&#xff1a;流转市值在500亿及以上&#xff0c;小盘股&#xff1a;流转市值一般在50亿及以下&#xff0c;市值在二者之间的被称为中盘股。 2、依据流转股本区别。一般来说&#xff0c;大盘股&#xff1a;流转股本大于5亿&…

mysql重点复习

1.MySQL如何对用户smart授权访问&#xff0c;密码为123456。 2.授权用户tom可以在网络中的192.168.4.254主机登录&#xff0c;仅对对userdb库下的user表有查看记录、更新name字段的权限 &#xff0c; 登录密码userweb888。 GRANT SELECT,UPDATE(name) ON userdb.user TO tom192…

零拷贝小结

零拷贝&#xff08;Zero-copy&#xff09;是一种优化技术&#xff0c;用于减少数据传输过程中的拷贝操作&#xff0c;从而提高系统性能和效率。在传统的数据传输中&#xff0c;涉及多个缓冲区之间的数据拷贝操作&#xff08;例如从磁盘到内存的拷贝、内存到网络缓冲区的拷贝等&…

gitlab ci/cd+harbor+k8s实现一键部署(python项目)

大致架构&#xff1a; gitlab变量 使用 kaniko 构建 Docker 镜像 .gitlab-ci.yml stages:- test- build- deployvariables:DOCKERFILE: "Dockerfile2"CONTAINER_IMAGE: "archeros/workspace/platform"GIT_SSL_NO_VERIFY: "true"before_script…

canvas.js、node-canvas的坑

一、依赖下载后半天没 install 完&#xff0c;最后还报错&#xff0c; \node_modules\canvas: Command failed. Exit code: 1 Command: node-pre-gyp install --fallback-to-build Arguments: 解决方法&#xff1a;官方&#xff1a; Installation: Windows Automattic/node-ca…