C++实现顺序表

顺序表 顺序表,一种线性表,因此顺序表是线性的. 因为顺序表在物理结构与逻辑结构都是连续的.意味着在内存中是连续存储的,形如数组的内存存储方式,我将用数组实现顺序表. 实现顺序表的主要功能为:增删查改. 顺序表是一种简单的数据结构,原理与实现并不难 主要维护下标size,内存空间capacity的大小即可

Seqlist.h头文件声明

#pragma once
#include<iostream>
#include<cstdlib>
#include<cassert>
using namespace std;
// 顺序表结构定义
typedef int SLDataType;
class SeqList {
public:
	SLDataType* arr;
	int size;
	int capacity;
};
typedef SeqList SL;
//检查顺序表容量是否合理
void checkSLCaoacity(SL* ps);
//顺序表初始化
void SLInit(SL* ps);
//顺序表的销毁
void SLDestroy(SL* ps);

//顺序表的插入操作
//头插尾插
void SLPushFront(SL* ps,SLDataType x);
void SLPushBack(SL* ps, SLDataType x);
//头删尾删
void SLPopFront(SL* ps);
void SLPopBack(SL* ps);
//选择插入
void SLInsert(SL* ps,int i, SLDataType x);
//选择删除
void SLDelete(SL* ps, SLDataType x);

//顺序表的查找操作
void SLFind(SL* ps, SLDataType x);
//顺序表的修改操作
void SLUpdate(SL* ps, int i, SLDataType x);

//输出所以元素
void SLPrint(SL* ps);

Seqlist.cpp原文件中存方法

#include"SeqList.h"

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

void SLDestroy(SL* ps) {
	if (ps->arr) {
		delete[] ps->arr;
	}
	ps->arr = NULL;
	ps->size = ps->capacity = 0;
}

void checkSLCaoacity(SL* ps) {
	//先判断空间够不够
	if (ps->size == ps->capacity) {
		int newCapacity = (ps->capacity == 0) ? sizeof(SLDataType) : 2 * ps->capacity;
		SLDataType* temp = (SLDataType*)realloc(ps->arr, newCapacity * sizeof(SLDataType));
		if (!temp) {
			perror("realloc failed");
			exit(1);
		}
		ps->arr = temp;
		//delete(temp);
		ps->capacity = newCapacity;
	}
}
	
//头插尾插
void SLPushFront(SL* ps, SLDataType x) {
	assert(ps);//传其他类型指针会导致崩溃,给爷爬
	checkSLCaoacity(ps);
	//插入
	for (int i = ps->size; i > 0; i--) {
		ps->arr[i] = ps->arr[i - 1];
	}
	ps->arr[0] = x;
	ps->size++;
}
void SLPushBack(SL* ps, SLDataType x) {
	assert(ps);
	checkSLCaoacity(ps);
	ps->arr[ps->size++] = x;
}
//头删尾删
void SLPopFront(SL* ps) {
	assert(ps);
	if (ps->size == 0) {
		return;
	}
	for (int i = 0; i < (ps->size--) - 1; i++) {
		ps->arr[i + 1] = ps->arr[i];
	}
}
void SLPopBack(SL* ps) {
	assert(ps);
	if (ps->size == 0) {
		return;
	}
	ps->size--;
}
//选择插入
void SLInsert(SL* ps, int i, SLDataType x) {
	assert(ps);
	checkSLCaoacity(ps);
	//1 2 3 4 5 size
	//0 1 2 3 4 
	for (int j = ps->size; j >i; j--) {
		ps->arr[j] = ps->arr[j - 1];
	}
	ps->arr[i] = x;
	ps->size++;
}
//选择删除
void SLDelete(SL* ps, SLDataType x) {
	assert(ps);
	if (ps->size == 0) { return; }
	for (int j = 0; j < ps->size; j++) {
		if (ps->arr[j] == x) {
			for (int k = j; k < ps->size - 1; k++) {
				ps->arr[k] = ps->arr[k + 1];
			}
			ps->size--;
			return;
		}
	}
	cout << "没有找到要删除的元素" << '\n';
}

//顺序表的查找操作
void SLFind(SL* ps, SLDataType x) {
	assert(ps);
	for (int i = 0; i <= ps->size - 1; i++) {
		if (ps->arr[i] == x) {
			cout << "找到了第" << i + 1 << "个元素\n";
			cout << "值为:" << ps->arr[i] << '\n';
			return;
		}
	}
	cout << "没有找到要查找的元素" << '\n';
}
//顺序表的修改操作
void SLUpdate(SL* ps, int i, SLDataType x) {
	assert(ps);
	checkSLCaoacity(ps);
	if (i <= 0 || i > ps->size - 1) {
		cout << "索引越界" << '\n';
		return;
	}
	ps->arr[i - 1] = x;
}

//输出所有元素
void SLPrint(SL* ps) {
	assert(ps);
	checkSLCaoacity(ps);
	for (int i = 0; i < ps->size; i++) {
		cout << ps->arr[i] << " ";
	}
	cout << '\n';
}

test.cpp源文件中用于测试实现的功能

#include"SeqList.h"

void test01() {
	SL s;
	SLInit(&s);//初始化
	//增删查改
	//使用for循环插入100个元素
	for (int i = 1; i <= 100; i++)
	{
		if(i&1)
			SLPushFront(&s, i);
		else
			SLPushBack(&s, i);
	}
	//输出所有元素
	SLPrint(&s);
	//查找元素
	SLFind(&s, 55);
	SLFind(&s, 999);
	//删除元素
	SLDelete(&s, 100);
	SLDelete(&s, 404);
	SLPrint(&s);
	//修改元素
	SLUpdate(&s, 55, 969696);
	SLPrint(&s);
	SLDestroy(&s);//销毁
}

int main()
{
	test01();
	return 0;
}

更新于 2024/06/04

评论

评论 0

暂无评论
全部文章
music

521755ldsdl.jpg

关于

QAQ

C++离散化

为什么要离散化处理? 数据过于多时难以表示数组下标 离散化是什么? 可以类比哈希表 离散化就像哈

教程超详细xcpc滚榜教程

首先需要导出比赛的表格 1.处理表格 最终效果如下图 自行添加的列有id,judged,solv

C++快速幂

快速幂 用于快速求a^b的算法 思想:拆分 例:求2^13 等价于求 2^1 * 2^4 * 2

C++高精度运算(加减乘除)

在程序中高精度加法和高精度减法的运算本质是模拟我们在小学就学过的运算规则,也是我们平时用的运算规

C++素数筛法(埃氏筛法、线性筛法)

素数筛法:用于筛选出素数 核心思想:用一个数筛选其余的数 普通筛法: 时间复杂度为O(nlogn

C++二叉树的建立与遍历

二叉树是一种非线性数据结构. 二叉树 由节点构成,每个节点包含节点值和指向左节点和右节点的指针.

C++链表

链表是一种逻辑结构上的线性表,物理结构上的非线性表 链表由许多节点组成,每个节点有对应的值和指向

C++C++实现顺序表

顺序表,一种线性表,因此顺序表是线性的. 因为顺序表在物理结构与逻辑结构都是连续的.意味着在内存

PythonPython基础

标识符 Python中标识符由字母,数字,下划线组成. 字母区分大小写,不能以数字开头,以下划线

算法并查集

并查集 :并为合并(合并两个节点),查为查询(查询根节点),集是一个集合. 联通块问题 //各个

K 随时打开ESC 关闭

阅读设置

设置仅保存在当前设备。

主题

背景

文章布局