【零基础学数据结构】顺序表

目录

1.了解数据结构

什么是数据结构? 

为什么要进行数据管理? 

2.顺序表 

顺序表概要解析: 

​编辑顺序表的分类: 

差别和使用优先度: 

1.创建顺序表

1.1顺序表分为静态顺序表和动态顺序表

 1.2顺序表的初始化

 1.3顺序表的销毁

 1.4顺序表的打印

 1.5顺序表的扩容

1.6顺序表的头插,尾插

 1.6.1头插

1.6.2尾插

 1.7顺序表的头删,尾删

 1.7.1头删

1.7.2尾删

 1.8顺序表在指定位置之前插入,删除数据

 1.8.1 插入数据

1.8.2 删除数据

 1.9顺序表数据的查找

 测试代码:


 

1.了解数据结构

什么是数据结构? 

为什么要进行数据管理? 

 

2.顺序表 

顺序表概要解析: 

顺序表的分类: 

  • 静态顺序表
  • 动态顺序表 

差别和使用优先度: 

1.创建顺序表

1.1顺序表分为静态顺序表和动态顺序表


// 设定类型为一个全新名字,方便后续更改
typedef int SLDataType;// 静态顺序表#define N 100
typedef struct SeqList
{SLDataType arr[N];//创建数组储存数据int size;			//有效数据的数量
}SL;// 动态顺序表
typedef struct SeqList
{SLDataType* arr;//动态的空间,创建指针变量int size;		//有效数据的数量int capacity;   //空间的大小容量
}SL;

 1.2顺序表的初始化

void SLInit(SL* ps);
// 顺序表的初始化
void SLInit(SL* ps)
{ps->arr = NULL;				//将顺序表指针置为NULLps->size = ps->capacity = 0;//将其他数据置为0
}// 顺序表的销毁
void SLDestroy(SL* ps)
{if (ps->arr)   //判断ps->arr是否为NULL,如果不为NULL,说明空间需要释放{free(ps->arr);}ps->arr = NULL;ps->size = ps->capacity = 0;
}

 1.3顺序表的销毁

void SLDestroy(SL* ps);
// 顺序表的销毁
void SLDestroy(SL* ps)
{if (ps->arr)   //判断ps->arr是否为NULL,如果不为NULL,说明空间需要释放{free(ps->arr);}ps->arr = NULL;ps->size = ps->capacity = 0;
}

 1.4顺序表的打印

void SLPrint(SL* ps);
// 顺序表的打印
void SLPrint(SL* ps)
{for (int i = 0; i < ps->size; i++){printf("%d ", ps->arr[i]);}printf("\n");
}

 1.5顺序表的扩容

void SLCheckCapacity(SL* ps);
// 顺序表的扩容
void SLCheckCapacity(SL* ps)
{// 判断容量是否够用if (ps->capacity == ps->size){//执行扩容//检验原先的容量,如果有在原先容量*2,没有的话就先分配4。int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;// 为了防止空间申请失败返回NULL,先用临时变量tmp接收SLDataType* tmp = (SLDataType*)realloc(ps->arr, newCapacity * sizeof(SLDataType));//申请失败提前返回if (tmp == NULL){printf("perror realloc!");return;}//申请成功ps->arr = tmp;ps->capacity = newCapacity;}
}

1.6顺序表的头插,尾插

 1.6.1头插

void SLPushFront(SL* ps, SLDataType x);
//头插
void SLPushFront(SL* ps, SLDataType x)
{assert(ps);//断言防止传入空指针// 插入之前判断空间容量是否够SLCheckCapacity(ps);//进行头插for (int i = ps->size; i > 0; i--){ps->arr[i] = ps->arr[i - 1];//ps->arr[1]=ps->arr[2]}ps->arr[0] = x;ps->size++;
}

 

1.6.2尾插

void SLPushBack(SL* ps, SLDataType x);
void SLPushBack(SL* ps, SLDataType x)
{assert(ps);//断言防止传入空指针// 插入之前判断空间容量是否够SLCheckCapacity(ps);//进行尾插ps->arr[ps->size++] = x;
}

 

 1.7顺序表的头删,尾删

 1.7.1头删

void SLPopFront(SL* ps);
//头删
void SLPopFront(SL* ps)
{assert(ps);//断言防止传入空指针//防止顺序表没有数据可以删除assert(ps->size);//进行头删操作for (int i = 0; i < ps->size - 1; i++){ps->arr[i] = ps->arr[i + 1];//ps->arr[size-2]=ps->arr[size-1]}ps->size--;
}

 

