顺序表的构造及功能

news2024/11/18 1:22:15

定义

顺序表是一种随机存储都结构,其特点是表中的元素的逻辑顺序与物理顺序相同。

假设线性表L存储起始位置为L(A),sizeof(ElemType)是每个数据元素所占的存储空间的大小,则线性表L所对应的顺序存储如下图。

顺序表的优缺点
优点:
随机存储表中的任意元素,其存储位置可以用一个简单、直观的公式来表示。
存储密度高,每个结点只存储数据元素。

缺点:
在做插入或删除元素时,需要移动大量元素。
操作相对复杂,必然导致空间的浪费。

静态顺序表的构建

在静态分配时,由于数组的大小和空间事先已经固定好,一旦空间占满,再加入新的数据就会产生溢出,进而导致进程崩溃。

#define MaxSize 100           //顺序表可能达到的最大长度
typedef int ElemType;
typedef struct{
    ElemType data[MaxSize];  //顺序表的元素
    int length;              //当前的长度
}List;                       //顺序表的类型定义

注意:线性表中元素的位置是从1开始的,而数组中的元素的下标是从0开始的。

动态顺表的构建

#define MaxSize 100  //顺序表可能达到的最大长度
typedef int ElemType;
typedef struct{
    ElemType* data;  //存储空间的基址
    int length;      //当前的长度
}List;               //顺序表的结构类型为List

C的初始动态分配语句

list.data = (ElemType*)malloc(sizeof(ElemType)*MaxSize);  //动态开辟空间 (c语言)

C++的初始动态分配语句

list.data = new ElemType[MaxSize];  //动态开辟空间 (c++)

注意:动态分配并不是链式存储,它同样属于顺序存储结构,,物理结构没有变化,依然是随机存储方式,只是分配的空间大小可以在运行时动态决定。

动态顺序表的常见操作

插入

插入新元素的图解

void Insert(List *list, int index, int value){  //插入(在第index位置插入value)
    if (index < 1 || index > list->length + 1){  //判断范围是否有效
        printf("插入失败(位置输入错误)!\n");
        return;
    }
    if (list->length >= MaxSize){   //空间已满,无法插入
        printf("插入失败(顺序表已满)!\n");
        return;
    }
    for (int i = list->length; i >= index; i--){  //将第index个元素及之后的元素后移
        list->data[i] = list->data[i - 1];
    }
    list->data[index - 1] = value;  //将位置index放入value
    list->length++;  //线性表长度加一
    printf("插入成功!\n");
    return;
}
线性表插入算法的平均时间复杂度为O(N)。

取值

根据下标来查找元素

void GetElem(List list, int index){  //取值(用下标找元素)
    if (index >= 0 && index < list.length){
        printf("要查找的第%d个元素是:%d\n", index, list.data[index - 1]);
    }
    else{
        printf("输入的值有误!!\n");
    }
}

查找

根据所给的元素来遍历顺序表来寻找

void LocateElem(List list, int value){ //查找(用值找下标)
    for (int i = 0; i < list.length; i++){
        if (value == list.data[i]){
            printf("%d是本表中的第%d元素\n", value, i + 1);
            return;
        }
    }
    printf("找不到该元素\n");
    return;
}
线性表按值查找算法的平均时间复杂度为O(N)。

删除

删除元素的图解

void Delete(List *list, int index){ //删除(删除指定的第几个元素)
    if (index < 1 || index > list->length) {  //判断index的范围是否有效
        printf("删除失败(输入的数值有误)!\n");
        return;
    }
    for (int i = index - 1; i < list->length - 1; i++){  //将第index个位置后的元素前移
        list->data[i] = list->data[i + 1];
    }
    list->length--;  //线性表长度减一
    printf("删除成功!\n");
    return;
}
线性表删除算法的平均时间复杂度为O(N)。

销毁

void Clear(List *list){  //销毁
    list->length = 0;   //将顺序表的长度设为0
    free(list->data);   //释放malloc申请的空间
    printf("顺序表已销毁!\n");
}

划分

已第一个元素为界,比它小的元素放在它的前面,比它大的元素放在它的后面

void ListSort(List *list){  //划分(已第一个元素为界,前面比它小,后面比它大)
    int i = 0, j = 0;
    int temp, k;
    temp = list->data[0];
    for (i = 1; i < list->length; i++){
        if (temp > list->data[i]){
            k = list->data[i];
            for (j = i; j > 0; j--){
                list->data[j] = list->data[j - 1];
            }
            list->data[0] = k;
        }
    }
    printf("划分成功!\n");
    return;
}

