数据结构都分为逻辑结构和物理结构,而顺序表在逻辑上就属于线性结构
1.什么是线性结构
线性结构就是在逻辑上数据的排列是一条直线,但是在物理结构中不一定是连续的,通常通过数组或链表的形式储存
2.线性数据结构有哪些
顺序表和链表
3.什么是顺序表
上面说了顺序表是一种线性结构,顺序表用一段连续的物理地址存储数据,一般采用数组形式,分为静态顺序表和动态顺序表
静态顺序表:用定长的数组存储
动态顺序表:用动态开辟的数组存储
//静态
#define N 100
struct SeqList{
int array[N];
size_t size;//有效元素个数
};
//动态
struct SeqList {
int* array;//指向动态开辟的数组
size_t size;//有效元素个数
size_t capicity;//数组容量
};
因为静态不实用,咱们主要看动态
下面是动态顺序表的一些操作
typedef int DataType;
typedef struct SeqList {
DataType* array;
size_t capacity;//顺序表大小
int size;//有效元素个数
}SeqList, *PSeq;
//初始化
void SeqListInit(PSeq ps, int capacity) {
ps = malloc(capacity);
if (ps == NULL) {
ps = 20;
}
ps->size = 0;
}
//尾插
void SeqListPshBack(PSeq ps, DataType data) {
ps->array[ps->size] = data;
ps->size++;
}
//尾删
void SeqListPopBack(PSeq ps) {
ps->size--;
}
//头插
void SeqListPushFront(PSeq ps, DataType data) {
int k = 0;
for (k=ps->size; k>0; k--) {
ps->array[k] = ps->array[k - 1];
}
ps->array[0] = data;
ps->size++;
}
//头删
void SeqListPopFront(PSeq ps) {
int k = 1;
for (k; k < (ps->size); ++k) {
ps->array[k - 1] = ps->array[k];
}
ps->size--;
}
//在pos位置插入data
void SeqListInsert(PSeq ps, int pos, DataType data) {
if (pos<1 || pos>(ps->size - 1)) {
printf("位置错误/n");
}
else {
int k = 0;
for (k = (ps->size); k >= pos; k--) {
ps->array[k + 1] = ps->array[k];
}
ps->array[pos] = data;
ps->size++;
return 1;
}
return 0;
}
//删除pos位置的元素
void SeqListErase(PSeq ps, int pos) {
if (pos<1 || pos>(ps->size - 1)) {
printf("位置错误/n");
}
else {
int k = 0;
for (k=pos; k < (ps->size); ++k) {
ps->array[k] = ps->array[k + 1];
}
ps->size--;
}
}
//查找值为data的元素
int SeqListFind(PSeq ps, DataType data) {
for (int i = 0; i < (ps->size); ++i) {
if (ps->array[i] == data) {
return i;
}
}
return -1;
}
// 检测顺序表是否为空,如果为空返回非0值,非空返回0
int SeqListEmpty(PSeq ps) {
if (ps->size == 0) {
return 1;
}
return 0;
}
// 返回顺序表中有效元素的个数
int SeqListSize(PSeq ps) {
if (ps == NULL)
{
return 0;
}
return ps->size;
}
// 返回顺序表的容量大小
int SeqListCapacity(PSeq ps) {
if (ps == NULL)
{
return 0;
}
return ps->capacity;
}
// 将顺序表中的元素清空
void SeqListClear(PSeq ps) {
ps->size = 0;
}
// 删除顺序表中第一个值为data的元素
void SeqListRemove(PSeq ps, DataType data) {
for (int i = 0; i < (ps->size); ++i) {
if (ps->array[i] == data) {
for (int k = i + 1; k < (ps->size); ++k) {
ps->array[k - 1] = ps->array[k];
break;
}
}
break;
}
}
// 销毁顺序表
void SeqListDestroy(PSeq ps) {
ps->size = 0;
}
// 顺序表的扩容
void BigCapacity(PSeq ps) {
ps = realloc(ps, 300);
if (ps==NULL) {
ps = 20;
}
}