C语言简单的数据结构:顺序表

在这里插入图片描述

接下来我们来了解一下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;
}
  • 36
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值