数据结构(1)--> 顺序表

定义:

顺序表存储定义: 把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构,顺序表功能的实现借助于数组,通过对数组进行封装,从而实现增删查改的功能,严格意义上来说(数组无法实现删除数据的功能)。

复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include"seqlist.h"

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

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


void checkcapacity(SL* p) {
	assert(p);
	if (p->capacity == p->size) {
		int newcapacity = p->capacity == 0 ? 4 : 2 * p->capacity;

		// if here use malloc,the origin data in this array might be missing 

		int* temp = (int*)realloc(p->arr,sizeof(int) * newcapacity);
		p->arr = temp;
		p->capacity = newcapacity;
	}
}



void pushFront(SL* p, int val) {
	assert(p);
	checkcapacity(p);
	int end = p->size - 1;
	while (end >= 0) {
		p->arr[end + 1] = p->arr[end];
		end--;
	}
	p->arr[0 ] = val;
	p->size++;
}

void pushback(SL* p,int val) {
	//assert(p);
	checkcapacity(p);
	p->arr[p->size] = val;
	p->size++;
}


void popfront(SL* p) {
	assert(p);
	int n = p->arr[0];
	printf("将要被pop元素=%d\n", n);
	for (int i = 1; i < p->size ; i++) {
		p->arr[i - 1] = p->arr[i];
	}
	p->size--;
}


void insertanyposition(SL* p, int pos, int val) {
	assert(p);
	assert(pos >= 0 && pos <= p->size);
	int end = p->size - 1;
	while (end>=pos) {
		p->arr[end + 1] = p->arr[end];
		end--;
	}
	p->arr[pos] = val;
	p->size++;
}

int findDataPos(SL* p, int val) {
	assert(p);
	for (int i = 0; i < p->size; i++) {
		if (p->arr[i] == val) {
			return i;
		}
	}
	return -1;
}

1、顺序表的初始化:

复制代码
typedef struct seqlist {
	int* arr;
	int size;
	int capacity;
}SL,*PTR;



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

2、顺序表容量检测:

当我们要对表里进行相关操作的时候,第一步检测当下该表中size 与 容量的关系,可以写一个checkcapacity函数。

复制代码
void checkcapacity2(SL* p) {
	assert(p);
	if (p->capacity == p->size) {
		int newcapacity = p->capacity == 0 ? 4 : 2 * p->capacity;
		int* temp = (int*)malloc(sizeof(int) * newcapacity);
		p->arr = temp;
		p->capacity = newcapacity;
	}
}


void test3() {
	PTR p;
	SL sl;
	p = &sl;
	initseqlist(p);
	pushback(p, 5);//first init  ---> size=4,capacity=4
	pushback(p, 15);
	pushback(p, 25);
	pushback(p, 35);
	pushback(p, 45);
	printseqlist(p);

}

这个时候来看一下打印结果:

为什么会这样呢,这个时候我们就需要借助调试工具来找出问题所在

所以我们该处可以用realloc 函数 来进行动态内存管理:

复制代码
void checkcapacity(SL* p) {
	assert(p);
	if (p->capacity == p->size) {
		int newcapacity = p->capacity == 0 ? 4 : 2 * p->capacity;

		// if here use malloc,the origin data in this array might be missing 

		int* temp = (int*)realloc(p->arr,sizeof(int) * newcapacity);
		p->arr = temp;
		p->capacity = newcapacity;
	}
}

3、顺序表插入数据:

3.1头插:

复制代码
void pushFront(SL* p, int val) {
	assert(p);
	checkcapacity(p);
	int end = p->size - 1;
	while (end >= 0) {
		p->arr[end + 1] = p->arr[end];
		end--;
	}
	p->arr[0 ] = val;
	p->size++;
}

3.2尾插:

复制代码
void pushback(SL* p,int val) {
	//assert(p);
	checkcapacity(p);
	p->arr[p->size] = val;
	p->size++;
}

4、顺序表删除数据:

4.1头删

复制代码
void popfront(SL* p) {
	assert(p);
	int n = p->arr[0];
   // 可以起到记录作用

	printf("将要被pop元素=%d\n", n);
	for (int i = 1; i < p->size ; i++) {
		p->arr[i - 1] = p->arr[i];
	}
	p->size--;
}

4.2尾删

5、任意位置实现插入功能:

复制代码
void insertanyposition(SL* p, int pos, int val) {
	assert(p);

	assert(pos >= 0 && pos <= p->size);

	int end = p->size - 1;
	while (end>=pos) {
		p->arr[end + 1] = p->arr[end];
		end--;
	}
	p->arr[pos] = val;
	p->size++;
}

6、顺序表中实现查找功能:

复制代码
int findDataPos(SL* p, int val) {
	assert(p);
	for (int i = 0; i < p->size; i++) {
		if (p->arr[i] == val) {
			return i;
		}
	}
	return -1;
}
相关推荐
我不是QI17 分钟前
DES 加密算法:核心组件、加解密流程与安全特性
经验分享·算法·安全·网络安全·密码学
前端小刘哥34 分钟前
新版视频直播点播EasyDSS平台,让跨团队沟通高效又顺畅
算法
明月(Alioo)1 小时前
机器学习入门,无监督学习之K-Means聚类算法完全指南:面向Java开发者的Python实现详解
python·算法·机器学习
叶梅树1 小时前
从零构建A股量化交易工具:基于Qlib的全栈系统指南
前端·后端·算法
lingran__1 小时前
算法沉淀第三天(统计二进制中1的个数 两个整数二进制位不同个数)
c++·算法
MicroTech20252 小时前
微算法科技MLGO推出隐私感知联合DNN模型部署和分区优化技术,开启协作边缘推理新时代
科技·算法·dnn
小冯记录编程2 小时前
深入解析C++ for循环原理
开发语言·c++·算法
chenchihwen4 小时前
深度解析RAG系统中的PDF解析模块:Docling集成与并行处理实践
python·算法·pdf
Chloeis Syntax4 小时前
栈和队列笔记2025-10-12
java·数据结构·笔记·
404未精通的狗4 小时前
(数据结构)线性表(下):链表分类及双向链表的实现
数据结构·链表