数据结构__顺序表

概念及结构       

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

需要用到数组:数组的绝对优势:下标的随机访问(因为物理空间连续)

a[i]等价于*(a+i)

顺序表的两种类型

顺序表一般可以分为:

1. 静态顺序表:

使用定长数组存储元素。

缺点:空间给小了不够用,给多了浪费

//静态顺序表
//缺点:空间给小了不够用,给多了浪费
#define N 10
typedef int SLDatatype;
struct SeqList
{SLDatatype a[N];int size;
};

2. 动态顺序表:

        接口实现
        静态顺序表只适用于确定知道需要存多少数据的场景。静态顺序表的定长数组导致N定大了,空间开多了浪费,开少了不够用。所以现实中基本都是使用动态顺序表,根据需要动态的分配空间
大小,所以下面我们实现动态顺序表。

使用动态开辟的数组存储。

SList.h

包括顺序表的初始化、删除、尾部插入删除、头部插入删除

还有最后打印出结果

头部插入需要挪动整体的位置,必须从后面开始挪。先挪前面的会覆盖之前的位置导致数据丢失

SList.h

#pragma once
#include<stdio.h>
#include<stdlib.h>
//动态顺序表
typedef int SLDatatype;
typedef struct SeqList
{SLDatatype* a;int size;	//存储的有效数据个数int capacity;//容量
}SL;
//需要把结构体的地址传过来
//初始化
void SLInit(SL* sl);
//销毁/删除
void SLDestroy(SL* sl);
//尾插
void SLPushBack(SL* psl,SLDatatype x);
//头插
void SLPushFront(SL* psl, SLDatatype x);
//头部删除
void SLPopFront(SL* psl);
//尾部删除
void SLPopBack(SL* psl);
//打印
void SLPrint(SL* psl);

SList.cpp

