顺序表概念以及结构
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。
顺序表一般可分为:
1. 静态顺序表:使用定长数组存储。
2. 动态顺序表:使用动态开辟的数组存储。
//循序表的静态存储
#define N 100
typedef int SLDataType;
typedef struct SeqList
{
SLDataType array[N];//定长数组
size_t size;//有效数据的个数
}SeqList;
//顺序表的静态存储
typedef struct SeqList
{
SLDataType* array;//指向动态开辟的数组
size_t size;//有效数据个数
size_t capicity;//容量空间的大小
}SeqList;
接口实现
静态顺字表只适用于确定知道需要存多少数的场,静态顺序表的定长数组导致N定大了,空间开多
了浪费,开少了不够用。所以现实中基本都是使用动态顺序表,根据需要动态的分配空间大小,所以下面我们实现动态顺序表。
typedef int SLDateType;
typedef struct SeqList
{
SLDateType* a;
size_t size;
size_t capacity; // unsigned int
}SeqList;
// 对数据的管理:增删查改
void SeqListInit(SeqList* ps);//顺序表初始化
void SeqListDestory(SeqList* ps);//顺序表销毁
void SeqListPrint(SeqList* ps);//顺序表打印
void SeqListPushBack(SeqList* ps, SLDateType x);//顺序表尾插
void SeqListPushFront(SeqList* ps, SLDateType x);//顺序表头插
void SeqListPopFront(SeqList* ps);//顺序表头删
void SeqListPopBack(SeqList* ps);//顺序表尾删
// 顺序表查找
void SeqListFind(SeqList* ps, SLDateType x);
// 顺序表在pos位置插入x
void SeqListInsert(SeqList* ps, size_t pos, SLDateType x);
// 顺序表删除pos位置的值
void SeqListErase(SeqList* ps, size_t pos);
顺序表的增删查改
- 头文件SeqList.h
#pragma once
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
typedef int SLDateType;
typedef struct SeqList
{
SLDateType* a;
size_t size;
size_t capacity; // unsigned int
}SeqList;
// 对数据的管理:增删查改
void SeqListInit(SeqList* ps);//顺序表初始化
void SeqListDestory(SeqList* ps);//顺序表销毁
void SeqListPrint(SeqList* ps);//顺序表打印
void SeqListPushBack(SeqList* ps, SLDateType x);//顺序表尾插
void SeqListPushFront(SeqList* ps, SLDateType x);//顺序表头插
void SeqListPopFront(SeqList* ps);//顺序表头删
void SeqListPopBack(SeqList* ps);//顺序表尾删
// 顺序表查找
void SeqListFind(SeqList* ps, SLDateType x);
// 顺序表在pos位置插入x
void SeqListInsert(SeqList* ps, size_t pos, SLDateType x);
// 顺序表删除pos位置的值
void SeqListErase(SeqList* ps, size_t pos);
- SeqList.c
#include"SeqList.h"
void SeqListInit(SeqList* ps)
{
ps->a = (SLDateType*)malloc((sizeof(SLDateType)* 4));
if (ps->a == NULL)
{
printf("malloc fail\n");
exit(-1);
}
ps->size = 0;
ps->capacity = 4;
}
void SeqListDestory(SeqList* ps)
{
free(ps->a);
ps->a = NULL;
ps->size = ps->capacity = 0;
}
void SeqListPrint(SeqList* ps)
{
for (int i = 0; i < ps->size; ++i)
{
printf("%d ", ps->a[i]);
}
printf("\n");
}
void CheckCapacity(SeqList* ps)
{
if (ps->size == ps->capacity)
{
SLDateType* temp = (SLDateType*)realloc(ps->a,sizeof(SLDateType)*ps->capacity * 2);
if (temp == NULL)
{
printf("realloc fail\n");
exit(-1);
}
ps->a = temp;
ps->capacity *= 2;
}
}
void SeqListPushBack(SeqList* ps, SLDateType x)
{
assert(ps);
CheckCapacity(ps);
ps->a[ps->size] = x;
++ps->size;
}
void SeqListPushFront(SeqList* ps, SLDateType x)
{
assert(ps);
CheckCapacity(ps);
for (int i = ps->size; i > 0; --i)
{
ps->a[i] = ps->a[i - 1];
}
ps->a[0] = x;
}
void SeqListPopFront(SeqList* ps)
{
assert(ps);
for (int i = 0; i <= ps->size-2; ++i)
{
ps->a[i] = ps->a[i + 1];
}
ps->size--;
}
void SeqListPopBack(SeqList* ps)
{
assert(ps);
assert(ps->size>0);
ps->size--;
}
void SeqListFind(SeqList* ps, SLDateType x)
{
assert(ps);
for (int i = 0; i < ps->size; ++i)
{
if (ps->a[i] == x)
{
printf("找到该数字了,它的位置在%d\n", i);
break;
}
}
printf("找不到该数字\n");
}
void SeqListInsert(SeqList* ps, size_t pos, SLDateType x)
{
assert(ps);
CheckCapacity(ps);
assert(ps->size >= pos&&pos > 0);
for (int i = ps->size; i >=pos; --i)
{
ps->a[i] = ps->a[i - 1];
}
ps->a[pos - 1] = x;
++ps->size;
printf("已经放入\n");
}
void SeqListErase(SeqList* ps, size_t pos)
{
assert(ps);
assert(ps->size >= pos&&pos > 0);
for (int i = pos; i < ps->size; ++i)
{
ps->a[i-1] = ps->a[i];
}
--ps->size;
}
- 测试Test.c
#include"SeqList.h"
int main()
{
SeqList sl;
SeqListInit(&sl);
SeqListPushBack(&sl, 1);
SeqListPushBack(&sl, 2);
SeqListPushBack(&sl, 3);
SeqListPushBack(&sl, 4);
SeqListPushBack(&sl, 5);
SeqListPushBack(&sl, 6);
SeqListPushBack(&sl, 7);
SeqListPushBack(&sl, 8);
SeqListPushBack(&sl, 9);
SeqListPushBack(&sl, 10);
SeqListPushBack(&sl, 11);
SeqListPushBack(&sl, 12);
SeqListPushBack(&sl, 13);
SeqListPushBack(&sl, 14);
SeqListPushBack(&sl, 15);
SeqListPushBack(&sl, 16);
SeqListPushBack(&sl, 17);
SeqListPrint(&sl);
SeqListPushBack(&sl,78 );
SeqListPrint(&sl);
SeqListPushFront(&sl, 32);
SeqListPrint(&sl);
SeqListPopFront(&sl);
SeqListPrint(&sl);
SeqListPopBack(&sl);
SeqListPrint(&sl);
SeqListFind(&sl, 15);
SeqListInsert(&sl, 6, 4);
SeqListPrint(&sl);
SeqListErase(&sl, 6);
SeqListPrint(&sl);
}