单值化

单值化类似与去掉顺序表中重复的元素

void DeleteSame(List *list){  //单值化(去掉重复的元素)
    int i = 0;
    while (i < list->length){
        for (int j = i + 1; j <= list->length; j++)
        while (list->data[i] == list->data[j]){
            for (int k = j; k <= list->length; k++)
                list->data[k] = list->data[k + 1];
            list->length--;
        }
        i++;
    }
    printf("单值化完成!\n");
    return;
}

源码

SeqList.h
#include <stdio.h>
#include <windows.h>
#include <malloc.h>

#define MaxSize 100
typedef int ElemType;
typedef struct{
    ElemType* data;  //动态顺序表
    int length;
}List;

void menu();
void PutList();
void GetElem();
void LocateElem();
void Insert();
void Delete();
void DeleteSame();
void ListSort();
void Clear();

SeqList.c
#include "SeqList.h"

void PutList(List list){  //输出(遍历线性表)
    for (int i = 0; i < list.length; i++){
        printf("%d ", list.data[i]);
    }
    printf("\n");
}

void GetElem(List list, int index){  //取值(用下标找元素)
    if (index >= 0 && index < list.length){
        printf("要查找的第%d个元素是:%d\n", index, list.data[index - 1]);
    }
    else{
        printf("输入的值有误!!\n");
    }
}

void LocateElem(List list, int value){ //查找(用值找下标)
    for (int i = 0; i < list.length; i++){
        if (value == list.data[i]){
            printf("%d是本表中的第%d元素\n", value, i + 1);
            return;
        }
    }
    printf("找不到该元素\n");
    return;
}

void Insert(List *list, int index, int value){  //插入(在第index位置插入value)
    if (index < 1 || index > list->length + 1){
        printf("插入失败(位置输入错误)!\n");
        return;
    }
    if (list->length >= MaxSize){
        printf("插入失败(顺序表已满)!\n");
        return;
    }
    for (int i = list->length; i >= index; i--){
        list->data[i] = list->data[i - 1];
    }
    list->data[index - 1] = value;
    list->length++;
    printf("插入成功!\n");
    return;
}

void Delete(List *list, int index){ //删除(删除指定的第几个元素)
    if (index < 1 || index > list->length) {
        printf("删除失败(输入的数值有误)!\n");
        return;
    }
    for (int i = index - 1; i < list->length - 1; i++){
        list->data[i] = list->data[i + 1];
    }
    list->length--;
    printf("删除成功!\n");
    return;
}

void DeleteSame(List *list){  //单值化(去掉重复的元素)
    int i = 0;
    while (i < list->length){
        for (int j = i + 1; j <= list->length; j++)
        while (list->data[i] == list->data[j]){
            for (int k = j; k <= list->length; k++)
                list->data[k] = list->data[k + 1];
            list->length--;
        }
        i++;
    }
    printf("单值化完成!\n");
    return;
}

void ListSort(List *list){  //划分(已第一个元素为界,前面比它小,后面比它大)
    int i = 0, j = 0;
    int temp, k;
    temp = list->data[0];
    for (i = 1; i < list->length; i++){
        if (temp > list->data[i]){
            k = list->data[i];
            for (j = i; j > 0; j--){
                list->data[j] = list->data[j - 1];
            }
            list->data[0] = k;
        }
    }
    printf("划分成功!\n");
    return;

}

void Clear(List *list){  //销毁
    list->length = 0;
    free(list->data);
    printf("顺序表已销毁!\n");
}

void menu(){  //菜单
    printf("顺序表操作:< P-输出  G-取值  L-查找  I-插入  D-删除  S-单值化  F-划分  X-销毁  Q-退出 >\n");
}

Test.c
#include "SeqList.h"

