线性表—>顺序表1
实现顺序表的增、删、查、改
线性表分为顺序表和链表,这篇首先写的是顺序表的一些最最最最基本的操作~~增、删、查、改
0.包含头文件
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
//静态顺序表(大小固定,编译期间决定的)
typedef int SLDataType;
//动态顺序表(在程序运行期间可以动态控制容量的大小)
typedef struct SeqList
{
SLDataType *array; //指向堆上的空间,存放数据
int capacity; //容量
int size; //有效个数
} SeqList;
创建、销毁 --顺序表
void SeqListInit(SeqList *pSeqList)//创建
{
//期望传进来的是一个变量的地址
//变量的地址肯定不是NULL
assert(pSeqList != NULL);
//开辟空间,设置容量和size
pSeqList->capacity = 10;
pSeqList->array =
(int*)malloc(sizeof(SLDataType)*pSeqList->capacity);
//assert(pSeqList->array != NULL);
pSeqList->size = 0;
}
void SeqListDestroy(SeqList *pSeqList)//销毁
{
assert(pSeqList != NULL);
assert(pSeqList->array != NULL);
free(pSeqList->array);
pSeqList->array = NULL;
pSeqList->capacity = 0;
pSeqList->size = 0;
}
1.增-头插-尾插-指定位置的插入
//尾插
void SeqListPushBack(SeqList *pSeqList,
SLDataType value)
{
CheckCapacity(pSeqList);
pSeqList->array[pSeqList->size] = value;
pSeqList->size++;
}
//头插
void SeqListPushFront(SeqList *pSeqList,
SLDataType value)
{
CheckCapacity(pSeqList);
//i 是空间的下标
for (int i = pSeqList->size; i >= 1; --i)
{
pSeqList->array[i] = pSeqList->array[i-1];
}
pSeqList->array[0] = value;
pSeqList->size++;
}
//根据下标pos做插入
void SeqListPopInsert(SeqList *ps, int pos,
SLDataType value)
{
CheckCapacity(ps);
//pos[0,size] i 是数据的下标
for (int i = ps->size - 1; i >= pos; i--)
{
ps->array[i + 1] = ps->array[i];
}
ps->array[pos] = value;
ps->size++;
}
内存扩容
注意:如果内存不够则需要扩容
//链接属性:从外部链接属性 到 内部链属性
static void CheckCapacity(SeqList *ps)
{
//不需要扩容的情况
if (ps->size <= ps->capacity)
{
return;
}
//需要扩容。且一般情况要扩容到2倍
int newCapacity = ps->capacity * 2;
SLDataType *newArray =
(SLDataType *)malloc(sizeof(SLDataType)* newCapacity);
assert(newArray != NULL);
//搬家
for (int i = 0; i < ps->size; ++i)
{
newArray[i] = ps->array[i];
}
//释放原来的空间,绑定新空间
free(ps->array);
ps->array = newArray;
ps->capacity = newCapacity;
}
2.删-头删-尾删-指定位置的删除
//尾删
void SeqListPopBack(SeqList *ps)
{
assert(ps->size > 0);
ps->size--;
}
//头删
void SeqListPopFront(SeqList *ps)
{
assert(ps->size > 0);
for (int i = 0; i < ps->size - 1; i++)
{
ps->array[i] = ps->array[i + 1];
}
ps->size--;
}
//删除pos下标所对应的值
void SeqListErase(SeqList *ps, int pos)
{
assert(ps->size > 0);
//[0,size-1]
for (int i = pos + 1; i < ps->size; i++)
{
ps->array[i - 1] = ps->array[i];
}
ps->size--;
}
3.查找、修改某一个元素
//查找
int SeqListSearch(const SeqList *ps,
SLDataType value)
{
for (int i = 0; i < ps->size; ++i)
{
if (ps->array[i] == value)
{
return i;
}
}
return -1;
}
//修改 pos 下标所在的值为 value
void SeqListModify(SeqList *ps, int pos,
SLDataType value)
{
assert(pos >= 0 && pos < ps->size);
ps->array[pos] = value;
}
删除特定的元素
//删除遇到的第一个value
void SeqListRemove(SeqList *ps, SLDataType value)
{
int pos = SeqListSearch(ps, value);
if (pos != -1)
{
SeqListErase(ps, pos);
}
}
//删除遇到的所有的value
void SeqListRemoveAll(SeqList *ps, SLDataType value)
{
int i = 0;
int j = 0;
for (; i < ps->size; ++i)
{
if (ps->array[i] != value)
{
ps->array[j] = ps->array[i];
j++;
}
}
ps->size = j;
}
顺序表中更多的详细操作:https://blog.csdn.net/qq_43763344/article/details/89236019