无锡做网站公司电话,什么网站流量高,wordpress 所有标签,wordpress 漏洞 下载0.引言
在本章之后#xff0c;就要求大家对于指针、结构体、动态开辟等相关的知识要熟练的掌握#xff0c;如果有小伙伴对上面相关的知识还不是很清晰#xff0c;要先弄明白再过来接着学习哦#xff01;
那进入正题#xff0c;在讲解顺序表之前#xff0c;我们先来介绍…0.引言
在本章之后就要求大家对于指针、结构体、动态开辟等相关的知识要熟练的掌握如果有小伙伴对上面相关的知识还不是很清晰要先弄明白再过来接着学习哦
那进入正题在讲解顺序表之前我们先来介绍线性表这个数据结构。
0.1 线性表
线性表是 n个具有相同特性的数据元素组成的有限的序列。相同特性同一种数据类型有限数据元素的个数是有限的
常见的线性表顺序表、链表、栈、队列、字符串等。
0.2 线性表的逻辑结构和物理结构
0.2.1 逻辑结构
线性表的逻辑结构是线性结构线性结构 是一条连续的直线也就是说 线性表在逻辑上是连续的比如我们在C语言学过的的数组顺序表指针可以构成链表。 上图分别为顺序表跟链表他们在逻辑结构上都是一个接着一个连续的。然而在物理结构他们还依旧连续吗
0.2.2 线性表的物理结构
线性表在物理结构上不一定连续我们可以构成线性表的结构有数组和指针指针又被称作链式结构。
当线性表是由数组构成时 它在逻辑结构是连续的物理结构也一定连续因为数组是一个一个挨着的空间在地址上是紧挨着的所以是连续的。
如图 当线性表为链式结构时 链式结构在逻辑上一定是连续的因为我们可以通过指针就找到该指针对应的地址 但指针的地址不一定是连续的我们可以这存一个那存一个通过指针给他们链接起来。
如图 当了解了线性表之后就让我们一起学习第一种数据结构——顺序表吧
1. 顺序表
1.1概念
顺序表是 用一段物理地址连续的存储单元依次存储数据元素的线性结构通常采用数组的形式存储。在数组上完成数据的增删查改。
1.2 顺序表的分类
1.2.1 静态顺序表
静态顺序表指的是利用定长数组来存储元素 //顺序表的静态存储
#define N 7 //顺序表一次开辟的空间个数
typedef int SLDataType; //将数据类型重命名以便我们未来换用其他的数据类型
typedef struct SeqList
{SLDataType arr[N]; //定长数组size_t size; //有效的数据个数size_t指的是无符号整型
}Seqlist; 我们在使用静态顺序表的时候只能每次开辟N个大小的空间这也就要求我们在使用之前就要想好你要存放多少个数据非常不灵活所以我们大多时候不使用静态顺序表而是改用动态顺序表作为我们日常应用。
1.2.2 动态顺序表
动态顺序表使用动态开辟的数组存储。
1. 动态顺序表的定义
typedef int SLDataType; //数据类型的重命名方便更改数据类型
typedef struct SeqList
{SLDataType *a; //指向动态开辟的数组int size; //有效的数据个数int capacity; //动态开辟的数组的容量
}SL;
2.初始化
void SLInit(SL*ps) //初始化
{ps-a (SLDataType*)malloc(sizeof(SLDataType)*4);if(ps-a NULL){perror(malloc);exit(EXIT_FAILURE);}ps -size 0;ps -capacity 4;
}
3.退出程序时的销毁
void SLDestroy(SL*ps) //退出时销毁
{free(ps-a);ps-a NULL;ps-size 0;ps-capacity 0;
}
4.尾插尾删
尾插
void SLPushBack(SL*ps,int i)
{SLCheckCapacity(ps);ps-a[ps-size] i;ps-size;
}尾删
void SLPopBack(SL*ps)
{assert(ps-size 0);ps-size--;
}
5.头插头删
头插
void SLPushFront(SL*ps,int i)
{SLCheckCapacity(ps);int end ps-size;for(;end - 1 0 ; end--){ps-a[end] ps-a[end - 1];}ps-a[0] i;ps-size;
}///头删
void SLPopFront(SL*ps)
{assert(ps-size 0);int i 0;for(i 0 ; i 1 ps-size ; i){ps-a[i] ps-a[i1];}ps-size--;
}
6.扩容
void SLCheckCapacity(SL*ps) //扩容函数
{if(ps-size ps-capacity){SLDataType *tmp (SLDataType*)realloc(ps-a,((sizeof(SLDataType)) * ((ps-capacity) * 2)));if(tmp NULL){perror(realloc);exit(EXIT_FAILURE);}ps - a tmp;ps-capacity * 2;}
}
7.打印
void SLPrint(SL*ps) //打印
{int i 0;for(i 0 ; i ps-size ;i){printf(%d ,ps-a[i]);}printf(\n);
}
以上就是顺序表的相关接口实现。