#define _CRT_SECURE_NO_WARNINGS  1
#include"SeqList.h"
//void SLInit(SL* psl)
//{
// 开始不开辟空间
//	psl->a = NULL;
//	psl->capacity = 0;
//	psl->size = 0;
//}
void SLPrint(SL* psl)
{for (int i = 0; i < psl->size; i++){printf("%d", psl->a[i]);}printf("\n");
}
void SLInit(SL* psl)
{//开始先开辟一小块空间psl->a = (SLDatatype*)malloc(sizeof(SLDatatype)*4);if (psl->a == NULL){perror("malloc fail");return;}psl->capacity = 0;psl->size = 0;
}
void SLDestroy(SL* psl)
{//必须置空否则外面会访问到野指针free(psl->a);psl->a = NULL;psl->size = 0;psl->capacity = 0;
}
//检查容量
void SLCheckCapacity(SL* psl)
{if (psl->size == psl->capacity){//扩容//realloc是空间的新的大小SLDatatype* tmp = (SLDatatype*)realloc(psl->a, sizeof(SLDatatype) * psl->capacity * 2);if (tmp == NULL){perror("realloc fail");return;}psl->a = tmp;psl->capacity *= 2;}
}
//尾插
void SLPushBack(SL* psl, SLDatatype x)
{//防止越界要检查容量SLCheckCapacity(psl);psl->a[psl->size] = x;psl->size++;//或者psl->a[psl->size++]=x;
}
//头插
void SLPushFront(SL* psl, SLDatatype x)
{SLCheckCapacity(psl);//挪动数据(最后一个数据往后挪)int end = psl->size - 1;//挪动数据(最后空的地方往前移)//int end=psl->size;//如果还有空间  while (end >= 0){psl->a[end + 1] = psl->a[end];--end;}psl->a[0]=x;//长度+1psl->size++;
}
//头部删除
void SLPopFront(SL* psl)
{//暴力检查assert(psl->size>0);int start = 0;//重点while (start < psl->size-1){psl->a[start] = psl->a[start + 1];start++;}//int start = 1;重点//while (start < psl->size)//{//	psl->a[start] = psl->a[start + 1];//	start++;//}psl->size - 1;
}
//尾部删除
void SLPopBack(SL* psl)
{//断言,暴力检查assert(psl->size>0);//温柔检查/*if (psl->size == 0)printf("表已经空了,别删了");return;*/psl->size--;
}

test.cpp

#include"SeqList.h"
int main()
{SL s;SLInit(&s);SLDestroy(&s);SLPushBack(&s, 1);SLPushBack(&s, 2);SLPushBack(&s, 3);SLPushBack(&s, 4);SLPushBack(&s, 5);SLPushBack(&s, 6);SLPrint(&s);SLDestroy(&s);return 0;
}

柔性数组和动态数组的区别

柔性数组是让结构体的成员和后面的数组空间在一块空间上

动态数组在两块空间上

接口的实现

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux下使用C语言实现线程池---代码及分析

线程池 相关文章 协议 Socket编程 高并发服务器实现 线程池 如果一个客户端建立连接使用创建一个线程用于处理这一个线程, 处理结束的时候把这一个线程删除, 这个时候会导致线程的创建以及销毁会消耗大量的时间 这时候可以一次性创建多个线程, 这几个线程统称线程池, 如果客户…

spark实验三-spark进阶编程

1&#xff0e;Spark编程统计各地区租房人数 实验目标&#xff1a; (1) 掌握在IntelliJ IDEA 中操作spark程序开发 (2) 打包程序提交集群运行 实验说明&#xff1a; 现有一份某省份各地区租房信息文件 house.txt&#xff0c;文件中共有8个数据字段&#xff0c;字段说明…

更改ip地址的几种方式有哪些

在数字化时代&#xff0c;IP地址作为网络设备的标识&#xff0c;对于我们在网络世界中的活动至关重要。然而&#xff0c;出于多种原因&#xff0c;如保护隐私、访问特定网站或进行网络测试&#xff0c;我们可能需要更改IP地址。虎观代理将详细介绍IP地址的更改方法与步骤&#…

基于Java停车场管理系统设计与实现(源码+部署文档)

博主介绍&#xff1a; ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅 &#x1f447;&#x1f3fb; 不然下次找不到 Java项目精品实…

欢乐钓鱼大师秒杀源码

gg修改器设置里面单选a内存然后去试试e类型搜索鱼竿的拉杆速度然后点修改点很多增加1然后游戏返回在进去看鱼竿拉速然后在修改器的里面找到拉速一样的数值其他恢复全移除不恢复移除会闪退然后点开保留下来的拉速数值点转到会有一堆数值你得找里面找到鱼竿的伤害距离等数值就可以…

[2024最新]MySQL-mysql 8.0.11安装教程

网上的教程有很多&#xff0c;基本上大同小异。但是安装软件有时就可能因为一个细节安装失败。我也是综合了很多个教程才安装好的&#xff0c;所以本教程可能也不是普遍适合的。 安装环境&#xff1a;win 10 1、下载zip安装包&#xff1a; MySQL8.0 For Windows zip包下载地…

vscode只修改几行,git却显示整个文件都被修改

原因&#xff1a;不同的操作系统默认的回车换行符是不一样的&#xff0c;有些编辑器会自动修改回车换行&#xff0c;然后就整个文件都变化了。 Unix/Linux/Mac使用的是LF&#xff0c;但Windows一直使用CRLF【回车(CR, ASCII 13, r) 换行(LF, ASCII 10, n)】作为换行符。 解决&a…

考研数学|跟「张宇」还是「武忠祥」?看这一篇就明白了

我想告诉你&#xff0c;选择张宇老师的课程也是一个很好的选择。而且24考研压中了很多类似的题目&#xff01; 推荐张宇老师的原因不仅是课程讲的比较好&#xff0c;更因为30讲这本书是比较系统的一本参考书。 张宇老师的数学课程一直以来都备受考生的推崇&#xff0c;他的讲…

mac基础操作、快捷、软件快捷方式

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 mac基础操作、快捷、软件快捷方式 前言mac快捷操作快捷查找切换页面页面缩略访达和命令端切换创建文件夹创建文件删除文件/文件夹获取文件的路径移动文件或文件夹复制文件命令端常用命令 前言 主要是方…

前端Vue3+uni+Ts

本次记录小兔仙仙的制作过程。 先看下我们的项目截图。主要是手机端&#xff0c;这里用了uniappVScode.三端适配的。可以打包成安卓和苹果。微信小程序。 首先&#xff1a;创建一个uni新的ts项目。 # 通过 git 从 gitee 克隆下载 登录 - Gitee.com git clone -b vite-ts http…

【面试八股总结】排序算法(一)

参考资料 &#xff1a;阿秀 一、冒泡排序 冒泡排序就是把小的元素往前交换或者把大的元素往后交换&#xff0c;比较相邻的两个元素&#xff0c;交换也发生在这两个元素之间。具体步骤&#xff1a; 比较相邻的元素。如果第一个比第二个大&#xff0c;就交换他们两个。对每一对…

每日OJ题_BFS解决最短路①_力扣1926. 迷宫中离入口最近的出口

目录 力扣1926. 迷宫中离入口最近的出口 解析代码 力扣1926. 迷宫中离入口最近的出口 1926. 迷宫中离入口最近的出口 难度 中等 给你一个 m x n 的迷宫矩阵 maze &#xff08;下标从 0 开始&#xff09;&#xff0c;矩阵中有空格子&#xff08;用 . 表示&#xff09;和墙&…