int main(){
    List list;
    list.data = (ElemType*)malloc(sizeof(ElemType)*MaxSize);  //动态开辟空间 (c语言)
    //list.data = new ElemType[MaxSize];  //动态开辟空间 (c++)

    printf("线性表中元素的个数:");
    int n = 0;
    scanf("%d", &n);
    list.length = n;
    printf("请输入元素:");
    for (int i = 0; i < n; i++){
        int t = 0;

        //cin >> list.data[i]; //c++输入
        scanf("%d", &t);
        list.data[i] = t;
    }

    while (1){
        menu();
        char key;
        //cin >> key; //c++输入
        int t = 0;
        scanf("%c", &key);

        switch (key){
        case 'P':
            PutList(list); //输出
            break;

        case 'G':
            printf("要查找第几个元素:");
            scanf("%d", &t);
            GetElem(list,t);  //取值
            break;

        case 'L':
            printf("要查找元素的值为:");
            scanf("%d", &t);
            LocateElem(list,t); //查找
            break;

        case 'I':
            printf("输入要插入的位置和数值:");
            int index, value;
            scanf("%d %d", &index,&value);
            Insert(&list, index, value);  //插入
            break;

        case 'D':
            printf("输入要删除第几个元素:");
            scanf("%d", &t);
            Delete(&list, t);  //删除
            break;

        case 'S':
            DeleteSame(&list); //单值化
            break;

        case 'F':
            ListSort(&list);  //划分
            break;

        case 'X':
            Clear(&list);  //销毁
            break;

        case 'Q':
            exit(0);  //退出
            break;
        }
    }
    system("pause");
}

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

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

相关文章

【面试题】 3 个加强理解TypeScript 的面试问题

TypeScript 作为 JavaScript 的超集&#xff0c;让 JavaScript 越来越像一门“正经的”语言。和纯粹的 JavaScript 语言相比&#xff0c;TypeScript 提供静态的类型检查&#xff0c;提供类的语法糖&#xff08;这一点是继承了 ES6 的实现&#xff09;&#xff0c;让程序更加规范…

