本文内容包括:
接下来我们来了解一下C语言中的数据结构:顺序表,其实顺序表的底层逻辑是数组,顺序表的出现其实就是方便我们对于数据的管理接下来我们就要对于顺序表的数据进行增删改查等一系列的操作了
首先来创建文件,本次文件有三个:顺序表头文件,顺序表的源文件以及测试文件这三个文件:
1.定义顺序表的结构
定义顺序表的结构有两种方法分别是静态顺序表和动态顺序表
静态的顺序表有两个数据分别是:一个定长数组和一个数组的有效数据的个数
动态顺序表则比静态顺序表多了一个数据来记录数组空间的大小
这里使用typedef是我们的代码方便后续编写与修改进行的定义,标黄的部分表示两种方法任选其一即可
2.顺序表的初始化和销毁
2.1初始化
我们创建一个SLInit函数来初始化
这里我们要传入的是指针而不是数值是因为如果我们传入的是值那么我们要进行值的拷贝,但此时又没有值所以这里就只能传地址
此时就能完成初始化了
2.2顺序表的销毁
同样创建一个函数进行执行操作,如果ps指向的arr不为NULL就可以将其free并置为NULL,然后将size和capacity归零就可以了
3.顺序表的插入和删除(头部和尾部)
这里创建函数,插入比删除多了一个参数:要插入的数据,而且要插入的数据是要判断空间够不够,不够时就加空间
3.1判断空间大小进行增容
主要函数是这一个但是要注意此时的capacity为零,这里可以进行判断也可以初始化时进行空间开辟
后面我们进行优化改进:
3.2尾部插入
空间如果够用时要此时的size指向的位置就是我们要插入数据的位置,然后size进行加一即可
两种方法选一个即可
3.3头部插入
先判断空间够不够,后将所有数据进行后移,然后进行插入,size++
用一个for循环从后向前进行移动
这里我们来测试一下:
先写一个链表的打印方法
结果没有问题我们进行后续的删除
3.4尾部删除
直接将size–后,对增加、删除、修改、查找数据都不影响时直接将size–即可
3.4头部删除
将第一个数据删除后将其余的数据向前移动即可
测试:
都没有问题就可以继续了
4.顺序表的任意插入和删除
4.1顺序表的任意插入
pos为我们可以插入的数据位置,当size等于零时相当于尾插
从后向前将数据后移然后将数据替换,size++
测试:
4.2顺序表的任意删除
将后面的数据向前移动,然后将size–即可
测试:
5.顺序表的查找
先进行遍历,然后找到了就返回下标,没有就返回-1
测试:
以上就是本文的全部内容了,下面是全部代码,希望能对大家有所帮助,大家加油!!!
本文代码:
SeqList.h
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
//定义顺序表的结构
#define N 100
struct SeqList01
{
int arr[N];
int size;
};
typedef int SLDataType;
typedef struct SeqList02
{
SLDataType* arr;
int size; //有效数据的个数
int capacity;//数组空间的大小
}SL;
typedef struct SeqList02 SL;
//顺序表的初始化和销毁
void SLInit(SL* ps);
void SLDestroy(SL* ps);
//顺序表的插入(头部和尾部)
void SLPushBack(SL* ps, SLDataType x);//尾部插入
void SLPushFront(SL* ps, SLDataType x);//头部插入
void SLPopBack(SL* ps);//尾部删除
void SLPopFront(SL* ps);//头部删除
//判断空间够不够
void SLCheckCapacity(SL* ps);
//顺序表的任意插入和删除
void SLInsert(SL* ps, int pos, SLDataType x);
void SLErase(SL* ps, int pos);
//顺序表的查找
int SLFind(SL* ps, SLDataType x);
void SLPrint(SL s);//链表的打印
SeqList.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "SeqList.h"
//顺序表的初始化和销毁
void SLInit(SL* ps)
{
ps->arr = 0;
ps->size = 0;
ps->capacity = 0;
}
void SLDestroy(SL* ps)
{
if (ps->arr)
{
free(ps->arr);
}
ps->arr = NULL;
ps->size = ps->capacity = 0;
}
//顺序表的插入(头部和尾部)
//判断空间够不够
void SLCheckCapacity(SL* ps)
{
if (ps->capacity == ps->size)
{
int newCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;
SLDataType* tmp = (SLDataType*)realloc(ps->arr, newCapacity * sizeof(SLDataType));
if (tmp == NULL)
{
perror(tmp);
exit(1);
}
ps->arr = tmp;
ps->capacity = newCapacity;
}
}
void SLPushBack(SL* ps, SLDataType x)
{
assert(ps);
SLCheckCapacity(ps);
ps->arr[ps->size] = x;
ps->size++;
/*ps->arr[ps->size++] = x;*/
}
void SLPushFront(SL* ps, SLDataType x)
{
assert(ps);
SLCheckCapacity(ps);//判断空间够不够
for (int i = ps->size;i > 0; i--)
{
ps->arr[i] = ps->arr[i - 1];
}
ps->arr[0] = x;
ps->size++;
}
void SLPopBack(SL* ps)
{
assert(ps);
assert(ps->size);//顺序表不为空
ps->size--;
}
void SLPopFront(SL* ps)
{
assert(ps);
assert(ps->size);
for (int i = 0; i < ps->size - 1 ; i++)
{
ps->arr[i] = ps->arr[i + 1];
}
ps->size--;
}
//顺序表的任意插入和删除
void SLInsert(SL* ps, int pos, SLDataType x)
{
assert(ps);
assert(pos >= 0 && pos <= ps->size);
SLCheckCapacity(ps);
for (int i = ps->size; i > pos; i--)
{
ps->arr[i] = ps->arr[i - 1];
}
ps->arr[pos] = x;
ps->size++;
}
void SLErase(SL* ps, int pos)
{
assert(ps);
assert(pos >= 0 && pos < ps->size);
for (int i = pos; i < ps->size - 1; i++)
{
ps->arr[i] = ps->arr[i + 1];
}
ps->size--;
}
//顺序表的查找
int SLFind(SL* ps, SLDataType x)
{
assert(ps);
for (int i = 0; i < ps->size; i++)
{
if (ps->arr[i] == x)
{
return i;
}
}
return -1;
}
//链表的打印
void SLPrint(SL s)
{
for (int i = 0; i < s.size; i++)
{
printf("%d ", s.arr[i]);
}
printf("\n");
}
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "SeqList.h"
void SLTest01()
{
SL sl;
SLInit(&sl);
/*SLPushBack(&sl, 4);
SLPushBack(&sl, 5);
SLPushBack(&sl, 6);
SLPrint(sl);*/
SLPushFront(&sl, 1);
SLPrint(sl);
SLPopBack(&sl);
SLPopFront(&sl);
SLPrint(sl);
SLDestroy(&sl);
}
void SLTest02()
{
SL sl;
SLInit(&sl);
SLPushBack(&sl, 4);
SLPushBack(&sl, 5);
SLPushBack(&sl, 6);
SLPrint(sl);
/*SLInsert(&sl, 0, 1);
SLPrint(sl);
SLInsert(&sl, 1, 2);
SLPrint(sl);
SLInsert(&sl, 5, 7);
SLPrint(sl);*/
/*SLErase(&sl, 0);
SLPrint(sl);
SLErase(&sl, 8);
SLPrint(sl);
SLDestroy(&sl);*/
int find = SLFind(&sl, 5);
if (find < 0)
{
printf("没找到\n");
}
else
printf("找到了下标为%d", find);
}
int main()
{
/*SLTest01();*/
SLTest02();
return 0;
}