数据结构 定长顺序表

头文件

cpp 复制代码
#pragma once
#include<iostream>
#include<string>
#include<stdlib.h>
#include<assert.h>
using namespace std;
#define max 100
typedef struct arrlist {
	int arr[max];
	int cursize;
	int capacity;
}arrlist;

//1. 初始化顺序表
void initlist(arrlist *a);
//2. 判空
bool isempty(arrlist* a);
//3. 判满
bool isfull(arrlist* a);
//4. 获取当前容量
int getcapacity(arrlist* a);
//5. 尾插
void push_back(arrlist* a, int val);
//6. 打印顺序表
void print_(arrlist* a);
//7. 头插
void push_front(arrlist* a, int val);
//8. 指定下标插入
void insert_index(arrlist* a, int index, int val);
//9. 按值查询下标
int searchval(arrlist* a, int val);
//10. 头删
void popfront(arrlist* a);
//11. 尾删
void popback(arrlist* a);
//12. 按下标删除
void popindex(arrlist* a, int index);
//13. 按值删除
void popval(arrlist* a, int val);
//14. 获取首元素
int getfront(arrlist* a);
//15. 获取尾元素
int getback(arrlist* a);
//16. 获取指定下标元素
int getindex(arrlist* a, int index);
//17. 清空顺序表
void clearlist(arrlist* a);
//18. 销毁顺序表
void destroylist(arrlist* a);
//19. 冒泡排序
void bubblesort_list(arrlist* a);
//20. 二分查找
int binfindval(arrlist* a, int val);
//21. 反转顺序表
void reverse_list(arrlist* a);
//22. 合并两个有序顺序表
void mergelist(arrlist* a, arrlist* b);
//23. 顺序表相加
void addlist(arrlist* a, arrlist* b,arrlist* c);

源文件

cpp 复制代码
#include"定长顺序表.h"