Python实现贝叶斯优化器(Bayes_opt)优化LightGBM回归模型(LGBMRegressor算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。1.项目背景贝叶斯优化器 (BayesianOptimization) 是一种黑盒子优化器&#xff0c;用来寻找最优参数。贝叶斯优化器是…

测试用例篇

1.测试用例的意义 测试用例&#xff08;Test Case&#xff09;是为了实施测试而向被测试的系统提供的一组集合&#xff0c;这组集合包含&#xff1a;测试环境、操作步骤、测试数据、预期结果等要素。 测试用例的意义是为了帮助测试人员了解测什么&#xff0c;怎么测 eg&#x…

docker的使用方法

docker技术 同一个操作系统内跑多套不同版本依赖的业务 docker可以使同一个物理机中进程空间&#xff0c;网络空间&#xff0c;文件系统空间相互隔绝 虚拟机弊端&#xff1a;每个需要安装操作系统&#xff0c;太重量级&#xff0c;资源需要提前分配好 部署程序 开发环境 win…

WebRTC现状以及多人视频通话分析

1.WebRTC 概述WebRTC&#xff08;网页实时通信技术&#xff09;是一系列为了建立端到端文本或者随机数据的规范&#xff0c;标准&#xff0c;API和概念的统称。这些对等端通常是由两个浏览器组成&#xff0c;但是WebRTC也可以被用于在客户端和服务器之间建立通信连接&#xff0…

【源码解析】重试模板RetryTemplate源码分析

应用场景 日常开发中&#xff0c;经常会遇到这样的场景&#xff1a;执行一次接口调用&#xff0c;如RPC调用&#xff0c;偶现失败&#xff0c;原因可能是dubbo超时、连接数耗尽、http网络抖动等&#xff0c;出现异常时我们并不能立即知道原因并作出反应&#xff0c;可能只是一…

新冠小阳人症状记录

原想挺过春节后再养&#xff0c;发现事与愿违。生理期期间抵抗力下降&#xff0c;所以在生理期第二天就有些症状了。可能是生理期前一天出去采购食物染上&#xff0c;也可能是合租夫妻染上。anyway&#xff0c;记录下自己的症状与相应有效的偏方&#xff1a; 第一天&#xff1a…

git构建工具

目录 一、简介 1、版本控制 2、版本控制工具 二、Git工作机制 1、工作区 2、暂存区 3、远程库 三、常用命令 1、初始化本地仓库 git init 2、查看本地库状态 git status 3、工作区文件加入到暂存区 git add 4、 暂存区文件提交到本地库 git commit -m &quo…

Odoo | Webserivce | 5分钟学会【JSONRPC】接口开发

文章目录Odoo - JsonRPC1. Odoo内方法结构&#xff08;接收端&#xff09;2. POST接口请求结构&#xff08;发送端&#xff09;3. 实例测试Odoo - JsonRPC 1. Odoo内方法结构&#xff08;接收端&#xff09; # -*- coding: utf-8 -*- import odoo import logging import trac…

手把手带你做一套毕业设计-征程开启

本文是《手把手带你做一套毕业设计》专栏的开篇&#xff0c;文本将会包含我们创作这个专栏的初衷&#xff0c;专栏的主体内容&#xff0c;以及我们专栏的后续规划。关于这套毕业设计的作者呢前端部分由狗哥负责&#xff0c;服务端部分则由天哥操刀。我们力求毕业生或者新手通过…

Anaconda3 +pycharm详细安装教程(2023年)

前言最近配置了一台新电脑&#xff0c;准备安装Anaconda&#xff0c;原来是直接安装的python安装包以及pycharm&#xff0c;需要使用什么包就安装什么包&#xff0c;由于网络原因&#xff0c;经常安装失败&#xff0c;所以选择包含众多科学数据包的Anaconda。说到这里&#xff…

@font-face用法超详细讲解

文章目录font-face是什么font-face基本语法urlTTFOTFEOTWOFFSVGformatfont-face用法示例font字体下载ttf-to-eot 字体转换器https://blog.csdn.net/qq_37417446/article/details/106728725 https://developer.mozilla.org/zh-CN/docs/Web/CSS/font-face font-face是什么 font-…

网络性能总不好?专家帮你来“看看”— CANN 6.0 黑科技 | 网络调优专家AOE,性能效率双提升

随着深度学习模型复杂度和数据集规模的增大&#xff0c;计算效率的提升成为不可忽视的问题。然而&#xff0c;算法网络的多样性、输入数据的不确定性以及硬件之间的差异性&#xff0c;使得网络调优耗费巨大成本&#xff0c;即使是经验丰富的专家&#xff0c;也需要耗费数天的时…

C#窗口介绍

窗口就是打开程序我们所面对的一个面板&#xff0c;里面可以添加各种控件&#xff0c;如下图所示&#xff0c;我们可以在属性栏设置其标题名称、图标、大小等。图1 窗口图 图2 设置面板 图3 设置双击标题框&#xff0c;会生成Load函数&#xff0c;也可以到事件里面去找Load函数…

Linux(Centos)安装RabbitMQ+延时插件+开机自启动

安装目录1&#xff1a;前言1.1 系统环境1.2&#xff1a;安装版本1.3 简介2&#xff1a;安装2.1&#xff1a;安装前准备&#xff1a;2.2&#xff1a;安装Erlang2.3&#xff1a;安装RabbitMQ2.3&#xff1a;延迟依赖插件安装1&#xff1a;前言 1.1 系统环境 操作系统版本&#…

python-批量下载某短视频平台音视频标题、评论、点赞数

python-批量下载某短视频平台音视频标题、评论数、点赞数前言一、获取单个视频信息1、获取视频 url2、发送请求3、数据解析二、批量获取数据1、批量导入地址2、批量导出excel文件3、批量存入mysql数据库三、完整代码前言 1、Cookie中文名称为小型文本文件&#xff0c;指某些网…

【linux】软硬链接

在linux中在磁盘中定位文件并不是根据文件名而是根据文件的inode&#xff0c;一个文件对应一个inode但是一个inode可以对应多个文件。硬链接硬链接是通过索引节点进行的链接。在Linux中&#xff0c;多个文件指向同一个索引节点是允许的&#xff0c;像这样的链接就是硬链接。硬链…

【论文速递】EMNLP 2020 - 将事件抽取作为机器阅读理解任务

【论文速递】EMNLP 2020 - 将事件抽取作为机器阅读理解任务 【论文原文】&#xff1a;Event Extraction as Machine Reading Comprehension 【作者信息】&#xff1a;Jian Liu and Yubo Chen and Kang Liu and Wei Bi and Xiaojiang Liu 论文&#xff1a;https://aclantholo…

计算机视觉知识体系

文章目录一、计算机视觉1.1 系统工程方案层1.2 领域任务模块层1.3 基础算法层1.4 深入领域体会一、计算机视觉 三个层次&#xff1a;系统工程方案层、领域任务模块层、基础算法层。 三方面知识点&#xff1a;图像处理、机器学习、基础数学与模型。 视频的三个场景&#xff1…

k8s node之间是如何通信的?

承接上文同一个node中pod之间如何通信&#xff1f;单一Pod上的容器是怎么共享网络命名空间的&#xff1f;每个node上的pod ip和cni0网桥ip和flannel ip都是在同一个网段10.1.71.x上。cni0网桥会把报文发送flannel这个网络设备上&#xff0c;flannel其实是node上的一个后台进程&…