【C数据结构】静态顺序表_SeqList

news2024/11/17 20:41:12

目录

【1】数据结构概述

【1.1】什么是数据结构?

【1.2】数据结构分类

【1.3】数据结构术语

【2】数据结构特点

【3】静态顺序表

【3.1】静态顺序表概念及结构

【3.2】静态顺序表定义数据结构和接口

【3.3】静态顺序表初始化

【3.4】静态顺序表头插入

【3.5】静态顺序表尾插入

【3.6】静态顺序表头删除

【3.7】静态顺序表尾删除

【3.8】静态顺序表在指定位置插入

【3.9】静态顺序表在指定位置删除

【3.10】静态顺序表打印

【3.11】静态顺序表查找返回下标

【3.12】静态顺序表修改

【3.13】静态顺序表检测空间是否满

【3.14】静态顺序表检测是否为空

【3.15】静态顺序表获取有效数据个数


【1】数据结构概述

【1.1】什么是数据结构?

官方解释:数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及他们之间的关系和操作等相关问题的学科。

大白话:数据结构就是把数据元素按照一定的关系组织起来的集合,用来组织和存储数据。

【1.2】数据结构分类

逻辑结构分类:

逻辑结构是从具体问题中抽象出来的模型,是抽象意义上的结构,按照对象中数据元素之间的相互关系分类,也是我们后面课题中需要关注和讨论的问题。

  • 集合结构:

结合结构中数据元素出了属于同一集合外,他们之间没有任何其他关系。

  • 线性结构:

线性结构中的数据元素之间存在一对一的关系。

  • 树形结构:

树形结构中的数据元素之间存在多对一的层次关系。

  • 图形结构:

图形结构的数据元素是多对多的关系。

物理结构分类:

        逻辑结构在计算机中真正的表示方式(又称映像)称为物理结构,也可以叫做存储结构,常见的物理结构有顺序存储结构、链式存储结构。

顺序存储结构:

        逻辑结构在计算机中真正的表示方式(又称映像)称为物理结构,也可以叫做存储结构,常见的物理结构有顺序存储结构、链式存储结构。

        顺序存储结构存在一定的弊端,就想生活中排队时,会有人插队也有可能有人突然离开,这时候整个结构都处于变化之中,此时就需要链式存储结构。

        是把数据元素存放在任意的存储单元里面,这组存储单元可以是连续的,也可以是不连续的。此时,数据元素之间的关系,并不能反映元素间的逻辑关系,因此链式存储中引进了一个指针存放数据元素的地址,这样通过地址就可以找到相关联数据元素的位置。

【1.3】数据结构术语

        抽象数据类型:(Abstract Data Type,简称ADT)是指一个数学模型以及定义在该模型上的一组操作。抽象数据类型的定义仅取决于它的一组逻辑特性,而与其在计算机内部如何表示和实现无关,即不论其内部结构如何变化,只要它的数学特性不变,都不影响其外部的使用。

        抽象数据类型和数据类型实质上是一个概念。例如,各个计算机都拥有的“整数”类型是一个抽象数据类型,尽管它们在不同处理器上实现的方法可以不同,但由于其定义的数学特性相同,在用户看来都是相同的。因此,“抽象”的意义在于数据类型的数学抽象特性。

        数据结构的表示(存储结构)类型定义( typedef)描述。数据元素类型约定为Data。

【2】数据结构特点

线性结构的特点是:

        在数据元素的非空有限集合中。

  • 存在唯一的一个被称为"第一个"的数据元素
  • 存在唯一的一个被称为“最后一个”的数据元素
  • 除了第一个之外,结合中的每个数据元素均只有一个前驱
  • 除了最后一个之外,集合中每个数据元素均只有一个后继

        顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。

        线性表示一个相当灵活的数据结构,它的长度可以根据需要增长或缩短,即对线性表的数据元素不仅可以进行访问,还可以进行插入和删除等。

【3】静态顺序表

【3.1】静态顺序表概念及结构

顺序表是指用一组地址连续的内存单元依次存储线性表的数据元素

通常都用数组来描述数据结构中的顺序存储结构。由于线性表的长度可变,且所需最大存储空间随问题不同而不同,则在C语言中可用动态内存分配一维数组,

如下描述:

