C语言数据结构串的表示与操作的实现
串的堆分配储存表示
typedef struct {
char* ch;//若是非空字符串,则按串长分配存储区,否则ch为NULL
int length;//串长度
} HString;
生成一个其值等于串常量的串
HString StrAssign(HString Str, char* chars) {
//生成一个其值等于串常量的chars的串T
if (Str.ch) {
//释放T的空间
free(Str.ch);
}
int len = 0;
printf_s("chars=%s\n", chars);
while (1) {
len++;
if (chars[len] == '\0') {
//TODO
break;
}
}
if (!len) {
//长度为0为ch赋NULL值
Str.ch = NULL;
Str.length = 0;
}
else {
if (!(Str.ch = (char*)malloc(len * sizeof(char)))) {
//空间不足退出
exit(ERROR);
}
for (int i = 0; i <= len - 1; i++) {
//TODO
Str.ch[i] = chars[i];
}
Str.ch[len] = '\0';
printf("Str.ch=%s\n", Str.ch);
Str.length = len;
}
return Str;
}
比较字符串
int StrCompares(HString S, HString T) {
// 若S>T,则返回值>0;若S<T,则返回值=0,若S<T,则返回值<0
printf_s("123\n");
for (int i = 0; i <= S.length && i < T.length; ++i) {
//TODO
if (S.ch[i] != T.ch[i]) {
//TODO
return S.ch[i] - T.ch[i];
}
}
return S.length - T.length;
}
清空串
HString ClearString(HString S) {
// 将S清为空串
if (S.ch) {
//TODO
free(S.ch);
S.ch = NULL;
}
S.length = 0;
return S;
}
链接新串
HString Concat(HString T, HString S1, HString S2) {
//用T返回由S1和S2链接而成的新串
if (T.ch)
{
free(T.ch);//释放旧空间
}
if (!(T.ch = (char*)malloc((S1.length + S2.length) * sizeof(char))))
{
exit(ERROR);
}
for (int i = 0; i < S1.length; i++)
{
printf("i=%d\n", i);
T.ch[i] = S1.ch[i];
}
T.length = S1.length + S2.length;
for (int i = S1.length; i < T.length; i++)
{
T.ch[i] = S2.ch[i - S1.length];
}
T.ch[T.length] = '\0';
return T;
}
用Sub返回串S的第pos个字符起长度为len的子串
HString SubString(HString Sub, HString S, int pos, int len) {
//用Sub返回串S的第pos个字符起长度为len的子串
//其中,1<=pos<=StrLength(S)&&0<=len<=StrLength(S)-pos+1
if (pos<1 || pos>S.length || len<0 || len>S.length - pos + 1)
{
exit(ERROR);
}
if (Sub.ch)
{
//释放旧空间
free(Sub.ch);
}
if (!len)
{
//空子串
Sub.ch = NULL;
Sub.length = 0;
}
else
{
Sub.ch = (char*)malloc(len * sizeof(char));
int lengthNum = 0;
int posNum = 1;
while (1)
{
Sub.ch[lengthNum] = S.ch[posNum];
lengthNum++;
posNum++;
if (posNum == pos + len && posNum <= S.length)
{
break;
}
}
Sub.length = len;
Sub.ch[len] = '\0';
}
return Sub;
}
C语言数据结构串的表示与操作的实现的更多相关文章
- 数据结构- 串的模式匹配算法:BF和 KMP算法
数据结构- 串的模式匹配算法:BF和 KMP算法 Brute-Force算法的思想 1.BF(Brute-Force)算法 Brute-Force算法的基本思想是: 1) 从目标串s 的第一个字 ...
- C语言中关于对目录的操作
原文地址:C语言中关于对目录的操作 目录的操作不论是在嵌入式产品还是应用软件编程都是必不可少的,不同的开发语言可能略有不同,笔者主要是讨论在Linux平台下对目录的一系列操作: 1.获取当前目录操作: ...
- C语言第十二讲,文件操作.
C语言第十二讲,文件操作. 一丶文件操作概述 在操作系统中,我们的文档都称为文件.操作系统也为我们提供了接口进行操作.不同语言都是使用的相同的接口,只不过封装的上层接口不一样 操作文件的步骤 打开文件 ...
- c语言,数据结构,链表的一些操作总结
下面是自己的一些学习操作以及总结,能用我会很开心,有不足之处,欢迎大家提出宝贵的意见! c语言链表是一种基本的数据结构,与顺序表一样属于线性表,但是顺序表在内存中的存储单元是连续的,这样就对内存的要求 ...
- C语言数据结构-链式队列的实现-初始化、销毁、清空、长度、队列头元素、插入、删除、显示操作
1.数据结构-链式队列的实现-C语言 typedef struct QNode { int data; struct QNode *next; }QNode,*QueuePtr; typedef st ...
- C语言数据结构-循环队列的实现-初始化、销毁、清空、长度、队列头元素、插入、删除、显示操作
1.数据结构-循环队列的实现-C语言 #define MAXSIZE 100 //循环队列的存储结构 typedef struct { int* base; //基地址 int _front; //头 ...
- C语言数据结构-队列的实现-初始化、销毁、清空、长度、队列头元素、插入、删除、显示操作
1.数据结构-队列的实现-C语言 //队列的存储结构 #define MAXSIZE 100 typedef struct { int* base; //基地址 int _front; //头指针 i ...
- C语言数据结构-链式栈的实现-初始化、销毁、长度、取栈顶元素、查找、入栈、出栈、显示操作
1.数据结构-链式栈的实现-C语言 //链式栈的链式结构 typedef struct StackNode { int data; struct StackNode *next; } StackNod ...
- C语言数据结构-栈的实现-初始化、销毁、长度、取栈顶元素、查找、入栈、出栈、显示操作
1.数据结构-栈的实现-C语言 #define MAXSIZE 100 //栈的存储结构 typedef struct { int* base; //栈底指针 int* top; //栈顶指针 int ...
- C语言数据结构-单链表的实现-初始化、销毁、长度、查找、前驱、后继、插入、删除、显示操作
1.数据结构-单链表的实现-C语言 typedef struct LNode { int data; struct LNode* next; } LNode,*LinkList; //这两者等价.Li ...
随机推荐
- 大规模爬取(新浪为例子)网页之downloader、parser的封装(涉及编码等细节)
import requests import cchardet import traceback from lxml import etree def downloader(url,timeout = ...
- 玩 ChatGPT 的正确姿势「GitHub 热点速览 v.22.49」
火了一周的 ChatGPT,HG 不允许还有小伙伴不知道这个东西是什么?简单来说就是,你可以让它扮演任何事物,据说已经有人用它开始了颜色文学创作.因为它太火了,所以,本周特推在几十个带有"c ...
- 【JVM】经典垃圾回收器
本文已收录至Github,推荐阅读 Java随想录 微信公众号:Java随想录 CSDN: 码农BookSea 转载请在文首注明出处,如发现恶意抄袭/搬运,会动用法律武器维护自己的权益.让我们一起维护 ...
- JavaScript:函数:如何声明和调用函数?
首先,理解什么是函数? 通俗的说,函数就是用大括号括起来的一组JS语句的集合体,是一个代码块,表达一种行为逻辑. 当我们调用函数的时候,我们就是在执行这一组JS语句. 然后,确定一点,在JS中,函数也 ...
- 在windows上构建OpenCascade
基于作者QuaoarsWorkshop的视频Open Cascade Lessons,讲的非常详细,观看需要魔法 什么是OCCT?. 首先,Open CASCADE Technology SDK 是一 ...
- 基于MongoDb的事件订阅实现hook监听
详情请参考原文:-- 基于MongoDb的事件订阅实现hook监听(insert,update,remove,find等事件开始,事件成功等)
- ES6 中 Promise对象使用学习
转载请注明出处: Promise 对象是 JavaScript 的异步操作解决方案,为异步操作提供统一接口.它起到代理作用(proxy),充当异步操作与回调函数之间的中介,使得异步操作具备同步操作的接 ...
- pycharm下载 安装使用
pycharm下载与使用 1.下载 该软件分免费版和收费版 免费版(community):功能少 收费版(professional):30天试用 我们尽量使用收费版本 官网地址:h ...
- Three.js 进阶之旅:新春特典-Rabbit craft go 🐇
声明:本文涉及图文和模型素材仅用于个人学习.研究和欣赏,请勿二次修改.非法传播.转载.出版.商用.及进行其他获利行为. 摘要 兔年到了,祝大家身体健,康万事顺利.本文内容作为兔年新春纪念页面,将使用 ...
- 万字详解,吃透 MongoDB!
本文已经收录进 JavaGuide(「Java学习+面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识.) 少部分内容参考了 MongoDB 官方文档的描述,在此说明一下. MongoDB ...