顺序表是用一段物理地址连续的存储单元一次存储数据元素的线性结构,一般情况下采用数组存储
顺序表分为:
- 静态顺序表(使用地工厂数组存储)
- 动态顺序表(使用动态开辟的数组存储)
下面实现的是动态顺序表:
- C语言中没有这种结构,所以把它们封装成一个结构体,里面有不同类型的元素(数组、有效元素个数、数组总容量),便于管理
typedef int DataType;//给类型取别名 数组元素类型就很好变
typedef struct SeqList
{
DataType *_array;//有效元素(动态开辟的数组)
int _size;//有效元素个数
int _capacity;//数组的总容量(空间总大小)
}SeqList,*PSeqList;//定义了结构体变量(把struct SeqList重命名为SeqList)
- 对结构体初始化
数组的大小先设置一个初始值,不够了再扩容
void SeqListInit(PSeqList ps)
{
assert(ps);
//先设置一个容量(假设可以存放3个元素),在这个基础上再动态开辟
ps->_array = (DataType*)malloc(sizeof(DataType)* 3);
if (NULL == ps->_array)
{
return;
}
ps->_capacity = 3;
ps->_size = 0;
printf("初始化: 有效元素:%d; 容量:%d\n", ps->_size, ps->_capacity);
}
- 容量检测,看是否需要扩容,下面用的是malloc开辟新空间,relloc也可以
void CheckIsCapacity(PSeqList ps)//
{
assert(ps);
if (ps->_capacity == ps->_size)//容量和大小相等,需要扩容
{
printf("需要扩容,");
//每次扩容的大小
int newcapacity = ps->_capacity * 2;
//开辟新空间
DataType *p = (DataType*)malloc(sizeof(DataType)*newcapacity);
if (p == NULL)
{
//申请失败
printf("申请失败\n");
assert(0);
return;
}
//申请成功,拷贝元素
printf("申请成功\n");
memcpy(p, ps->_array, ps->_size*sizeof(DataType));
//释放旧空间
free(ps->_array);
ps->_capacity = newcapacity;
ps->_array = p;
}
else
{
printf("不需要扩容\n");
}
}
下来就是对顺序表进行增删改查的操作了
直接看整体代码:
SeqList.h
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include<malloc.h>
#include<assert.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//动态顺序表
typedef int DataType;//给类型取别名 数组元素类型就很好变
typedef struct SeqList
{
DataType *_array;//有效元素
int _size;//有效元素个数
int _capacity;//数组的总容量(空间总大小)
}SeqList,*PSeqList;//定义了结构体变量(把struct SeqList重命名为SeqList)
void SeqListInit(PSeqList ps);//初始化顺序表
void SeqListDestory(PSeqList ps);//对顺序表销毁
void CheckIsCapacity(PSeqList ps);//检测是否需要扩容
void SeqListPushBack(PSeqList ps, DataType data);//尾插
void SeqListPopBack(PSeqList ps);//尾删
void SeqListPushFront(PSeqList ps, DataType data);//头插
void SeqListPopFront(PSeqList ps);//头删
void SeqListInsert(PSeqList ps, int pos, DataType data);//任意位置插入 在[0,size)之间
void SeqListErase(PSeqList ps, int pos);//任意位置删除
int SeqListFind(PSeqList ps, DataType data);