C.Interface.And.Implementations—sequence的实现

2024-08-24 18:18

本文主要是介绍C.Interface.And.Implementations—sequence的实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、A sequence holds  N  values associated with the integer indices zero through N−1 when  N is positive. 

2、An empty sequence holds no values. 

3、Like arrays, values in a sequence may be accessed by indexing; 

4、they can also be added to or removed from either end of a sequence. 

5、Sequences expand automatically as necessary to accommodate their contents. Values are pointers.

6、they can be used as arrays, lists, stacks, queues, and deques, and they often subsume the facilities of separate
      ADTs for these data structures.


sequence底层数据结构如下图所示:

                    

其中左边部分阴影为上一节“dynamic array”,length为sequence中目前的元素总共数目,head为array中第一个元素的位置。可以看出,通过循环的dynamic array来实现sequence的。


==========================seq.h=============================

#ifndef SEQ_INCLUDED
#define SEQ_INCLUDED#define T Seq_T
typedef struct T *T;//exported functions
extern T      Seq_new   (int hint);
extern T      Seq_seq   (void *x, ...);
extern void   Seq_free  (T *seq);
extern int    Seq_length(T seq);
extern void  *Seq_get   (T seq, int i);
extern void  *Seq_put   (T seq, int i, void *x);
extern void  *Seq_addlo (T seq, void *x);
extern void  *Seq_addhi (T seq, void *x);
extern void  *Seq_remlo (T seq);
extern void  *Seq_remhi (T seq);#undef T
#endif

======================seq.c==========================

#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include "assert.h"
#include "seq.h"
#include "array.h"
#include "arrayrep.h"
#include "mem.h"#define T Seq_Tstruct T{struct Array_T  array;int length;int head;
};//static functions
static void expand(T seq){int n = seq->array.length;Array_resize(&seq->array, 2*n);if(seq->head > 0){void **old = &((void **)seq->array.array)[seq->head];memcpy(old+n, old, (n-seq->head)*sizeof(void *));seq->head += n;}
}//functions
T Seq_new(int hint){T seq;assert(hint >= 0);NEW0(seq);if(hint == 0)hint = 16;ArrayRep_init(&seq->array, hint, sizeof(void *),ALLOC(hint*sizeof(void *)));return seq;
}T Seq_seq(void *x, ...){va_list ap;T seq = Seq_new(0);va_start(ap, x);for( ; x; x = va_arg(ap, void *))Seq_addhi(seq, x);va_end(ap);return seq;
}void Seq_free(T *seq){assert(seq && *seq);assert((void *)*seq == (void *)&(*seq)->array);Array_free((Array_T *)seq);
}int Seq_length(T seq){assert(seq);return seq->length;
}void *Seq_get(T seq, int i){assert(seq);assert(i >= 0 && i < seq->length);return ((void **)seq->array.array)[(seq->head + i)%seq->array.length];
}void *Seq_put(T seq, int i, void *x){void *prev;assert(seq);assert(i >= 0 && i < seq->length);prev = ((void **)seq->array.array)[(seq->head + i)%seq->array.length];((void **)seq->array.array)[(seq->head + i)%seq->array.length] = x;return prev;
}void *Seq_remhi(T seq){int i;assert(seq);assert(seq->length > 0);i = --seq->length;return ((void **)seq->array.array)[(seq->head+i)%seq->array.length];
}void *Seq_remlo(T seq){int i = 0;void *x;assert(seq);assert(seq->length > 0);x = ((void **)seq->array.array)[(seq->head+i)%seq->array.length];seq->head = (seq->head + 1)%seq->array.length;--seq->length;return x;
}void *Seq_addhi(T seq, void *x){int i;assert(seq);if(seq->length == seq->array.length)expand(seq);i = seq->length++;return ((void **)seq->array.array)[(seq->head+i)%seq->array.length] = x;
}void *Seq_addlo(T seq, void *x){int i = 0;assert(seq);if(seq->length == seq->array.length)expand(seq);if(--seq->head < 0)seq->head = seq->array.length-1;seq->length++;return ((void **)seq->array.array)[(seq->head+i)%seq->array.length] = x;
}


