顺序表基本操作(完整)

2023-11-06

Seqlist.h

#define _CRT_SECURE_NO_WARNINGS 1

#pragma once
#include<stddef.h>
#define SeqlistMaxsize 100
typedef char SeqlistType;

typedef struct Seqlist{
	SeqlistType data[SeqlistMaxsize];
	size_t size;
}Seqlist;
void SeqlistInit(Seqlist *seqlist);//初始化

void pushback(Seqlist *seqlist, SeqlistType value);//尾插

void deleteback(Seqlist *seqlist);//尾删

void SeqlistpushFront(Seqlist *seqlist, SeqlistType value);//头插

void Seqlistpopback(Seqlist *seqlist);//头部删除

void SeqlistInsert(Seqlist *seqlist, size_t num, SeqlistType value);//在指定位置插入元素

void SeqlistDelete(Seqlist *seqlist, size_t num);//在指定位置删除元素

SeqlistType SeqListGet(Seqlist* seq, size_t pos, SeqlistType default_value);//在指定位置取出元素

void SeqListSet(Seqlist* seq, size_t pos,	SeqlistType value);//修改指定位置的值

size_t SeqListFind(Seqlist* seq, SeqlistType value);//查找顺序表中指定元素的下标

void SeqListRemove(Seqlist* seq, SeqlistType to_delete);//删除顺序表中指定的值, 如果存在重复元素, 只删除第一个

void SeqListRemoveAll(Seqlist* seq, SeqlistType to_delete);// 删除顺序表中所有的指定的值, 另外要实现一个时间复杂度为 O(N) 的优化版本


size_t SeqListSize(Seqlist* seqlist);//获取顺序表元素个数


int SeqListEmpty(Seqlist* seqlist);//判定顺序表是否为空


void SeqListBubbleSort(Seqlist* seqlist);//冒泡排序



typedef int (*Cmp)(SeqlistType a, SeqlistType b);
void SeqListBubbleSortEx(Seqlist* seqlist, Cmp cmp);//回调函数冒泡排序

