顺序表的具体使用方法.数据解构(二)
创始人
2024-05-16 06:47:08
0次

前言

提示:文本为数据解构(一)后续补充文:

本文具体讲解顺序表的具体使用方法


提示:以下是本篇文

系列文章目录

第一章 数据解构(一)


文章目录

前言

系列文章目录

一、静态的使用方式

二、动态的使用方式

1.定义一个结构体

2.初始化

3.扩容

4.尾加

5.尾减

6.头加

7.头减

8.查找

9.删除pos位置的值

10.pos位置插入x

11.销毁

总结


提示:以下是本篇文章正文内容,下面案例可供参考

回顾上文说到

 顺序表可以分为两种:

动态

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

静态

使用固定长度数组存储元素

一、静态的使用方式

代码如下(示例):

#define N 10//定义一个常量的宏
typedef int SLDataType;//从新定义int 的名称
typedef struct SeqList
{SLDataType a[N];//开辟一个固定大小的数组int size;		//有效数据个数int capacity;	//空间大小
}SL;

 

 

二、动态的使用方式

制作一个可以增,删,改,查,可扩容的数组

1.定义一个结构体

代码如下(示例):

typedef int SLDataType;//从新定义int 的名称typedef struct SeqList
{SLDataType* a;//开辟动态大小int size;		//有效数据个数int capacity;	//空间大小
}SL;

 SLDataType* a;//开辟动态大小
  int size;        //有效数据个数

  int capacity;    //空间大小

2.初始化

代码如下(示例):

void SListInit(SL* ps1)
{ps1->a = NULL;//把大小为空ps1->size = ps1->capacity = 0;//可用为0}

3.扩容

增容的目的是为了在输入数据时有可用空间

 代码如下(示例):

void SLCheckcapicity(SL* ps1)
{if (ps1->capacity == ps1->size){//当空间大小为0时给开辟4个空间//如果有空间就把以前的空间乘2int newcapicity = ps1->capacity == 0 ? 4 : ps1->capacity * 2;SLDataType* tmp = (SLDataType*)realloc(ps1->a, newcapicity * sizeof(int*));if (tmp ==NULL){printf("扩容失败");exit(-1);}ps1->a = tmp;//扩容好后的空间给aps1->capacity = newcapicity;//把范围大小给capacity}
}

4.尾加

 代码如下(示例):

void SLPushback(SL* ps1, SLDataType x)
{SLCheckcapicity(ps1);//先判度空间是否充足ps1->a[ps1->size] = x;ps1->size++;
}

5.尾减

 代码如下(示例):

void SLPopback(SL* ps1)
{if (ps1->size > 0){ps1->a[ps1->size-1] = 0;ps1->size--;}}

6.头加

 代码如下(示例):

void SLPushFront(SL* ps1, SLDataType x)
{SLCheckcapicity(ps1);int end = ps1->size - 1;while (end >= 0){ps1->a[end + 1] = ps1->a[end];end--;} ps1->a[0] = x;ps1->size++;
}

7.头减

 代码如下(示例):

void SLPopFront(SL* ps1) 
{int begin = 1;while (begin< ps1->size){ps1->a[begin-1] = ps1->a[begin];begin++;}ps1->size--;
}

8.查找

 代码如下(示例):

void SLFind(SL* ps1, SLDataType x)
{for (int i = 0; i < ps1->size; i++){if (ps1->a[i] == x) {return i;}}return -1;
}

9.删除pos位置的值

 代码如下(示例):

void SLErase(SL* ps1, int pos)
{if (pos <= ps1->size && pos >= 0){int begin = pos;while (begin size){ps1->a[begin-1] = ps1->a[begin];begin++;}ps1->size--;}
} 

10.pos位置插入x

 代码如下(示例):

void SLInsert(SL* ps1, int pos, SLDataType x)
{//这里的主要操作为选择的数不为下标而是数int y = pos == 0 ? pos : pos - 1;//因为顺表是连续的所以说不可以跳if (pos < ps1->size && pos >= 0){SLCheckcapicity(ps1);//判断是否需扩int end = ps1->size;while (end >= y){ps1->a[end + 1] = ps1->a[end];end--;}ps1->a[y] = x;ps1->size++;}
}

11.销毁

 代码如下(示例):

void SLDestory(SL* ps1)
{int Destory = ps1->a[0];while (ps1->size>=Destory){ps1->size--;}
}

总结

提示:这里对文章进行总结:

链表的问题是必须在内存中是连续存储,实践发现多次的使用,pos位置插入x可能会导致整个数组的顺序会有变化。

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...