这篇关于C.Interface.And.Implementations—sequence的实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1103237

相关文章

通过React实现页面的无限滚动效果

《通过React实现页面的无限滚动效果》今天我们来聊聊无限滚动这个现代Web开发中不可或缺的技术,无论你是刷微博、逛知乎还是看脚本,无限滚动都已经渗透到我们日常的浏览体验中,那么,如何优雅地实现它呢?... 目录1. 早期的解决方案2. 交叉观察者:IntersectionObserver2.1 Inter

Spring Gateway动态路由实现方案

《SpringGateway动态路由实现方案》本文主要介绍了SpringGateway动态路由实现方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随... 目录前沿何为路由RouteDefinitionRouteLocator工作流程动态路由实现尾巴前沿S

JavaScript对象转数组的三种方法实现

《JavaScript对象转数组的三种方法实现》本文介绍了在JavaScript中将对象转换为数组的三种实用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录方法1:使用Object.keys()和Array.map()方法2:使用Object.entr

k8s中实现mysql主备过程详解

《k8s中实现mysql主备过程详解》文章讲解了在K8s中使用StatefulSet部署MySQL主备架构,包含NFS安装、storageClass配置、MySQL部署及同步检查步骤,确保主备数据一致... 目录一、k8s中实现mysql主备1.1 环境信息1.2 部署nfs-provisioner1.2.

Java高效实现PowerPoint转PDF的示例详解

《Java高效实现PowerPoint转PDF的示例详解》在日常开发或办公场景中,经常需要将PowerPoint演示文稿(PPT/PPTX)转换为PDF,本文将介绍从基础转换到高级设置的多种用法,大家... 目录为什么要将 PowerPoint 转换为 PDF安装 Spire.Presentation fo

Java集合之Iterator迭代器实现代码解析

《Java集合之Iterator迭代器实现代码解析》迭代器Iterator是Java集合框架中的一个核心接口,位于java.util包下,它定义了一种标准的元素访问机制,为各种集合类型提供了一种统一的... 目录一、什么是Iterator二、Iterator的核心方法三、基本使用示例四、Iterator的工

springboot依靠security实现digest认证的实践

《springboot依靠security实现digest认证的实践》HTTP摘要认证通过加密参数(如nonce、response)验证身份,避免明文传输,但存在密码存储风险,相比基本认证更安全,却因... 目录概述参数Demopom.XML依赖Digest1Application.JavaMyPasswo

Java 线程池+分布式实现代码

《Java线程池+分布式实现代码》在Java开发中,池通过预先创建并管理一定数量的资源,避免频繁创建和销毁资源带来的性能开销,从而提高系统效率,:本文主要介绍Java线程池+分布式实现代码,需要... 目录1. 线程池1.1 自定义线程池实现1.1.1 线程池核心1.1.2 代码示例1.2 总结流程2. J

MySQL中C接口的实现

《MySQL中C接口的实现》本节内容介绍使用C/C++访问数据库,包括对数据库的增删查改操作,主要是学习一些接口的调用,具有一定的参考价值,感兴趣的可以了解一下... 目录准备mysql库使用mysql库编译文件官方API文档对象的创建和关闭链接数据库下达sql指令select语句前言:本节内容介绍使用C/

使用EasyPoi快速导出Word文档功能的实现步骤

《使用EasyPoi快速导出Word文档功能的实现步骤》EasyPoi是一个基于ApachePOI的开源Java工具库,旨在简化Excel和Word文档的操作,本文将详细介绍如何使用EasyPoi快速... 目录一、准备工作1、引入依赖二、准备好一个word模版文件三、编写导出方法的工具类四、在Export