>🎊上文简单介绍了线性表的顺序、链式存储结构的内容。
>🎡本篇文章会为大家介绍顺序表基本功能的实现方法。
>🎁还请喜欢的朋友们三连支持!
目录
🎡一、准备工作
首先介绍一下需要用到的头文件、赋值和重命名
#include<stdio.h>
#include <assert.h>
#include <stdlib.h>
typedef int SLDateType;
那么问题来了,为什么要给int定义一个别名呢?
因为顺序表的数据类型不一定是int类型,如果数据类型变成了double或者其他类型,直接将宏定义中的int改变成需要的类型就可以了,是不是很方便!
💥注意:对顺序表元素进行增删操作时,顺序表的有效长度要相应的增加或减少。
🎡二、定义顺序表结构
typedef struct SeqList
{
SLDateType* a;
int size;//当前数据个数
int capacity;//顺序表容量
}SeqList;
🎡三、函数声明
//菜单
void meum();
//初始化
void SeqListInit(SeqList* ps);
//销毁顺序表
void SeqListDestroy(SeqList* ps);
//打印顺序表内容
void SeqListPrint(SeqList* ps);
//判断顺序表容量是否充足,不足则扩容
void CheckCapacity(SeqList* ps);
//尾插法
void SeqListPushBack(SeqList* ps, SLDateType x);
//头插法
void SeqListPushFront(SeqList* ps, SLDateType x);
//头删法
void SeqListPopFront(SeqList* ps);
//尾删法
void SeqListPopBack(SeqList* ps);
//查找数据
int SeqListFind(SeqList* ps, SLDateType x);
//在pos位置插入数据x
void SeqListInsert(SeqList* ps, int pos, SLDateType x);
//删除pos位置的数据
void SeqListErase(SeqList* ps, int pos);
//对顺序表中的元素进行升序排列
void ListSortUp(SeqList* ps);
//清空顺序表
void ClearList(SeqList* ps);
//求顺序表的当前数据个数及存储空间
void LengthList(SeqList ps);
🎡四、基本操作的实现
✨1.初始化顺序表
//初始化
void SeqListInit(SeqList* ps)
{
assert(ps);
ps->a = NULL;
ps->size = ps->capacity = 0;
}
✨2.销毁顺序表
//销毁顺序表
void SeqListDestroy(SeqList* ps)
{
assert(ps);
free(ps->a);
ps->a = NULL;
ps->size = ps->capacity = 0;
}
✨3.打印顺序表内容
//打印顺序表内容
void SeqListPrint(SeqList* ps)
{
assert(ps);
if (ps->size == 0) printf("顺序表中无数据!\n");
else {
for (int i = 0; i < ps->size; i++)
{
printf("%d ", ps->a[i]);
}
printf("\n");
}
}
✨4.头插法插入元素
实现原理:将所有元素向后移,将新元素插入到头结点
//头插法插入元素
Status InsertFront(SqList &L,int n)
{
Status j;
if(L.size==MAXSIZE||L.size+n>MAXSIZE) //判断是否溢出
{
cout<<"储存空间不足,插入失败!"<<endl;
return ERROR;
}
for(j=L.size-1;j>=0;j--) //将元素依次向后移n位
L.elem[j+n]=L.elem[j];
for(j=0;j<n;j++) //将n个元素插到顺序表前面
{
cout<<"请输入第"<<j+1<<"个元素:";
cin>>L.elem[j];
}
L.size+=n;
ListShow(L);
return OK;
}
✨5.判断顺序表容量是否充足,不足则扩容
实现原理:判断顺序表空间是否已经满了,如果满了就增加一倍的空间
//判断顺序表容量是否充足,不足则扩容
void CheckCapacity(SeqList* ps)
{
if (ps->size == ps->capacity)
{
int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
ps->a = (SeqList*)realloc(ps->a, newcapacity * sizeof(SLDateType));
if (ps->a == NULL)
{
perror("realloc");
}
ps->capacity = newcapacity;
}
}
✨6.尾插法插入元素
实现原理:将新元素直接插入到为结点后面,若空间不足则扩容,复用SeqListInsert方法如下
//尾插法
void SeqListPushBack(SeqList* ps, SLDateType x)
{
assert(ps);
//正常方式
CheckCapacity(ps);
ps->a[ps->size] = x;
ps->size++;
////复用SeqListInsert
//SeqListInsert(ps, ps->size, x);
}
✨7.头插法插入元素
实现原理:将顺序表中的所有元素向后移,然后将要插入的数据放到第一个位置。若空间不足则扩容,复用SeqListInsert方法如下
//头插法
void SeqListPushFront(SeqList* ps, SLDateType x)
{
assert(ps);
//正常方式
CheckCapacity(ps);
int end = ps->size;
while (end)
{
ps->a[end] = ps->a[end - 1];
end--;
}
ps->a[0] = x;
ps->size++;
////复用SeqListInsert
//SeqListInsert(ps, 0, x);
}
✨8.头删法删除元素
实现原理:将顺序表中的第一个位置之后的所有元素向前移,复用SeqListErase方法如下
//头删法
void SeqListPopFront(SeqList* ps)
{
assert(ps);
//正常方式
for (int i = 0; i < ps->size - 1; i++)
{
ps->a[i] = ps->a[i + 1];
}
--ps->size;
////复用SeqListErase
//SeqListErase(ps, 0);
}
✨9.尾删法删除元素
实现原理:直接将size减一,复用SeqListErase方法如下
//尾删法
void SeqListPopBack(SeqList* ps)
{
assert(ps);
//正常方式
--ps->size;
////复用SeqListErase
//SeqListErase(ps, ps->size - 1);
}
✨10.查找元素
实现原理:依次遍历顺序表,找到要查找的元素并返回对应元素下标
//查找数据
int SeqListFind(SeqList* ps, SLDateType x)
{
for (int i = 0; i < ps->size; i++)
{
if (ps->a[i] == x) return i;
}
return -1;
}
✨11.在pos位置插入数据x
实现原理:将顺序表中pos位置之后的所有元素向后移,然后将要插入的数据放到下标为pos的位置。若空间不足则扩容
//在pos位置插入数据x
void SeqListInsert(SeqList* ps, int pos, SLDateType x)
{
assert(ps);
CheckCapacity(ps);
for (int i = ps->size - 1; i >= pos; i--)
{
ps->a[i + 1] = ps->a[i];
}
ps->a[pos] = x;
ps->size++;
}
✨12.删除pos位置的数据
实现原理:将顺序表下标为pos的位置之后的所有元素向前移
//删除pos位置的数据
void SeqListErase(SeqList* ps, int pos)
{
assert(ps);
for (int i = pos; i < ps->size - 1; i++)
{
ps->a[i] = ps->a[i + 1];
}
ps->size--;
}
✨13.对顺序表中的元素进行升序排列
//对顺序表中的元素进行升序排列
void ListSortUp(SeqList* ps)
{
assert(ps);
//冒泡排序
int i, j;
for (i = 0; i < ps->size - 1; i++)
{
for (j = 0; j < ps->size - i - 1; j++)
{
if (ps->a[j] > ps->a[j + 1])
{
int tmp = ps->a[j];
ps->a[j] = ps->a[j + 1];
ps->a[j + 1] = tmp;
}
}
}
}
✨14.清空顺序表
void ClearList(SeqList* ps)
{
assert(ps);
ps->size = 0;
}
✨15.求顺序表的当前数据个数及存储空间
//求顺序表的当前数据个数及存储空间
void LengthList(SeqList ps)
{
printf("顺序表的当前数据个数为:%d\n", ps.size);
printf("顺序表的存储空间为:%d\n", ps.capacity);
}
这就是顺序表基本的功能的实现方法,如果有什么补充及建议欢迎评论,如果有错误敬请斧正
本文详细介绍了顺序表的基本操作实现,包括初始化、销毁、打印、头尾插入删除、查找、扩容、排序等。通过C语言实现,强调了顺序表容量管理和动态扩容的重要性,同时提供了代码示例。

852

被折叠的 条评论
为什么被折叠?



