目录
线性表
是n个具有相同特性的数据元素的有限序列。常见线性表:顺序表,链表,栈,队列,字符串······
线性表在逻辑上是线性结构,也就是说是一条连续的直线。但在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组或链式结构的方式存储。
顺序表
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。
顺序表就是数组,但是在数组的基础上还要求数据是从头开始连续存储的,不能跳跃间隔。
顺序表的C语言写法
SeeqList.h
//动态顺序表
//SeqList.h
#pragma once
#include <stdio.h>
#include <stdlib.h>
//#define N 100
typedef int SLDataType; //方便修改顺序表的类型
typedef struct SeqList
{
SLDataType *a;
int size; //表示数组中存放了多少个数据
int capacity;//数组实际能存数据的空间容量是多大
}SL;
//接口函数(方便其他的调用)取名是与C++中的STL库风格一致,方便后续C++学习
void SeqListInit(SL* ps); //初始化函数
void SeqListPushBack(SL *ps,SLDataType x); //尾插数据
void SeqListDestroy(SL *ps); //销毁指针,防止野指针
void SeqListPopBack(SL *ps);
void SeqListPushFront(SL *ps,SLDataType x); //头插数据
void SeqListPopFront(SL *ps);
SeqList.c
//SeqList.c
#include "SeqList.h"
void SeqListInit(SL* ps)
//为什么用结构体指针而不直接用结构体?
//参考C语言函数传参问题
{
ps->a = NULL;
//初始化数组为空数组
ps->capacity = ps->size = 0;
//初始化数组容量为0,有效数据个数为0
}
void SeqListPushBack(SL *ps,SLDataType x)
{
//如果没有空间或者空间不足,我们就扩容(relloc)
if(ps -> capacity == ps->size)
//顺序表的容量跟顺序表已经存放的数据个数相等时
//存在两种情况:
//1.容量跟已存放个数均为0,需要重新开辟空间
//2.容量跟已存放个数相等,空间不足,需要扩容
{
int newcapacity = ps ->capacity *2 == 0 ? 4 : ps->capacity * 2;
//扩容扩两倍,也可以扩1.5倍,也可以扩3倍,2倍是折中的扩容法
SLDataType* tmp = (SLDataType*)realloc(ps->a,newcapacity*sizeof(SLDataType));
//realloc用法参考CSDN其它博客
//如果扩容失败,则报错且退出
if(tmp == NULL)
{
printf("realloc fail\n");
exit(-1);
}
ps->a = tmp;
ps->capacity = newcapacity;
}
//顺序表的容量大于已经存放的数据个数,空间充足,此时不需要开辟空间,直接插入数据
ps->a[ps->size] = x;
//插入的数据
ps->size++;
//顺序表中有效的数据个数
}
//指针的销毁
void SeqListDestroy(SL *ps)
{
ps->a = NULL;
ps->capacity=ps->size=0;
}
//尾删(最简单的一个接口函数了,我最爱啦)
void SeqListPopBack(SL *ps)
{
ps->a[ps->size-1] = 0;
//上面这句话可以丢掉,因为原来顺序表的最后一个数据可能本身就是0
if(ps->size>0)
{
ps->size--;
}
//只需要将顺序表的有效位数减一就可以实现尾删
}
main.c
用调试一步一步测试(今天学了三个小时就学了这么点,主要是C语言太多东西忘记了,该适当补补C语言了)
#include "SeqList.h"
void TestSeqList1()
{
SL sl;
SeqListInit(&sl);
SeqListPushBack(&sl,1);
SeqListPushBack(&sl,2);
SeqListPushBack(&sl,3);
SeqListPushBack(&sl,4);
SeqListPushBack(&sl,5);
SeqListPopBack(&sl);
SeqListDestroy(&sl);
}
int main()
{
TestSeqList1();
return 0;
}