1.7.2尾删

void SLPopBack(SL* ps);
//尾删
void SLPopBack(SL* ps)
{assert(ps);//断言防止传入空指针//防止顺序表没有数据可以删除assert(ps->size);//进行尾删操作ps->size--;
}

 

 1.8顺序表在指定位置之前插入,删除数据

 1.8.1 插入数据

void SLInsert(SL* ps, int pos, SLDataType x);
//在指定位置之前插入数据
void SLInsert(SL* ps, int pos, SLDataType x)
{assert(ps);//断言防止传入空指针//判断插入的数据是否合法if (pos >= 0 && pos <= ps->size){// 插入之前判断空间容量是否够SLCheckCapacity(ps);//插入数据for (int i = ps->size; i > pos; i--){ps->arr[i] = ps->arr[i - 1];//ps->arr[pos+1]=ps->arr[pos];}ps->arr[pos] = x;ps->size++;}}

 

1.8.2 删除数据

void SLErase(SL* ps, int pos);
//在指定位置之前删除数据
void SLErase(SL* ps, int pos)
{assert(ps);//断言防止传入空指针//判断删除的数据是否合法if (pos >= 0 && pos < ps->size){// 删除数据for (int i = pos; i < ps->size - 1; i++){ps->arr[i] = ps->arr[i + 1];//ps->[size-2]=ps->arr[size-1]}ps->size--;}
}

 

 1.9顺序表数据的查找

int SLFind(SL* ps, SLDataType x); 
// 1.9顺序表数据的查找
int SLFind(SL* ps, SLDataType x)
{assert(ps);//断言防止传入空指针//遍历顺序表for (int i = 0; i < ps->size; i++){if (ps->arr[i] == x){return i;//返回下标}}// 没有找到return -1;//返回一个不存在的下标
}

 测试代码:

#include "SeqList.h"void SLText01()
{SL sl;//初始化SLInit(&sl);//打印//SLPrint(&sl);//增删查改//头插//SLPushFront(&sl, 1);//SLPushFront(&sl, 2);//SLPushFront(&sl, 3);//SLPushFront(&sl, 4);//SLPrint(&sl);// 4 3 2 1//头删/*SLPopFront(&sl);SLPopFront(&sl);SLPopFront(&sl);SLPrint(&sl);*///尾插//SLPushBack(&sl, 1);//SLPushBack(&sl, 2);//SLPushBack(&sl, 3);//SLPushBack(&sl, 4);//SLPrint(&sl);// 1 2 3 4//尾删//SLPopBack(&sl);//SLPopBack(&sl);//SLPopBack(&sl);//SLPopBack(&sl);//SLPrint(&sl);在指定位置之前插入数据//SLPushFront(&sl, 1);//SLPushFront(&sl, 2);//SLPushFront(&sl, 3);//SLPushFront(&sl, 4);//SLPrint(&sl);// 4 3 2 1//SLInsert(&sl, 4, 6);//SLPrint(&sl);// 4 3 2 6 1//在指定位置之前删除数据//SLPushFront(&sl, 1);//SLPushFront(&sl, 2);//SLPushFront(&sl, 3);//SLPushFront(&sl, 4);//SLPrint(&sl);// 4 3 2 1//SLErase(&sl, 2);//SLPrint(&sl);// 4 3  1// 1.9顺序表数据的查找//SLPushFront(&sl, 1);//SLPushFront(&sl, 2);//SLPushFront(&sl, 3);//SLPushFront(&sl, 4);//printf("顺序表中有:");//SLPrint(&sl);// 4 3 2 1//int find = SLFind(&sl, 6);//if (find > 0)//{//	printf("找到了!下标是:%d\n", find);//}//else//{//	printf("没有找到!\n");//}//销毁SLDestroy(&sl);}int main()
{SLText01();return 0;
}

 源代码文件:SeqList_2024_4_3 · 14c5b99 · 阳区欠/C语言学习路程 - Gitee.com

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

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

相关文章

certum泛域名ssl证书低至230元一年

Certum是一家国际知名的证书颁发机构&#xff0c;创建于欧洲&#xff0c;自1998年建立&#xff0c;几十年来每年都经过WebTrust审核&#xff0c;旗下的数字证书产品应用日益广泛。Certum旗下的数字证书类型丰富&#xff0c;而泛域名SSL证书是一种特殊的数字证书&#xff0c;它可…

Jenkins--任务详解

一、任务类型 Jenkins的主要功能的实现是由执行任务去完成的&#xff0c;常用的任务类型主要有以下三种&#xff1a; 自由风格任务(Free Style Project): 这是Jenkins中最常用的任务类型&#xff0c;允许你自定义各种构建步骤和配置选项&#xff0c;如源码管理、构建触发器、…

3.java openCV4.x 入门-数据类型(CvType)与Scalar

专栏简介 &#x1f492;个人主页 &#x1f4f0;专栏目录 点击上方查看更多内容 &#x1f4d6;心灵鸡汤&#x1f4d6;我们唯一拥有的就是今天&#xff0c;唯一能把握的也是今天 &#x1f9ed;文章导航&#x1f9ed; ⬆️ 2.hello openCV ⬇️ 4.待更新 数据类型&#xff…

蓝牙BLE开发——如何实时监听蓝牙适配器状态变化及回调

uniapp 监听蓝牙适配器状态变化事件 近年来开发项目中接触比较多的与硬件设备对接&#xff0c;通过蓝牙与设备通讯&#xff1b;开发 App、微信小程序&#xff0c;今天分享其中如何监听蓝牙适配&#xff1b;近期比较忙&#xff0c;不定时更新&#xff0c;有时间会分享 uniapp开发…

【浅谈面向过程和面向对象的区别】

面向对象和面向过程是两种不同的编程范式&#xff0c;它们在处理问题和构建软件时有着显著的区别。 一、面向过程 1、基本概念 面向过程编程是一种早期的程序设计范型&#xff0c;它以事件为中心&#xff0c;主要关注“怎么做”&#xff0c;即完成任务的具体步骤。它将问题分…

用于无人机小型化设计的高精度温补晶振

用于无人机小型化设计的高精度温补晶振:TG2016SMN和TG2520SMN。无人机的发展可以说是非常的迅速&#xff0c;在安防&#xff0c;农业&#xff0c;交通&#xff0c;电力&#xff0c;直播等领域经常能看到无人机大显身手。无人机的应用场最是非常的广泛&#xff0c;功能更强&…

每日面经分享(python part1)

Python中的深拷贝和浅拷贝的区别是什么&#xff1f; a. 浅拷贝创建一个新的对象&#xff0c;但其中的可变元素仍然共享引用。只有对象的第一层被复制&#xff0c;而更深层次的嵌套对象仍然是引用。更改其中一个对象的属性会影响到其他对象。 b. 深拷贝创建一个完全独立的新对象…

C++——异常机制

目录 一&#xff0c;背景 1.1 C语言处理错误的方式 1.2 C异常概念 二&#xff0c;异常的使用 2.1 异常的简单使用 2.2 异常的匹配原则 2.3 异常抛对象 2.4 异常的重新抛出 2.5 异常安全 三&#xff0c;自定义异常体系 四&#xff0c;异常优缺点 4.1 优点 4.2 缺点 …

对【AI技术创业】有哪些机会进行分析和引导

文章目录 方向一&#xff1a;行业解决方案,以下是一些常见的行业解决方案&#xff1a;方向二&#xff1a;智能产品和服务,以下是一些智能产品和服务的示例&#xff1a;方向三&#xff1a;教育和培训 1.智能客户服务&#xff1a; 利用自然语言处理&#xff08;NLP&#xff09;和…

day10 java封装性

封装性 为什么有封装性&#xff1f; 为了保护数据不被随意修改&#xff0c;隐藏类的实现细节。增强了代码的安全性和可维护性。 该隐藏隐藏 该暴露暴露 封装性的实现&#xff1f; 让调用者只能通过方法操作属性。可以在方法中加入一些限制条件或数据检查的操作。 封装性的直…

局域网与城域网(练习题)

局域网与城域网 ⭐️⭐️⭐️⭐️ 红色标记为答案⭐️⭐️⭐️⭐️ ⭐️⭐️⭐️ 蓝色标记为要点解析⭐️⭐️⭐️ 1.以下关于VLAN标记的说法中&#xff0c;错误的是&#xff08;&#xff09;。 A.交换机根据目标地址和VLAN标记进行转发决策 B.进入目的网段时&#xff0c;交换机…

ansible-自动化工具

一、ansible概述 不是C/S架构&#xff0c;就是一种工具 1&#xff1a;linux自动化运维 编写程序实现运维自动化&#xff1a;shell python 工具模式自动化&#xff1a; ①OS Provisioning&#xff1a; RedHat satellite&#xff1b;PXE&#xff08;可实现dhcp和tftp&#…