//1. 初始化顺序表
void initlist(arrlist* a) {
	a->capacity = max;
	a->cursize = 0;
}
//2. 判空
bool isempty(arrlist* a) {
	assert(a != nullptr);
	return a->cursize == 0;
}
//3. 判满
bool isfull(arrlist* a) {
	assert(a != nullptr);
	return a->cursize == a->capacity;
}
//4. 获取当前容量
int getcapacity(arrlist* a) {
	assert(a != nullptr);
	return a->capacity;
}
//5. 尾插
void push_back(arrlist* a, int val) {
	assert(a != nullptr);
	if (isfull(a))return;
	a->arr[a->cursize++] = val;
}
//6. 打印顺序表
void print_(arrlist* a) {
	assert(a != nullptr);
	if (isempty(a))return;
	for (int i = 0; i < a->cursize; i++) {
		cout << a->arr[i] << " ";
	}cout << endl;
}
//7. 头插
void push_front(arrlist* a, int val) {
	assert(a != nullptr);
	if (isfull(a))return;
	memmove(a->arr + 1, a->arr, sizeof(a->arr[0]) * a->cursize++);
	a->arr[0] = val;
}
//8. 指定下标插入
void insert_index(arrlist* a, int index, int val) {
	assert(a != nullptr);
	if (isfull(a) || index < 0 || index > a->cursize)return;
	memmove(a->arr + index + 1, a->arr + index, sizeof(a->arr[0]) * (a->cursize++ - index));
	a->arr[index] = val;
}
//9. 按值查询下标
int searchval(arrlist* a, int val) {
	assert(a != nullptr);
	if (isempty(a))return -1;
	for (int i = 0; i < a->cursize; i++) {
		if (a->arr[i] == val)return i;
	}return -1;
}
//10. 头删
void popfront(arrlist* a) {
	assert(a != nullptr);
	if (isempty(a))return;
	memmove(a->arr, a->arr + 1, sizeof(a->arr[0]) * (--a->cursize));
}
//11. 尾删
void popback(arrlist* a) {
	assert(a != nullptr);
	if (isempty(a))return;
	--a->cursize;
}
//12. 按下标删除
void popindex(arrlist* a, int index) {
	assert(a != nullptr);
	if (isempty(a)||index<0||index>=a->cursize)return;
	memmove(a->arr + index, a->arr + index + 1, sizeof(a->arr[0]) * (--a->cursize - index));
}
//13. 按值删除
void popval(arrlist* a, int val) {
	assert(a != nullptr);
	if (isempty(a))return;
	for (int i = 0; i < a->cursize; i++) {
		if (a->arr[i] == val)memmove(a->arr + i, a->arr + i + 1, sizeof(a->arr[0]) * (--a->cursize - i--));
	}return;
}
//14. 获取首元素
int getfront(arrlist* a) {
	assert(a != nullptr);
	if (isempty(a))return -1;
	return a->arr[0];
}
//15. 获取尾元素
int getback(arrlist* a) {
	assert (a!= nullptr);
	if (isempty(a))return -1;
	return a->arr[a->cursize - 1];
}
//16. 获取指定下标元素
int getindex(arrlist* a, int index) {
	assert(a != nullptr);
	if (isempty(a)||index<0||index>=a->cursize)return -1;
	return a->arr[index];
}
//17. 清空顺序表
void clearlist(arrlist* a) {
	assert(a != nullptr);
	if (isempty(a))return;
	a->cursize = 0;
}
//18. 销毁顺序表
void destroylist(arrlist* a) {
	assert(a != nullptr);
	a->cursize = a->capacity = 0;
}
//19. 冒泡排序
void bubblesort_list(arrlist* a) {
	assert(a != nullptr);
	if (isempty(a))return;
	for (int i = 0; i < a->cursize - 1; i++) {
		for (int j = 0; j < a->cursize - i - 1; j++) {
			if (a->arr[j] > a->arr[j + 1]) {
				a->arr[j] = a->arr[j] ^ a->arr[j + 1];
				a->arr[j + 1] = a->arr[j] ^ a->arr[j + 1];
				a->arr[j] = a->arr[j] ^ a->arr[j + 1];
			}
		}
	}
}
//20. 二分查找
int binfindval(arrlist* a, int val) {
	assert(a != nullptr);
	if (isempty(a))return -1;
	int left = 0, right = a->cursize-1;
	while (left <= right) {
		int mid = (right - left) / 2 + left;
		if (a->arr[mid] == val)return mid;
		else if (a->arr[mid] > val)right = mid - 1;
		else left = mid + 1;
	}return -1;
}
//21. 反转顺序表
void reverse_list(arrlist* a) {
	assert(a != nullptr);
	if (isempty(a)||a->cursize==1)return ;
	int* left = a->arr, *right = a->arr + a->cursize - 1;
	while (left!= right) {
		int temp = *left;
		*left = *right;
		*right = temp;
		left++; right--;
	}
}
//22. 合并两个有序顺序表
void mergelist(arrlist* a, arrlist* b) {
	assert(a != nullptr && b != nullptr);
	if (isempty(a) || isempty(b))return;
	int i = a->cursize-1, j = b->cursize-1;
	a->cursize += b->cursize;//这里假设容量够用
	int k = a->cursize-1;
	while (i >=0&&j>=0) {
		if (a->arr[i] < b->arr[j])a->arr[k--] = b->arr[j--];
		else a->arr[k--] = a->arr[i--];
	}
	while (j >= 0)a->arr[k--] = b->arr[j--];
}
//23. 顺序表相加
void addlist(arrlist* a, arrlist* b,arrlist *c) {
	assert(a != nullptr && b != nullptr&&c!=nullptr);
	if (isempty(a) || isempty(b))return;
	int i = a->cursize - 1, j = b->cursize - 1; int val = 0;
	while (val || i >= 0 || j >= 0) {
		if (i >= 0 && j >= 0)val += a->arr[i] + b->arr[j];
		else if (i >= 0 && j < 0)val += a->arr[i];
		else if (i < 0 && j >= 0)val += b->arr[j];
		push_front(c, val % 10); val /= 10;
	}
}

int main() {
	arrlist a;
	initlist(&a);
	return 0;
}
相关推荐
艾莉丝努力练剑9 分钟前
【Linux:文件】Ext系列文件系统(初阶)
大数据·linux·运维·服务器·c++·人工智能·算法
Once_day25 分钟前
C++之《程序员自我修养》读书总结(1)
c语言·开发语言·c++·程序员自我修养
Trouvaille ~34 分钟前
【Linux】TCP Socket编程实战(一):API详解与单连接Echo Server
linux·运维·服务器·网络·c++·tcp/ip·socket
坚果派·白晓明1 小时前
在鸿蒙设备上快速验证由lycium工具快速交叉编译的C/C++三方库
c语言·c++·harmonyos·鸿蒙·编程语言·openharmony·三方库
小镇敲码人1 小时前
深入剖析华为CANN框架下的Ops-CV仓库:从入门到实战指南
c++·python·华为·cann
张张努力变强2 小时前
C++ STL string 类:常用接口 + auto + 范围 for全攻略,字符串操作效率拉满
开发语言·数据结构·c++·算法·stl
小镇敲码人2 小时前
探索CANN框架中TBE仓库:张量加速引擎的优化之道
c++·华为·acl·cann·ops-nn
wWYy.2 小时前
数组快排 链表归并
数据结构·链表
平安的平安2 小时前
面向大模型算子开发的高效编程范式PyPTO深度解析
c++·mfc
June`2 小时前
muduo项目排查错误+测试
linux·c++·github·muduo网络库