【3.2】静态顺序表定义数据结构和接口

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <assert.h>
​
/* 静态顺序表数据结构 */ 
#define N 10
typedef int SQLType;
typedef struct SeqList
{
    SQLType data[N];            // 数据存储区。
    size_t size;                // 当前数据去有效数据个数。
}SeqList;
​
/* 静态顺序表初始化 */ 
void SeqListInit(SeqList* pSQ);
​
/* 静态顺序表头插入 */ 
void SeqListPushFront(SeqList* pSQ, SQLType data);
​
/* 静态顺序表尾插入 */ 
void SeqListPushBack(SeqList* pSQ, SQLType data);
​
/* 静态顺序表头删除 */ 
void SeqListPopFront(SeqList* pSQ);
​
/* 静态顺序表尾删除 */
void SeqListPopBack(SeqList* pSQ);
​
/* 动态顺序表在指定位置插入 */ 
void SeqListInsert(SeqList* pSQ, size_t pos, SQLType data);
​
/* 动态顺序表在指定位置删除 */ 
void SeqListErase(SeqList* pSQ, size_t pos);
​
/* 静态顺序表打印 */
void SeqListPrint(SeqList* pSQ);
​
/*  静态顺序表查找返回下标 */
int SeqListFind(SeqList* pSQ, SQLType data);
​
/* 静态顺序表修改 */ 
void SSeqListModifi(SeqList* pSQ, size_t pos, SQLType data);
​
/* 静态顺序表检测满了返回false没满返回true */ 
bool SeqListCheck(SeqList* pSQ);
​
/* 静态顺序表检测是否存在数据个数有数据返回false没有数据返回true */ 
bool SeqListEmpty(SeqList* pSQ);
​
/* 静态顺序表获取有效数据个数 */ 
bool SeqListGetSize(SeqList* pSQ);

【3.3】静态顺序表初始化

// 静态顺序表初始化函数实现
void SeqListInit(SeqList* pSQ)
{
    // 断言:保护形参指针不为NULL
    assert(pSQ);
    memset(pSQ->data, 0, sizeof(pSQ->data));
    pSQ->size = 0;
}

【3.4】静态顺序表头插入

// 静态顺序表 - 头插入
void SeqListPushFront(SeqList* pSQ, SQLType data)
{
    // 断言:保护形参指针不为NULL
    assert(pSQ);
​
    // 判断存储空间大小
    if (!SeqListCheck(pSQ))
    {
        printf("SeqList Full!\n");
        return;
    }
​
    // 移动数据
    size_t end = pSQ->size;
    while (end > 0)
    {
        pSQ->data[end] = pSQ->data[end - 1];
        end--;
    }
    // 数据插入头部
    pSQ->data[0] = data;
    pSQ->size++;
}

【3.5】静态顺序表尾插入

// 静态顺序表 - 尾插入
void SeqListPushBack(SeqList* pSQ, SQLType data)
{
    // 断言:保护形参指针不为NULL
    assert(pSQ);
​
    // 判断存储空间大小
    if (!SeqListCheck(pSQ))
    {
        printf("SeqList Full!\n");
        return;
    }
​
    // 程序走到这里说明数组中的数据没有满!
    pSQ->data[pSQ->size++] = data;
}

【3.6】静态顺序表头删除

// 静态顺序表 - 头删除
void SeqListPopFront(SeqList* pSQ)
{
    // 断言:保护形参指针不为NULL
    assert(pSQ);
​
    // 判断顺序表中是否还有有效的数据
    if (!SeqListEmpty(pSQ))
    {
        printf("SeqList Empty!\n");
        return;
    }
​
    // 移动数据
    int begin = 0;
    while(begin < pSSQ->size - 1)
    {
        pSQ->data[begin] = pSQ->data[begin + 1];
        begin++;
    }
​
    pSQ->size--;
}

【3.7】静态顺序表尾删除

// 静态顺序表 - 尾删除
void SeqListPopBack(SeqList* pSQ)
{
    // 断言:保护形参指针不为NULL
    assert(pSQ);
​
    // 判断顺序表中是否还有有效的数据
    if (!SeqListEmpty(pSQ))
    {
        printf("SeqList Empty!\n");
        return;
    }
​
    // 程序走到这里说明数组中还有有效数据
    pSQ->size--;
}

【3.8】静态顺序表在指定位置插入

// 动态顺序表 - 在指定位置插入
void SeqListInsert(SeqList* pSQ, size_t pos, SQLType data)
{
    // 断言保护形参指针变量不为NULL
    assert(pSQ);
​
    // 判断存储空间大小
    if (!SeqListCheck(pSQ))
    {
        printf("SeqList Full!\n");
        return;
    }
​
    // 移动数据
    int end = SeqListGetSize(pSQ) + 1;
    while (end > pos)
    {
        pSQ->data[end] = pSQ->data[end - 1];
        end--;
    }
​
    pSQ->data[pos] = data;
    pSQ->size++;
}

【3.9】静态顺序表在指定位置删除

// 动态顺序表 - 在pos位置删除
void SeqListErase(SeqList* pSQ, size_t pos)
{
    // 断言保护形参指针变量不为NULL
    assert(pSQ);
​
    // 判断动态顺序表中是否还有数据
    if (!SeqListEmpty(pSQ))
    {
        printf("SeqList Empty!");
        return;
    }
​
    size_t begin = pos;
    while (begin < pSSQ->size)
    {
        pSQ->data[begin] = pSQ->data[begin + 1];
        begin++;
    }
​
    --pSQ->size;
}

