所有网站域名都有,河南省建设网站首页,wordpress推荐书籍,亚马逊seo推广目录 前言
一、顺序表的概念及结构
1.1 线性表
二、顺序表分类
三、动态顺序表的实现
3.1 顺序表结构的创建以及初始化
3.2 顺序表的销毁 3.3 顺序表的打印
3.4 尾插数据 ——最困难的
3.5 头插数据
3.6 尾删数据
3.7 头部删除数据 前言
在计算机科学和数据结…目录 前言
一、顺序表的概念及结构
1.1 线性表
二、顺序表分类
三、动态顺序表的实现
3.1 顺序表结构的创建以及初始化
3.2 顺序表的销毁 3.3 顺序表的打印
3.4 尾插数据 ——最困难的
3.5 头插数据
3.6 尾删数据
3.7 头部删除数据 前言
在计算机科学和数据结构的领域内顺序表是一种基础而重要的线性结构它不仅支持高效的元素存储还允许灵活的数据操作。顺序表通常以数组作为其底层数据结构但它提供了更丰富和高级的操作接口使得顺序表在实际应用中比原始数组更加方便、高效。
顺序表的主要功能包括 动态大小顺序表能够根据需要动态增长和缩减这意味着我们可以在运行时添加或删除元素而不需要预先知道数据的确切大小。 插入和删除操作尽管顺序表的插入和删除操作可能涉及到元素的移动但通过优化策略如使用空闲空间列表这些操作的效率可以大大提高。 高效的批量操作顺序表支持对一系列连续元素的高效操作如批量插入、删除或修改元素。 随机访问与链表等其他数据结构相比顺序表的一个显著特点是能够快速地访问任意位置的元素这是因为顺序表的内存是连续分配的。
顺序表和数组的区别 :
尽管顺序表在许多实现中依赖于数组但它们之间存在一些关键的区别 动态性数组的大小在创建时固定不能轻易改变而顺序表可以动态地增长或缩减提供了更好的灵活性。 抽象级别顺序表通常被视为更高级别的抽象它封装了数组并提供了一系列便于使用的操作方法如插入、删除和查找。 容量管理顺序表内部通常有容量的概念即实际分配的存储空间大小这允许它在不重新分配整个存储区域的情况下进行动态扩展。 性能特点由于顺序表基于连续内存因此对于随机访问操作非常高效然而当涉及到频繁的插入和删除操作时数组可能需要频繁的内存复制而顺序表可以通过调整元素位置来优化这些操作。
总结来说顺序表是一种功能强大且灵活的数据结构它建立在数组的基础上通过提供动态大小、随机访问能力和高效的批量操作为数据处理提供了极大的便利。虽然在某些操作上顺序表和数组的性能特点不同但顺序表的设计旨在为用户提供一个易于管理和使用的高效数据存储结构。 正文开始
一、顺序表的概念及结构
1.1 线性表
线性表linear list是n个具有相同特性的数据元素的有限序列。 线性表是⼀种在实际中⼴泛使用的数据结构常见的线性表顺序表、链表、栈、队列、字符串...
线性表在逻辑上是线性结构也就说是连续的⼀条直线。但是在物理结构上并不⼀定是连续的 线性表在物理上存储时通常以数组和链式结构的形式存储。
案例蔬菜分为绿叶类、瓜类、菌菇类。线性表指的是具有部分相同特性的⼀类数据结构的集合 如何理解逻辑结构和物理结构
二、顺序表分类
顺序表和数组的区别
顺序表的底层结构是数组对数组的封装实现了常⽤的增删改查等接⼝
顺序表分类
静态顺序表 概念使用定长数组存储元素 静态顺序表缺陷空间给少了不够用给多了造成空间浪费 动态顺序表 三、动态顺序表的实现
3.1 顺序表结构的创建以及初始化
代码如下
SeqList.h——主要用来存放顺序表结构、声明顺序表的方法
#pragma once
#include stdio.h
#include stdlib.h
//定义顺序表结构
typedef int SLDataType;typedef struct SeqList
{SLDataType* arr; //指向那块空间的指针因为使用的是动态顺序表SLDataType size; //有效数据的大小SLDataType capacity; //整个数组能够储存多少个数据
}SL;//1.顺序表的声明
void SLInit(SL* ps);
SeqList.c——实现顺序表的方法
#define _CRT_SECURE_NO_WARNINGS 1
#include SeqList.hvoid SLInit(SL* ps)
{ps-arr NULL;ps-size ps-capacity 0;
}
test.c —— 测试文件
#define _CRT_SECURE_NO_WARNINGS 1
#include SeqList.hvoid SLTest01()
{SL s1;SLInit(s1);
}int main()
{SLTest01();return 0;
} 3.2 顺序表的销毁
代码如下
SeqList.h
//2.顺序表的销毁
void SLDestroy(SL* ps);
SeqList.c
//顺序表的销毁
void SLDestroy(SL* ps)
{if (ps-arr ! NULL){free(ps-arr);ps-arr NULL;}ps-size ps-capacity 0;
} 3.3 顺序表的打印
代码如下
SeqList.h
//3.顺序表的打印
void SLPrint(SL* ps);
SeqList.c
//打印顺序表
void SLPrint(SL* ps)
{for (int i 0; i ps-size; i){printf(%d , ps-arr[i]);}printf(\n);
}
3.4 尾插数据 ——最困难的
代码如下
SeqList.h
//4.尾部插入数据
void SLPushBack(SL* ps, SLDataType x);
SeqList.c
//尾部插入数据
void SLPushBack(SL* ps, SLDataType x)
{//首先得判断一下传入的指针是否为空指针assert(ps);//判断内存是否足够也就是能不能把数据存进去if (ps-capacity ps-size){//判断新的空间大小如果原来空间大小为0则新空间大小为4不为0则为原来空间的两倍SLDataType new_capacity (ps-capacity 0 ? 4 : 2 * ps-capacity);//给新空间分配内存SLDataType* tmp (SLDataType*)realloc(ps-arr, new_capacity * sizeof(SLDataType));//判断空间是否开辟成功if (tmp NULL){perror(realloc fail);exit(1);}ps-arr tmp;ps-capacity new_capacity;}ps-arr[ps-size] x;ps-size;
} test.c —— 这里会将上面没有演示的销毁和打印一同演示
#define _CRT_SECURE_NO_WARNINGS 1
#include SeqList.hvoid SLTest01()
{//顺序表的初始化SL s1;SLInit(s1);//尾插数据SLPushBack(s1, 1);SLPrint(s1);SLPushBack(s1, 2);SLPrint(s1);SLPushBack(s1, 3);SLPrint(s1);SLPushBack(s1, 4);SLPrint(s1);SLPushBack(s1, 4);SLPrint(s1);//顺序表的销毁SLDestroy(s1);
}int main()
{SLTest01();return 0;
} 3.5 头插数据
代码如下
SeqList.h
//5.头插数据
void SLPushFront(SL* ps, SLDataType x);
SeqList.c //头部插入数据
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[0] x;ps-size;}
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include SeqList.hvoid SLTest01()
{//顺序表的初始化SL s1;SLInit(s1);//尾插数据SLPushBack(s1, 1);SLPrint(s1);SLPushBack(s1, 2);SLPrint(s1);SLPushBack(s1, 3);SLPrint(s1);SLPushBack(s1, 4);SLPrint(s1);SLPushBack(s1, 4);SLPrint(s1);//头部插入数据SLPushFront(s1, 3);SLPrint(s1);//顺序表的销毁SLDestroy(s1);
}int main()
{SLTest01();return 0;
} 3.6 尾删数据
代码如下
SeqList.h
//6.尾部删除数据
void SLPopBack(SL* ps)
SeqList.c
//尾部删除数据
void SLPopBack(SL* ps)
{assert(ps);ps-size--;
} test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include SeqList.hvoid SLTest01()
{//顺序表的初始化SL s1;SLInit(s1);//尾插数据SLPushBack(s1, 1);SLPrint(s1);SLPushBack(s1, 2);SLPrint(s1);SLPushBack(s1, 3);SLPrint(s1);SLPushBack(s1, 4);SLPrint(s1);SLPushBack(s1, 5);SLPrint(s1);//头部插入数据SLPushFront(s1, 3);SLPrint(s1);//尾部删除数据SLPopBack(s1);SLPrint(s1);//顺序表的销毁SLDestroy(s1);
}int main()
{SLTest01();return 0;
}
3.7 头部删除数据
代码如下
SeqList.h
//7.头部删除数据
void SLPopFront(SL* ps);
SeqList.c
//头部删除数据
void SLPopFront(SL* ps)
{assert(ps);//从第二个数据依次挨个往前走for (int i 0; i ps-size; i){ps-arr[i] ps-arr[i 1];}ps-size--;
} test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include SeqList.hvoid SLTest01()
{//顺序表的初始化SL s1;SLInit(s1);//尾插数据SLPushBack(s1, 1);SLPrint(s1);SLPushBack(s1, 2);SLPrint(s1);SLPushBack(s1, 3);SLPrint(s1);SLPushBack(s1, 4);SLPrint(s1);SLPushBack(s1, 5);SLPrint(s1);//头部插入数据SLPushFront(s1, 3);SLPrint(s1);//尾部删除数据SLPopBack(s1);SLPrint(s1);//头部删除数据SLPopFront(s1);SLPrint(s1);//顺序表的销毁SLDestroy(s1);
}int main()
{SLTest01();return 0;
} 完