Seqlist.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "seqlist.h"
#include<stdio.h>
#define PrintHeader printf("\n=================%s=================\n",__FUNCTION__)
void SeqlistInit(Seqlist *seqlist)
{
	if (seqlist == NULL)
	{
		return;
	}
	seqlist->size = 0;
	seqlist->data[seqlist->size] = '\0';
}
void pushback(Seqlist *seqlist, SeqlistType value)
{
	if (seqlist == NULL)
	{
		return;
	}
	if (seqlist->size >= SeqlistMaxsize)
	{
		printf("内存已满\n");
		return;
	}
	seqlist->data[seqlist->size] = value;
	++seqlist->size;
	seqlist->data[seqlist->size] = '\0';
	return;
}
void deleteback(Seqlist *seqlist)
{
	if (seqlist == NULL)
	{
		return;
	}
	if (seqlist->size == 0)
	{
		return;
	}
	--seqlist->size;
}
void printSeqlist(Seqlist *seqlist,char *msg)
{
	if (seqlist == NULL)
	{
		return;
	}
	printf("%s\n", msg);
	SeqlistType i = 0;
	for (; i < seqlist->size; i++)
	{
		printf("%c ", seqlist->data[i]);
	}
	printf("\n");
}
void SeqlistpushFront(Seqlist *seqlist, SeqlistType value)
{
	if (seqlist == NULL){
		return;
	}
	if (seqlist->size >= SeqlistMaxsize){
		return;
	}
	++seqlist->size;
	size_t i = seqlist->size - 1;
	for (; i > 0; --i)
	{
		seqlist->data[i] = seqlist->data[i-1];
	}
	seqlist->data[0] = value;
	return;

}
void Seqlistpopback(Seqlist *seqlist)
{
	if (seqlist == NULL){
		return;
	}
	size_t i =0;
	for (; i<seqlist->size-1; i++)
	{
		seqlist->data[i] = seqlist->data[i+1];
	}
	--seqlist->size;
	return;
}
void SeqlistInsert(Seqlist *seqlist, size_t num, SeqlistType value)
{
	if (seqlist == NULL){
		return;
	}
	++seqlist->size;
	size_t i = seqlist->size-1;
	for (; i > num; i--)
	{
		seqlist->data[i] = seqlist->data[i - 1];
	}
	seqlist->data[num] = value;
	return;
}
void SeqlistDelete(Seqlist *seqlist, size_t num)
{
	if (seqlist == NULL){
		return;
	}
	if (seqlist->size == 0){
		return;
	}
	size_t i = num;
	for (; i < seqlist->size-1; i++)
	{
		seqlist->data[i] = seqlist->data[i + 1];
	}
	--seqlist->size;
	return;
}
SeqlistType SeqListGet(Seqlist* seq, size_t pos, SeqlistType default_value)
{
	if (seq == NULL){
		return 0;
	}
	if (pos >= seq->size){
		return 0;
	}
	SeqlistType *p = seq->data[pos];
	return p;
}
void SeqListSet(Seqlist* seq, size_t pos, SeqlistType value)
{
	if (seq == NULL){
		return 0;
	}
	if (pos >= seq->size){
		return 0;
	}
	seq->data[pos] = value;
}
size_t SeqListFind(Seqlist* seq, SeqlistType value)
{
	if (seq == NULL){
		return -1;
	}
	size_t i = 0;
	for (; i < seq->size; ++i){
		if (value == seq->data[i])
		{
			return i;
		}
	}
	return 0;
}
void SeqListRemove(Seqlist* seq, SeqlistType to_delete)
{
	if (seq == NULL){
		return 0;
	}
	size_t ret=SeqListFind(seq,to_delete);
	if (ret == 0){
		return;
	}
	SeqlistDelete(seq, ret);
	return;
}
void SeqListRemoveAll(Seqlist* seq, SeqlistType to_delete)
{
	if (seq == NULL){
		return 0;
	}
	while (1){
		size_t ret = SeqListFind(seq, to_delete);
		if (ret == 0){
			break;
		}
		SeqlistDelete(seq, ret);
	}
	return;
}
size_t SeqListSize(Seqlist* seq)
{
	if (seq == NULL){
		return 0;
	}
	size_t i = 0;
	while (seq->data[i])
	{
		i++;
	}
	return i;
}
int SeqListEmpty(Seqlist* seq)
{
	if (seq == NULL){
		return 1;
	}
	if (seq->data[0] == '\0')
	{
		return 1;
	}
	return 0;
}
void swap(SeqlistType *x, SeqlistType *y)
{
	SeqlistType p = *x;
	*x = *y;
	*y = p;
	return;
}
void SeqListBubbleSort(Seqlist* seq)//冒泡排序
{
	size_t i = 0;
	size_t j = 0;
	for (i=0; i < seq->size; i++)
	{
		for (j =0; j<seq->size - i - 1; j++)
		{
			if (seq->data[j] > seq->data[j + 1])
			{
				swap(&seq->data[j], &seq->data[j + 1]);
			}
		}
	}
}
void greater(SeqlistType a, SeqlistType b)
{
	return a > b ? 1 : 0;
}
void SeqListBubbleSortEx(Seqlist* seq, Cmp cmp)
{
	size_t i = 0;
	size_t j = 0;
	for (i = 0; i < seq->size; i++)
	{
		for (j = 0; j<seq->size - i - 1; j++)
		{
			if (!cmp(seq->data[j],seq->data[j + 1]))
			{
				swap(&seq->data[j], &seq->data[j + 1]);
			}
		}
	}
}
测试代码//
void testinit()
{
	PrintHeader;
	Seqlist seqlist;
	SeqlistInit(&seqlist);
	printf("%lu\n", seqlist.size);
}
void testpushback()
{
	PrintHeader;
	Seqlist seqlist;
	SeqlistInit(&seqlist);
	pushback(&seqlist, 'a');
	pushback(&seqlist, 'b');
	pushback(&seqlist, 'c');
	printSeqlist(&seqlist,"尾部插入三个元素");
}
void testdeleteback()
{
	PrintHeader;
	Seqlist seqlist;
	SeqlistInit(&seqlist);
	deleteback(&seqlist);
	printSeqlist(&seqlist, "对空顺序表进行尾删");

	pushback(&seqlist, 'a');
	pushback(&seqlist, 'b');
	pushback(&seqlist, 'c');
	deleteback(&seqlist);
	//deleteback(&seqlist);
	printSeqlist(&seqlist, "对顺序表删除1个");

}
void testSeqlistpushFront()
{
	PrintHeader;
	Seqlist seqlist;
	SeqlistInit(&seqlist);
	SeqlistpushFront(&seqlist, 'O');
	SeqlistpushFront(&seqlist, 'L');
	printSeqlist(&seqlist, "对顺序表头插入两个元素");
}
void testSeqlistpopback()
{
	PrintHeader;
	Seqlist seqlist;
	SeqlistInit(&seqlist);
	pushback(&seqlist, 'a');
	pushback(&seqlist, 'b');
	pushback(&seqlist, 'c');
	Seqlistpopback(&seqlist);
	printSeqlist(&seqlist, "对顺序表头部删除一个元素");
}
void testSeqlistInsert()
{
	PrintHeader;
	Seqlist seqlist;
	SeqlistInit(&seqlist);
	pushback(&seqlist, 'a');
	pushback(&seqlist, 'b');
	pushback(&seqlist, 'c');
	SeqlistInsert(&seqlist, 1, 'p');
	printSeqlist(&seqlist, "对顺序表指定位置插入一个元素");
}
void testSeqlistDelete()
{
	PrintHeader;
	Seqlist seqlist;
	SeqlistInit(&seqlist);
	pushback(&seqlist, 'a');
	pushback(&seqlist, 'b');
	pushback(&seqlist, 'c');
	SeqlistDelete(&seqlist, 1);
	printSeqlist(&seqlist, "对顺序表指定位置删除一个元素");
}
void TestSeqListGet()
{
	PrintHeader;
	Seqlist seq;
	SeqlistInit(&seq);
	pushback(&seq, 'a');
	pushback(&seq, 'b');
	pushback(&seq, 'c');
	printSeqlist(&seq, "对顺序表指定位置查找一个元素");
	SeqlistType ret=SeqListGet(&seq, 2, 'E');
	printf("%c\n", ret);
}
void TestSeqListSet()
{
	PrintHeader;
	Seqlist seqlist;
	SeqlistInit(&seqlist);
	pushback(&seqlist, 'a');
	pushback(&seqlist, 'b');
	pushback(&seqlist, 'c');
	SeqListSet(&seqlist, 2, 'A');;
	printSeqlist(&seqlist, "对顺序表指定位置修改元素");
}
void TestSeqListFind()
{
	PrintHeader;
	Seqlist seqlist;
	SeqlistInit(&seqlist);
	pushback(&seqlist, 'a');
	pushback(&seqlist, 'b');
	pushback(&seqlist, 'c');
	size_t ret=SeqListFind(&seqlist,'b');
	printSeqlist(&seqlist, "通过元素查找下标");
	printf("%lu\n", ret);
}
void TestSeqListRemove()
{
	PrintHeader;
	Seqlist seqlist;
	SeqlistInit(&seqlist);
	pushback(&seqlist, 'a');
	pushback(&seqlist, 'b');
	pushback(&seqlist, 'c');
	//SeqListRemove(&seqlist,'b');
	//printSeqlist(&seqlist, "删除指定值");
    SeqListRemoveAll(&seqlist, 'b');
    printSeqlist(&seqlist, "删除所有指定值");
}
void TestSeqListSize()
{
	PrintHeader;
	Seqlist seqlist;
	SeqlistInit(&seqlist);
	pushback(&seqlist, 'a');
	pushback(&seqlist, 'b');
	pushback(&seqlist, 'c');
	size_t ret=SeqListSize(&seqlist);
	printf("顺序表元素个数为:%d\n",ret);
	printSeqlist(&seqlist, "获取顺序表元素个数");
}
void TestSeqListEmpty()
{
	PrintHeader;
	Seqlist seqlist;
	SeqlistInit(&seqlist);
	/*pushback(&seqlist, 'a');
	pushback(&seqlist, 'b');
	pushback(&seqlist, 'c');*/
	int ret = SeqListEmpty(&seqlist);
	printSeqlist(&seqlist, "顺序表是否为空");
	printf("%d\n", ret);
}
void TestSeqListBubbleSort()
{
	PrintHeader;
	Seqlist seqlist;
	SeqlistInit(&seqlist);
	pushback(&seqlist, 'Z');
	pushback(&seqlist, 'A');
	pushback(&seqlist, 'D');
	//SeqListBubbleSort(&seqlist);
	//printSeqlist(&seqlist, "冒泡排序");
	SeqListBubbleSortEx(&seqlist, greater);
	printSeqlist(&seqlist, "冒泡排序EX");
}
///
int main()
{
	testinit();
	testpushback();
	testdeleteback();
	testSeqlistpushFront();
	testSeqlistpopback();
	testSeqlistInsert();
	testSeqlistDelete();
	TestSeqListGet();
	TestSeqListSet();
	TestSeqListFind();
	TestSeqListRemove();
	TestSeqListSize();
	TestSeqListEmpty();
	TestSeqListBubbleSort();
	system("pause");
	return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

顺序表基本操作(完整) 的相关文章

  • 将运算符 << 添加到 std::vector

    我想添加operator lt lt to std vector
  • Environment.CurrentDirectory 与 System.IO.Directory.GetCurrentDirectory

    我正在编写一个 Net WinForms 并不断在调试和发布配置之间切换 并且有一些文件我需要任一配置才能访问 我想做的是将文件放在 BIN 文件夹中的公共目录中 这样它看起来像这样 MyProject Bin CommonFiles My
  • 前向声明类型和“已声明为类类型的非类类型”

    我对以下代码有问题 template
  • 传递 constexpr 对象

    我决定给予新的C 14的定义constexpr旋转并充分利用它 我决定编写一个小的编译时字符串解析器 然而 我正在努力保持我的对象constexpr将其传递给函数时 考虑以下代码 include
  • 无法注册时间触发的后台任务

    对于 Windows 8 应用程序 在 C Xaml 中 我尝试注册后台任务 很难说 但我想我的后台任务已正确注册 但是当我单击调试位置工具栏上的后台任务名称时 我的应用程序停止工作 没有任何消息 我查看了事件查看器上的日志 得到 具有入口
  • 强制初始化模板类的静态数据成员

    关于模板类的静态数据成员未初始化存在一些问题 不幸的是 这些都没有能够帮助我解决我的具体问题的答案 我有一个模板类 它有一个静态数据成员 必须为特定类型显式实例化 即必须专门化 如果不是这种情况 使用不同的模板函数应该会导致链接器错误 这是
  • cpp.react库的C++源代码中奇怪的“->* []”表达式

    这是我在文档中找到的 C 片段cpp react 库 https github com schlangster cpp react implicit parallelism auto in D MakeVar 0 auto op1 in g
  • 语音识别编程问题入门

    所以 你们可能都看过 钢铁侠 其中托尼与一个名为贾维斯的人工智能系统进行交互 演示剪辑here http www youtube com watch v Go8zsh1Ev6Y 抱歉 这是广告 我非常熟悉 C C 和 Visual Basi
  • 即使没有异步,CallContext.LogicalGetData 也会恢复。为什么?

    我注意到CallContext LogicalSetData LogicalGetData不按照我期望的方式工作 内部设置的值async方法得到恢复即使没有异步或任何类型的线程切换 无论如何 这是一个简单的例子 using System u
  • 在 VS 中运行时如何查看 C# 控制台程序的输出?

    我刚刚编写了一个名为 helloworld 的聪明程序 它是一个 C NET 4 5 控制台应用程序 在扭曲的嵌套逻辑迷宫深处 使用了 Console WriteLine 当我在命令行运行它时 它会运行并且我会看到输出 我可以执行其他命令并
  • 不可变类与结构

    以下是类与 C 中的结构的唯一区别 如果我错了 请纠正我 类变量是引用 而结构变量是值 因此在赋值和参数传递中复制结构的整个值 类变量是存储在堆栈上的指针 指向堆上的内存 而结构变量作为值存储在堆上 假设我有一个不可变的结构 该结构的字段一
  • 模板外部链接?谁能解释一下吗?

    模板名称具有链接 3 5 非成员函数模板可以有内部链接 任何其他模板名称应具有外部链接 从具有内部链接的模板生成的实体与在其他翻译单元中生成的所有实体不同 我知道使用关键字的外部链接 extern C EX extern C templat
  • 在 C 中使用枚举而不是 #defines 作为编译时常量是否合理?

    在 C 工作了一段时间后 我将回到 C 开发领域 我已经意识到 在不必要的时候应该避免使用宏 以便让编译器在编译时为您做更多的工作 因此 对于常量值 在 C 中我将使用静态 const 变量或 C 11 枚举类来实现良好的作用域 在 C 中
  • 将 Word 转换为 PDF - 禁用“保存”对话框

    我有一个用 C 编写的 Word 到 PDF 转换器 除了一件事之外 它工作得很好 有时 在某些 Word 文件上 后台会出现一条消息保存源文件中的更改 gt 是 否 取消 但我没有对源文件进行任何更改 我只想从 Word 文件创建 PDF
  • 将函数参数类型提取为参数包

    这是一个后续问题 解包 元组以调用匹配的函数指针 https stackoverflow com questions 7858817 unpacking a tuple to call a matching function pointer
  • WPF DataGrid / ListView 绑定到数组 mvvm

    我们假设你有 N 个整数的数组 表示行数的整数值 在模型中 该整数绑定到视图中的 ComboBox Q1 如何将数组 或数组的各个项目 绑定到 DataGrid 或 ListView 控件 以便 当您更改 ComboBox 值时 只有那么多
  • C++:二叉树所有节点值的总和

    我正在准备面试 我被一个二叉树问题困住了 我们如何计算二叉树所有节点中存在的值的总和 优雅的递归解决方案 伪代码 def sum node if node NULL return 0 return node gt value sum nod
  • 在 Win32 控制台应用程序中设置光标位置

    如何在 Win32 控制台应用程序中设置光标位置 最好 我想避免制作句柄并使用 Windows 控制台功能 我花了整个早上沿着那条黑暗的小巷跑 它产生的问题比它解决的问题还要多 我似乎记得当我在大学时使用 stdio 做这件事相对简单 但我
  • 没有“对 *this”功能的右值引用的解决方法

    我有一个围绕可移动对象的代理容器类 并希望代理能够隐式生成对底层对象的右值引用 但仅当代理本身被移动时 我相信我将能够按照提案 n2439 实施此行为 将移动语义扩展到 this http www open std org jtc1 sc2
  • 是否允许全局静态标识符以单个 _ 开头?

    换句话说 可能static 文件范围 全局变量恰好以一个下划线开头 而不会产生与 C 实现发生名称冲突的可能性 https www gnu org software libc manual html node Reserved Names

随机推荐

  • CSS background-position属性

    background position可以用于设置背景图像的位置 主要有以下三类 1 关键字 center top left bottom right 如果只写了一个值 那么第二个值默认为center 比如 background posit
  • 第二章 摩格里奇时代

    第二章 摩格里奇时代 现在思科的CEO钱伯斯头上光环耀眼 但不要忘了 钱伯斯之所以能够达到今天的高度 是因为他站在 巨人 肩膀上的缘故 这个巨人就是摩格里奇 很多人都知道思科 都知道钱伯斯 但是对思科的第一任CEO摩格里奇却不太熟悉 事实上
  • 【论文翻译】PyMAF-X: Towards Well-aligned Full-bodyModel Regression from Monocular Images

    摘要 我们提出了PyMAF X 一种基于回归的方法 从单个图像中恢复全身参数模型 这个任务是非常具有挑战性的 因为微小的参数偏差可能会导致估计网格和输入图像之间明显的不对齐 此外 当将特定部位的估计集成到全身模型时 现有的解决方案往往会降低
  • SpringMVC源码研究之注解mvc:argument-resolvers

    1 起因 最近在看开涛大神的 跟我学Shiro 系列文章的源码时 发现这样的一个技巧 通过一个继承自Shiro自定义PathMatchingFilter的SysUserFilter类将当前用户的信息推入到本次请求Request实例中 然后使
  • 运用Prometheus监控Flink

    1 为什么选择Prometheus 2 使用自动发现的配置方式有什么优点 3 如何提交作业 为什么选择Prometheus 随着深入地了解Prometheus 你会发现一些非常好的功能 服务发现使配置更加容易 Prometheus支持con
  • 《图解HTTP》笔记2

    1 SSL Secure Socket Layer 安全套接层 1 SSL的作用 通信加密 确定通信方 SSL 提供认证和加密处理及摘要功能 HTTP 协议中没有加密机制 但可以通过和 SSL Secure Socket Layer 安全套
  • Python写小游戏之石头剪刀布,while循环if判断语句

    剪刀石头布实验 game input 剪刀石头布小游戏 本游戏为五局三胜制 请输入go开始挑战 num 0 false 0 true 0 planish 0 while game go and num lt 5 num 1 a input
  • dgl库的后端设置

    dgl库当中后端设置方法 关于dgl大致介绍 关于后端 关于dgl大致介绍 目前最为火爆的深度学习应该就是关于图神经网络相关的研究了 传统的机器学习算法已经非常成熟 但是解决的问题对象是有限的 容易受到数据的结构等影响 比如非结构化的数据就
  • Series.to_frame()函数

    可以将数组转换为DataFrame格式 示例
  • 【极化 SAR 图像分类】H-Alpha 分类

    希望这篇内容可以帮到来自未来的你 样图 实现 部分缺省实现可参考 极化 SAR 图像分类 H Alpha 平面绘制 jaredyam的博客 CSDN博客 import matplotlib pyplot as plt import nump
  • Qt通过QProcess启动进程并传递命令行参数

    目录 QProcess 启动外部程序的两种方式 依赖式 分离式 启动进程前的预处理 设置启动路径 设置启动命令参数 启动的状态 更多说明 Public Functions Signals 设计一个拉起进程的程序 基本设计思路 效果图 核心代
  • 前端错误监控及前端错误上报

    window addEventListener unhandledrejection e gt console log error e throw e reason window addEventListener error errs gt
  • 2W+字系统讲解如何用Python自动化操作PPT,学懂这篇文章就够了

    大家好 之前给大家分享过用Python办公自动化系列 Python 自动化操作Excel PDF 今天给大家分享用Python自动化操作PPT 本文内容较长 喜欢记得关注 收藏 点赞 注 文末提供资料和交流方式 1 PPT自动化能干什么 有
  • 日志工厂

  • ajax如何获多个上传文件,Ajaxupload如何实现多文件上传操作

    Ajaxupload如何实现多文件上传操作 发布时间 2021 07 24 10 50 09 来源 亿速云 阅读 56 作者 小新 这篇文章主要介绍了Ajaxupload如何实现多文件上传操作 具有一定借鉴价值 感兴趣的朋友可以参考下 希望
  • 基于Simulink的ask,psk,fsk仿真

    基于Simulink的ask psk fsk仿真 本实验基于matlab的simulink 实验步骤如下 单极性基带信号和双极性基带信号 利用simulink中的Bernoulli Binary Generator可以产生随机的二进制信号
  • STL之queue

    queue是容器适配器 没有迭代器 queue的所有元素的进出都必须符合先进先出的条件 没有走访功能 STL中deque和list都可以作为queue的底层容器 缺省使用deque实现 ifndef STL LIMITED DEFAULT
  • CANN-AICPU算子开发

    1 算子 算子是一个函数空间到函数空间上的映射O X gt X 广义的讲 对任何函数进行某一项操作都可以认为是一个算子 在Caffe中 算子对应层中的计算逻辑 例如 卷积层中的卷积算法 是一个算子 全连接层中的权值求和过程 是一个算子 算子
  • php google gmail第三方登录

    生成秘钥 获取ID 秘钥 下载PHP SDK SDK链接 代码 gmail 授权页与回调接口公用一个接口 没有code时进入授权页 用户登录google 授权 之后google 带code 等信息 回调此接口 需要在console deve
  • 顺序表基本操作(完整)

    Seqlist h define CRT SECURE NO WARNINGS 1 pragma once include