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

相关文章

SpringBoot实现文件记录日志及日志文件自动归档和压缩

《SpringBoot实现文件记录日志及日志文件自动归档和压缩》Logback是Java日志框架,通过Logger收集日志并经Appender输出至控制台、文件等,SpringBoot配置logbac... 目录1、什么是Logback2、SpringBoot实现文件记录日志,日志文件自动归档和压缩2.1、

Python实现pdf电子发票信息提取到excel表格

《Python实现pdf电子发票信息提取到excel表格》这篇文章主要为大家详细介绍了如何使用Python实现pdf电子发票信息提取并保存到excel表格,文中的示例代码讲解详细,感兴趣的小伙伴可以跟... 目录应用场景详细代码步骤总结优化应用场景电子发票信息提取系统主要应用于以下场景:企业财务部门:需

基于Python实现智能天气提醒助手

《基于Python实现智能天气提醒助手》这篇文章主要来和大家分享一个实用的Python天气提醒助手开发方案,这个工具可以方便地集成到青龙面板或其他调度框架中使用,有需要的小伙伴可以参考一下... 目录项目概述核心功能技术实现1. 天气API集成2. AI建议生成3. 消息推送环境配置使用方法完整代码项目特点

spring-gateway filters添加自定义过滤器实现流程分析(可插拔)

《spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔)》:本文主要介绍spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔),本文通过实例图... 目录需求背景需求拆解设计流程及作用域逻辑处理代码逻辑需求背景公司要求,通过公司网络代理访问的请求需要做请

使用Python获取JS加载的数据的多种实现方法

《使用Python获取JS加载的数据的多种实现方法》在当今的互联网时代,网页数据的动态加载已经成为一种常见的技术手段,许多现代网站通过JavaScript(JS)动态加载内容,这使得传统的静态网页爬取... 目录引言一、动态 网页与js加载数据的原理二、python爬取JS加载数据的方法(一)分析网络请求1

Spring Security介绍及配置实现代码

《SpringSecurity介绍及配置实现代码》SpringSecurity是一个功能强大的Java安全框架,它提供了全面的安全认证(Authentication)和授权(Authorizatio... 目录简介Spring Security配置配置实现代码简介Spring Security是一个功能强

SpringCloud使用Nacos 配置中心实现配置自动刷新功能使用

《SpringCloud使用Nacos配置中心实现配置自动刷新功能使用》SpringCloud项目中使用Nacos作为配置中心可以方便开发及运维人员随时查看配置信息,及配置共享,并且Nacos支持配... 目录前言一、Nacos中集中配置方式?二、使用步骤1.使用$Value 注解2.使用@Configur

Python+PyQt5实现MySQL数据库备份神器

《Python+PyQt5实现MySQL数据库备份神器》在数据库管理工作中,定期备份是确保数据安全的重要措施,本文将介绍如何使用Python+PyQt5开发一个高颜值,多功能的MySQL数据库备份工具... 目录概述功能特性核心功能矩阵特色功能界面展示主界面设计动态效果演示使用教程环境准备操作流程代码深度解

golang float和科学计数法转字符串的实现方式

《golangfloat和科学计数法转字符串的实现方式》:本文主要介绍golangfloat和科学计数法转字符串的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望... 目录golang float和科学计数法转字符串需要对float转字符串做处理总结golang float

linux lvm快照的正确mount挂载实现方式

《linuxlvm快照的正确mount挂载实现方式》:本文主要介绍linuxlvm快照的正确mount挂载实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux lvm快照的正确mount挂载1. 检查快照是否正确创建www.chinasem.cn2.