顺序表-数据结构

一、结构定义

顺序表是通常是数组,要求数据连续存储。顺序表又分为定长顺序表和变长顺序表,本文实现后者。

1、头文件

#include <stdio.h>
#include <stdlib.h>

2、定长顺序表

#define MAX 100
定长顺序表结构
typedef struct SqList {
	int arr[MAX];
	int size;
}Sq;

3、变长顺序表

//变长顺序表 
typedef struct SqList {
	int* arr;
	int size;
	int capacity;
}Sq;

二、功能实现

1、初始化

//初始化
bool Sq_init(SqList* S) {
	//检查空指针
	if (S == NULL){
		printf("init false");
		exit(-1);
	}
	S->arr = (int*)malloc(sizeof(int) * 30);
	//检查malloc是否成功
	if (S->arr == NULL) {
		printf("malloc false");
		return false;
	}
	S->capacity = 30;
	S->size = 0;
	return true;
}

2、扩容

//检查数组、满则扩容
bool Sq_Check(SqList* S)
{
	if (S->size == S->capacity)
	{
		int newcapacity = S->capacity + 30;
		int* arr_tmp = (int*)realloc(S->arr, newcapacity * sizeof(int));
		if (arr_tmp == NULL) {
			printf("realloc false");
			exit(-1);
		}
		S->arr = arr_tmp;
		S->capacity = newcapacity;
	}
}

3、插入

//头插
bool Sq_PushFront(SqList* S,int value)
{
	if (S == NULL)
		exit(-1);
	Sq_Check(S);
	for (int i = S->size; i > 0; i--){
		S->arr[i] = S->arr[i - 1];
	}
	S->arr[0] = value;
	S->size++;
	return true;
}
//尾插
bool Sq_PushBack(SqList* S, int value)
{
	if (S == NULL)
		exit(-1);
	Sq_Check(S);
	S->arr[S->size] = value;
	S->size++;
	return true;
}

4、删除

//头删
int Sq_PopFront(SqList* S)
{
	//头删就是把序号为0的元素删除
	//若需要删除序号为x的元素
	//只需要更改i的初始值和循环次数即可

	if (S == NULL)
		exit(-1);
	//让后一项覆盖前一项,重复size-1次
	int ret = S->arr[0];
	for (int i = 0; i < S->size - 1; i++)
	{
		S->arr[i] = S->arr[i + 1];
	}
	S->size--;
	return ret;
}
//尾删
int Sq_PopBack(SqList* S)
{
	if (S == NULL)
		exit(-1);
	int ret = S->arr[S->size - 1];
	S->size--;
	return ret;
}

5、查询

//查
int Sq_Select(SqList* S, int x)
{
	if (S == NULL)
		exit(-1);
	if (x >= S->size)
		exit(-1);
	return S->arr[x];
}

6、主函数及打印


void Sq_Print(SqList* S)
{
	for (int i = 0; i < S->size; i++)
	{
		printf("%d ", S->arr[i]);
	}
	printf("\n");
}
int main(){
	SqList* S = (SqList*)malloc(sizeof(SqList));
	Sq_init(S);
	Sq_PushBack(S, 1);
	Sq_PushBack(S, 2);
	Sq_PushBack(S, 3);
	Sq_PushFront(S, 4);
	Sq_Print(S);
	Sq_PopBack(S);
	Sq_PopFront(S);
	Sq_Print(S);
	printf("%d",Sq_Select(S, 1));
	return 0;
}

三、效果图

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

震惊铁豪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值