【3.10】静态顺序表打印

// 静态顺序表 - 打印
void SeqListPrint(SeqList* pSQ)
{   
    // 断言:保护形参指针不为NULL
    assert(pSQ);
​
    for (int i = 0; i < pSQ->size; i++)
    {
        printf("%d\t",pSQ->data[i]);
    }
    printf("\n");
}

【3.11】静态顺序表查找返回下标

// 静态顺序表 - 查找 - 返回下标
int SeqListFind(SeqList* pSQ, SQLType data)
{
    // 断言:保护形参指针不为NULL
    assert(pSQ);
​
    // 判断顺序表中是否还有有效的数据
    if (!SeqListEmpty(pSQ))
    {
        printf("SeqList Empty!\n");
        return -1;
    }
​
    // 程序走到这里说明数组中有元素,找到下表并且返回
    for (int i = 0; i < pSQ->size; i++)
    {
        if (pSQ->data[i] == data)
            return i;
    }
​
    return -1;
}

【3.12】静态顺序表修改

// 静态顺序表 - 修改
void SeqListModifi(SeqList* pSSQ, size_t pos, SQLType data)
{
    // 断言:保护形参指针不为NULL
    assert(pSQ);
​
    pSQ->data[pos] = data;
}

【3.13】静态顺序表检测空间是否满

// 静态顺序表 - 检测 - 满了返回false - 没满返回true
bool SeqListCheck(SeqList* pSQ)
{
    // 断言:保护形参指针不为NULL
    assert(pSSQ);
    
    return pSQ->size != N;
}

【3.14】静态顺序表检测是否为空

// 静态顺序表 - 检测是否存在数据个数 - 有数据返回true - 没有数据返回false。
bool SeqListEmpty(SeqList* pSSQ)
{
    // 断言:保护形参指针不为NULL
    assert(pSQ);
​
    return pSQ->size != 0;
}

【3.15】静态顺序表获取有效数据个数

// 静态顺序表 - 获取有效数据个数
bool SeqListGetSize(SeqList* pSSQ)
{
    // 断言:保护形参指针不为NULL
    assert(pSQ);
​
    return pSQ->size - 1;
}

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

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

相关文章

C/C++内存管理(newdelete详解)

C/C内存管理 引言new与delete的使用内置类型自定义类型 new与delete的实现原理内置类型了解operator new与operator delete函数自定义类型 定位newnew&delete与malloc&free的区别总结 引言 在之前的C语言部分&#xff0c;我们已经介绍过内存中的存储区域的划分&#x…

FMQL在linux下GPIO的映射关系与使用

最近几年国产化芯片的使用如火如荼&#xff0c;部分国产手册说明杂且描述不清&#xff0c;尤其是一些映射关系使用文字描述非常不直观。博主在使用GPIO功能输出的时候反复看了几遍再去尝试控制耗费了不少时间。现结合相关文档总结GPIO映射表格&#xff0c;方便读者使用。 1、 …

【Spring Boot 】Spring Boot 统一功能处理

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 前言 1. Spring 拦截器 1.1 自定义拦截器 1…

6月19日第壹简报,星期一,农历五月初二

6月19日第壹简报&#xff0c;星期一&#xff0c;农历五月初二坚持阅读&#xff0c;静待花开1. 未来10天江南华南等地多降雨过程&#xff0c;国家防总将防汛四级响应范围扩至八省份&#xff0c;加派工作组赴地方协助指导。2. “一天有四季、十里不同天”&#xff0c;“最美”独库…

LVS - DR集群

LVS - DR集群 数据包流向分析&#xff1a; &#xff08;1&#xff09;客户端发送请求到 Director Server&#xff08;负载均衡器&#xff09;&#xff0c;请求的数据报文&#xff08;源 IP 是 CIP,目标 IP 是 VIP&#xff09;到达内核空间。 &#xff08;2&#xff09;Direct…

【VS2022】win 10 / win 11:Visual Studio 2022 社区版免费下载与安装

目录 一、Visual Studio 2022 下载 二、Visual Studio 2022 安装 三、Visual Studio 2022 快捷方式创建 四、Visual Studio 2022 使用 一、Visual Studio 2022 下载 Visual Studio 2022 官方下载https://visualstudio.microsoft.com/zh-hans/downloads/首先登陆 Visual Stu…

attention unet + cldice 论文总结

Blood Vessel Segmentation from Low-Contrast and Wide-Field Optical Microscopic Images of Cranial Window by Attention-Gate-Based Network论文总结 论文&#xff1a;Blood Vessel Segmentation by Attention-Gate-Based Network 目录 一、论文背景和出发点 二、创新点…

