【数据结构】顺序表的使用方法和实现(数组实现 增 减 删 查)

目录

顺序表的介绍

顺序表的实现(增 减 删 查)

SeqList.h头文件的建立

SeqList.c功能函数文件的建立

1.顺序表的初始化

2.顺序表的销毁

3.顺序表的扩容

4.顺序表的打印

5.在顺序表开头插入数据

6.在顺序表尾部插入数据

7.在顺序表开头删除数据

8.在顺序表尾部删除数据

9.从顺序表的指定位置后面插入数据

Text.c主函数文件的建立


顺序表的介绍

顺序表是一种常见的数据结构,用于存储一组元素。它是由一段连续的内存空间组成的,每个元素都占据一定的空间,并按照一定的顺序排列。

顺序表可以通过数组实现,也可以通过链表实现。使用数组实现的顺序表,在内存中是连续存储的,可以通过下标直接访问元素,因此查找元素的时间复杂度为O(1)。但是插入和删除操作会涉及到元素的移动,时间复杂度为O(n)。

使用链表实现的顺序表,元素在内存中并不是连续存储的,而是通过指针相连的。插入和删除操作只需要修改指针,时间复杂度为O(1),但是查找元素需要遍历整个链表,时间复杂度为O(n)。

顺序表的主要优点是可以随机访问元素,插入和删除操作比较简单;缺点是插入和删除操作的时间复杂度较高,需要移动元素。因此,顺序表适合于频繁进行查找操作,而不频繁进行插入和删除操作的场景。

顺序表的实现(增 减 删 查)

SeqList.h头文件的建立


#pragma once

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

typedef int SLtype;

typedef struct SL //定义一个结构体
{
	SLtype* arr;//顺序表的起始位置
	int size;//顺序表中的有效数字
	int capacity;//内存大小
}SL;

void SLInit(SL* ps);//初始化
void SLDestroy(SL* ps);//销毁
void SLCheckCapacity(SL* ps);//扩容
void SLPrintf(SL* ps);//打印顺序表
void SLPushFront(SL* ps,SLtype x);//在开头插入数据
void SLPushBack(SL* ps, SLtype x);//在尾部插入数据
void SLPopFront(SL* ps);//从开头删除数据
void SLPopBack(SL* ps);//从尾部删除数据
void SLRand(SL* ps, SLtype x, SLtype y);//从指定位置插入数据

SeqList.c功能函数文件的建立


1.顺序表的初始化

void SLInit(SL* ps)
{
	assert(ps);
	ps->arr = NULL;
	ps->capacity = ps->size = 0;
}

2.顺序表的销毁

void SLDestroy(SL* ps)
{
	assert(ps);
	if (ps->arr)
	{
		free(ps->arr);
	}
	ps->arr = NULL;
	ps->capacity = ps->size = 0;
}

3.顺序表的扩容

void SLCheckCapacity(SL* ps)
{
	if (ps->capacity == ps->size)
	{
		int NEWCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;
		SLtype* str = (SLtype*)realloc(ps->arr, NEWCapacity * sizeof(SLtype));
		if (str == NULL)
		{
			perror("str");
			exit(1);
		}
		ps->arr = str;
		ps->capacity = NEWCapacity;
	}
}

4.顺序表的打印

void SLPrintf(SL* ps)
{
	assert(ps);
	for (int i = 0; i < ps->size; i++)
	{
		printf("%d", ps->arr[i]);
	}
	printf("\n");
}

5.在顺序表开头插入数据

void SLPushFront(SL* ps, SLtype x)
{
	assert(ps);
	SLCheckCapacity(ps);
	for (int i = ps->size ; i >= 0; i--)
	{
		ps->arr[i+1] = ps->arr[i];
	}
	ps->arr[0] = x;
	ps->size++;
}

6.在顺序表尾部插入数据

void SLPushBack(SL* ps, SLtype x)
{
	assert(ps);
	SLCheckCapacity(ps);
	ps->arr[ps->size++] = x;
}

7.在顺序表开头删除数据

void SLPopFront(SL* ps)
{
	assert(ps);
	for (int i = 0; i < ps->size-1; i++)
	{
		ps->arr[i] = ps->arr[i + 1];
	}
	ps->size--;
}

8.在顺序表尾部删除数据

void SLPopBack(SL* ps)
{
	assert(ps);
	assert(ps->size);
	ps->size--;
}

9.从顺序表的指定位置后面插入数据

void SLRand(SL* ps, SLtype x, SLtype y)
{
	assert(ps);
	SLCheckCapacity(ps);
	for (int i = ps->size; i >= y; i--)
	{
		ps->arr[i + 1] = ps->arr[i];
	}
	ps->arr[y] = x;
	ps->size++;
}

Text.c主函数文件的建立


#include"SeqList.h"
void text1()
{
	SL s1;
	SLInit(&s1);//创建一个结构体S1
	SLPushFront(&s1, 1);
	SLPushFront(&s1, 2);
	SLPushFront(&s1, 3);
	SLPushFront(&s1, 4);
	SLPrintf(&s1);
}
void text2()
{
	SL s1;
	SLInit(&s1);//创建一个结构体S1
	SLPushBack(&s1, 1);
	SLPushBack(&s1, 2);
	SLPushBack(&s1, 3);
	SLPushBack(&s1, 4);
	SLPrintf(&s1);
}
void text3()
{
	SL s1;
	SLInit(&s1);//创建一个结构体S1
	SLPushBack(&s1, 1);
	SLPushBack(&s1, 2);
	SLPushBack(&s1, 3);
	SLPushBack(&s1, 4);
	SLPrintf(&s1);
	SLPopFront(&s1);
	SLPrintf(&s1);
	SLPopFront(&s1);
	SLPrintf(&s1);
}
void text4()
{
	SL s1;
	SLInit(&s1);//创建一个结构体S1
	SLPushBack(&s1, 1);
	SLPushBack(&s1, 2);
	SLPushBack(&s1, 3);
	SLPushBack(&s1, 4);
	SLPrintf(&s1);
	SLPopBack(&s1);
	SLPrintf(&s1);
	SLPopBack(&s1);
	SLPrintf(&s1);
	SLPopBack(&s1);
	SLPrintf(&s1);
}
void text5()
{
	SL s1;
	SLInit(&s1);//创建一个结构体S1
	SLPushBack(&s1, 1);
	SLPushBack(&s1, 2);
	SLPushBack(&s1, 4);
	SLPushBack(&s1, 5);
	SLPrintf(&s1);
	SLRand(&s1, 3, 2);
	SLPrintf(&s1);
}
int main()
{
	text1();//检测在顺序表开头插入数据
	text2();//检测在顺序表尾部插入数据
	text3();//检测在顺序表的开头删除数据
	text4();//检测在顺序表的尾部删除数据
	text5();//检测从顺序表的指定位置后面插入数据
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值