一 . 线性表
线性表 ( linear list ) 是 n 个具有相同特性的数据元素的有限序列 。 线性表是一种在实际中广泛使用 数据结构 , 常见的线性表 : 顺序表 , 链表 , 栈 ,队列 , 字符串 ...
线性表在逻辑上是线性结构 , 也就说是连续的一条直线 。 但是在物理结构上并不一定是连续的, 线性表在物理上存储时 , 通常以数组和链式结构的形式存储 。
二 . 顺序表
2.1 概念与结构
概念 : 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构 , 一般情况下采用数组存储 。
顺序表的底层结构是数组
顺序表和数组的区别?
- 顺序表的底层结构是数组 , 对数组的封装 , 实现了常用的增删改查等接口
做个比方:
注 :在后续更新的 数据结构与算法 的文章中 , 会在 C 的程度上有难度的升级 , 不过会 深刻 的体会到手撕代码的快乐,体会代码的暴力美学 ,头脑风暴的完善每一行代码!不过得掌握一定的C语言知识 --- 结构体,指针(一级,二级) ,结构体,结构体指针,动态内存管理。
2.2 静态顺序表
概念 : 使用定长数组存储元素
#define N 1000
typedef char SLDataType;
typedef struct SeqList
{
SLDataType arr[N];
int size;
}SL;
静态顺序表的缺陷 : 空间给少了 , 不够用 ;(这个得划重点 , 在工作中 , 如果空间不够用了,造成客户流失了 , 后果 ~ ) ,空间给多了,会造成空间的浪费 (在大型企业中,各个程序员都浪费一点,那么~)
2.3 动态顺序表
按照需申请空间 , 可以扩容。
typedef int SLDataType;
typedef struct SeqList
{
SLDataType* arr;
int size;//有效数据个数
int capacity;//容量大小
}SL;
动态顺序表的实现:在数组尾部插入数据元素(尾插)
先创建两个源文件,和一个头文件
SeqList . c --------------------> 定义函数
SeqList . h --------------------> 声明函数(类似目录)
test . c --------------------> 测试文件
在定义尾插函数的时候 ,会出现空间足够 以及空间不足的两种情况:
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "SeqList.h"
void SLTest()
{
SL sl;
InitSq(&sl);
SLPushBack(&sl, 1);
SLPushBack(&sl, 2);
SLPushBack(&sl, 3);
SLPushBack(&sl, 4);
SLPushBack(&sl, 5);
}
int main()
{
SLTest();
return 0;
}
SeqList.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "SeqList.h"
//初始化
void InitSq(SL* ps)
{
ps->arr = NULL;
ps->size = 0;
ps->capacity = 0;
}
//尾插
void SLPushBack(SL* ps, SLDataType x)
{
//断言 ,以防传递过来的是空指针
assert(ps);
//防止capacity 是 0 ,导致的无法增容
int newcapacity = ps->capacity == 0 ? sizeof(SLDataType) : ps->capacity * 2;
if (ps->capacity == ps->size)
{
//空间不够大 , 使用realloc 进行扩容
SLDataType* tmp = (SLDataType*)realloc(ps->arr, newcapacity * sizeof(SLDataType));
if (tmp == NULL)
{
perror("realloc fail!");
return 1;
}
ps->arr = tmp;
ps->capacity = newcapacity;
}
//如果空间足够大
ps->arr[ps->size++] = x;
}
SeqList.h
#pragma once
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
//创建动态顺序表
typedef int SLDataType;
typedef struct SeqList
{
SLDataType*arr;
int size;
int capacity;
}SL;
//初始化
void InitSq(SL*ps);
//尾插
void SLPushBack(SL* ps, SLDataType x);