vue源码阅读之Observer

我们上次学习了vue数据驱动的概念&#xff0c;以及简单的vue怎么知道数据更新&#xff0c;然后采取行动的。今天我们就来继续深入学习&#xff0c;vue怎么把数据和视图给绑定在一起的&#xff0c;数据发生变化&#xff0c;视图怎么会自动发生变化的。 vue中的Observer 之前讲…

chatgpt赋能python:Python截取某一段文字

Python截取某一段文字 Python是最流行的编程语言之一&#xff0c;用于开发各种类型的应用程序&#xff0c;包括Web应用程序、桌面应用程序、游戏等。在本文中&#xff0c;我们将讨论如何使用Python截取某一段文字。这对于Web开发者和SEO专家非常有用&#xff0c;因为他们需要查…

【干货】Android系统定制基础篇:第八部分(增加以太网设置菜单、支持多摄像头、替换默认签名)

一、增加以太网设置菜单 Android 系统设置默认并没有以太网相关设置项&#xff0c;但以太网功能是支持的&#xff0c;因此我们仅仅需要增加设置界面即可。以太网设置界面如下&#xff1a; 修改 diff --git a/packages/apps/Settings/AndroidManifest.xml b/packages/apps/Se…

【第六次】21级计科计算机组成原理课外练习

【第六次】21级计科计算机组成原理课外练习 一、单选题二、多选题三、填空题 一、单选题 2-1 假定某计算机按字节编址&#xff0c;采用小端方式&#xff0c;有一个float型变量x的地址为0xffffc000&#xff0c;x12345678H&#xff0c;则在内存单元0xffffc001中存放的内容是 A.…

计算机网络和Linux网络

计算机网络和Linux网络 计算机网络概论 什么是计算机网络 计算机网络&#xff08;结构上&#xff09; 由节点&#xff08;主机、网络交换设备设备&#xff09;、边&#xff08;通信设备&#xff09;、协议构成协议&#xff1a;对等层的实体在通讯过程中应该遵守的规则的集合&…

软考A计划-网络工程师-易混淆知识汇总

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

chatgpt赋能python:Python编程:如何隐藏输入以保护信息安全?

Python编程&#xff1a;如何隐藏输入以保护信息安全&#xff1f; 随着数字化时代的到来&#xff0c;人们越来越多地依赖于互联网和技术设备进行通信和交易。然而&#xff0c;信息安全成为越来越大的问题&#xff1a;黑客和其他恶意分子通过各种手段获取和利用个人信息。为保障…

【瑞萨RA_FSP】GPT—— PWM功能详解

文章目录 一、GPT比较匹配功能详解1. 锯齿波PWM模式&#xff08;普通PWM模式&#xff09;2. 三角波PWM模式1&#xff08;波谷32位传输&#xff09;3. 三角波PWM模式2&#xff08;波峰和波谷32位传输&#xff09;4. 三角波PWM模式3&#xff08;波谷64位传输&#xff09;5. 设置死…

【随机种子初始化】一个神经网络模型初始化的大坑

1 问题起因和经过 半年前写了一个模型&#xff0c;取得了不错的效果&#xff08;简称项目文件1&#xff09;&#xff0c;于是整理了一番代码&#xff0c;保存为了一个新的项目&#xff08;简称项目文件2&#xff09;。半年后的今天&#xff0c;我重新训练这个整理过的模型&…

【C数据结构】带头双向循环链表_HDList

目录 带头双向循环链表_HDList 【1】链表概念 【2】链表分类 【3】带头双向循环链表 【3.1】带头双向循环链表数据结构与接口定义 【3.2】带头双向循环链表初始化 【3.3】带头双向循环链表开辟节点空间 【3.4】带头双向循环链表销毁 【3.5】带头双向循环链表头插 【3…

【C数据结构】带头单向非循环链表_HList

目录 带头单向非循环链表_HList 【1】链表概念 【2】链表分类 【3】有头单向非循环链表 【3.1】非循环链表数据结构与接口定义 【3.2】带头单向非循环链表初始化 【3.3】带头单向非循环链表释放空间 【3.4】带头单向非循环链表创建节点 【3.5】带头单向非循环链表头插…

HTML学习(二)

视频 <video width"320" height"240" controls> <source src"movie.mp4" type"video/mp4"> <source src"movie.ogg" type"video/ogg"> </video> 音频 <audio controls> <…

C++【AVL树】

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; C修行之路 &#x1f383;操作环境&#xff1a; Visual Studio 2019 版本 16.11.17 文章目录 &#x1f307;前言&#x1f3d9;️正文1、认识AVL树1.1、AVL树的定义 2、AVL树的插入操作2.1、抽象图2.2、插入流程…