以串结构存储c语言版,数据结构C语言版 串的块链存储表示和实现

《数据结构C语言版 串的块链存储表示和实现》由会员分享,可在线阅读,更多相关《数据结构C语言版 串的块链存储表示和实现(13页珍藏版)》请在人人文库网上搜索。

1、*数据结构C语言版 串的块链存储表示和实现P78编译环境:Dev-C+ 4.9.9.2日期:2011年2月12日 */ #include #include #include #include / LString.h 串的块链存储表示 #define CHUNKSIZE 4 / 可由用户定义的块大小 typedef struct Chunkchar chCHUNKSIZE;/块的数据域struct Chunk *next;/块的指针域Chunk;typedef structChunk *head,/ 串的头指针 *tail;/ 串的尾指针 int curlen;/ 串的当前长度 LString;。

2、char blank = #;/ 全局变量,用于填补空余 / 初始化(产生空串)字符串T。void InitString(LString *T)(*T).curlen=0;(*T).head=NULL;(*T).tail=NULL;/ 生成一个其值等于chars的串T(要求chars中不包含填补空余的字符) / 成功返回1,否则返回0 int StrAssign(LString *T,char *chars)int i,j,k,l;Chunk *p,*q;i=strlen(chars); / i为串的长度 if(!i|strchr(chars,blank) / 串长为0或chars中包含填补空。

3、余的字符 return 0;(*T).curlen=i;j=i/CHUNKSIZE;/ j为块链的结点数,块的个数 if(i%CHUNKSIZE)/不足一个块的,当成一个块即块数加1j+;for(k=0;knext=p;q=p;for(l=0;lch+l)=*chars+;if(!*chars) / 最后一个链块 (*T).tail=q;q-next=NULL;for(;lch+l)=blank;return 1;/ 由串S复制得串T(连填补空余的字符一块拷贝) int StrCopy(LString *T,LString S)Chunk *h=S.head,*p,*q;(*T).curlen。

4、=S.curlen;if(h)p=(*T).head=(Chunk*)malloc(sizeof(Chunk);*p=*h; / 复制1个结点 h=h-next;while(h)/没到队尾,继续复制块q=p;p=(Chunk*)malloc(sizeof(Chunk);q-next=p;*p=*h;h=h-next;p-next=NULL;(*T).tail=p;return 1;elsereturn 0;/ 若S为空串,则返回1,否则返回0int StrEmpty(LString S)if(S.curlen) / 非空 return 0;elsereturn 1;/ 若ST,则返回值0;若S。

5、=T,则返回值=0;若Sch+js)=blank) / 跳过填补空余的字符 js+;if(js=CHUNKSIZE)ps=ps-next;js=0; / *(ps-ch+js)为S的第i个有效字符 while(*(pt-ch+jt)=blank) / 跳过填补空余的字符 jt+;if(jt=CHUNKSIZE)pt=pt-next;jt=0; / *(pt-ch+jt)为T的第i个有效字符 if(*(ps-ch+js)!=*(pt-ch+jt)return *(ps-ch+js)-*(pt-ch+jt);else / 继续比较下一个字符 js+;if(js=CHUNKSIZE)ps=ps-ne。

6、xt;js=0;jt+;if(jt=CHUNKSIZE)pt=pt-next;jt=0;return S.curlen-T.curlen;/ 返回S的元素个数,称为串的长度int StrLength(LString S)return S.curlen;/ 将S清为空串int ClearString(LString *S)Chunk *p,*q;/释放空间,并置空p=(*S).head;while(p)q=p-next;free(p);p=q;(*S).head=NULL;(*S).tail=NULL;(*S).curlen=0;return 1;/ 用T返回由S1和S2联接而成的新串int C。

7、oncat(LString *T,LString S1,LString S2)LString a1,a2;InitString(&a1);InitString(&a2);StrCopy(&a1,S1);StrCopy(&a2,S2);(*T).curlen=S1.curlen+S2.curlen;(*T).head=a1.head;a1.tail-next=a2.head;(*T).tail=a2.tail;return 1;/ 用Sub返回串S的第pos个字符起长度为len的子串。 int SubString(LString *Sub, LString S,int pos,int len)C。

8、hunk *p,*q;int i,k,n,flag=1;/用来标志复制是否完成,1完成,0未完成if(posS.curlen|lenS.curlen-pos+1)return 0;n=len/CHUNKSIZE; if(len%CHUNKSIZE)n+; / n为块的个数 p=(Chunk*)malloc(sizeof(Chunk);(*Sub).head=p;/ 生成空的Sub串 for(i=1;inext=q;p=q;p-next=NULL;(*Sub).tail=p;(*Sub).curlen=len;for(i=len%CHUNKSIZE; ich+i)=blank; / 填充Sub尾。

9、部的多余空间 q=(*Sub).head; / q指向Sub串即将复制的块 i=0;/ i指示即将复制的字符在块中的位置 p=S.head;/ p指向S串的当前块 n=0;/ n指示当前字符在串中的序号 while(flag)for(k=0; kch+k)!=blank)n+;if(n=pos&nnext;i=0;*(q-ch+i)=*(p-ch+k);i+;if(n=pos+len-1) / 复制结束 flag=0;break;p=p-next;return 1;/ T为非空串。若主串S中第pos个字符之后存在与T相等的子串, / 则返回第一个这样的子串在S中的位置,否则返回0 int In。

10、dex(LString S,LString T,int pos) int i,n,m;LString sub;if(pos=1 & posch+j)!=blank)*(q+n)=*(h-ch+j);n+;h=h-next;/h指向下一个块*(q+n)=0;/ 串结束符 ClearString(S);/ 清空S StrAssign(S,q); / 重新生成S / 在串S的第pos个字符之前插入串T int StrInsert(LString *S,int pos,LString T)int i,j,k;Chunk *p,*q;LString t;if(posStrLength(*S)+1) / 。

11、pos超出范围 return 0;StrCopy(&t,T); / 复制T为t Zip(S); / 去掉S中多余的填补空余的字符 i=(pos-1)/CHUNKSIZE; / 到达插入点要移动的块数 j=(pos-1)%CHUNKSIZE; / 到达插入点在最后一块上要移动的字符数 p=(*S).head;if(pos=1) / 插在S串前 t.tail-next=(*S).head;(*S).head=t.head;else if(j=0) / 插在块之间 for(k=1;knext; / p指向插入点的左块 q=p-next; / q指向插入点的右块 p-next=t.head; / 插入。

12、t t.tail-next=q;if(q=NULL) / 插在S串后 (*S).tail=t.tail; / 改变尾指针 else / 插在一块内的两个字符之间 for(k=1;knext; / p指向插入点所在块 q=(Chunk*)malloc(sizeof(Chunk); / 生成新块 for(i=0;ich+i)=blank; / 块q的前j个字符为填补空余的字符 for(i=j;ich+i)=*(p-ch+i); / 复制插入点后的字符到q *(p-ch+i)=blank; / p的该字符为填补空余的字符 q-next=p-next;p-next=t.head;t.tail-next。

13、=q;(*S).curlen+=t.curlen;Zip(S);/进行压缩return 1;/ 从串S中删除第pos个字符起长度为len的子串int StrDelete(LString *S,int pos,int len)int i=1; / 当前字符是S串的第i个字符(1S.curlen) Chunk *p=(*S).head; / p指向S的当前块 int j=0; / 当前字符在当前块中的位序(0CHUNKSIZE-1) if(pos(*S).curlen-len+1|lench+j)=blank) / 跳过填补空余的字符 j+;if(j=CHUNKSIZE) / 应转向下一块 p=p。

14、-next;j=0;i+; / 当前字符是S的第i个字符 j+;if(j=CHUNKSIZE) / 应转向下一块 p=p-next;j=0; / i=pos,*(p-ch+j)为S的第pos个有效字符 while(ich+j)=blank) / 跳过填补空余的字符 j+;if(j=CHUNKSIZE) / 应转向下一块 p=p-next;j=0;*(p-ch+j)=blank; / 把字符改成填补空余的字符来删除第i个字符 i+; / 到下一个字符 j+;if(j=CHUNKSIZE) / 应转向下一块 p=p-next;j=0;(*S).curlen-=len; / 串的当前长度 retur。

15、n 1;/ 用V替换主串S中出现的所有与T相等的不重叠的子串int Replace(LString *S,LString T,LString V)int i=1; / 从串S的第一个字符起查找串T if(StrEmpty(T) / T是空串 return 0;doi=Index(*S,T,i); / 结果i为从上一个i之后找到的子串T的位置 if(i) / 串S中存在串T StrDelete(S,i,StrLength(T); / 删除该串T StrInsert(S,i,V); / 在原串T的位置插入串V i+=StrLength(V); / 在插入的串V后面继续查找串T while(i);r。

16、eturn 1;/ 输出字符串T。void StrPrint(LString T)int i=0,j;Chunk *h;h=T.head;while(ich+j)!=blank) / 不是填补空余的字符 printf(%c,*(h-ch+j);i+;h=h-next;printf(n);void DestroyString()/ 块链类型的字符串无法销毁 int main()char *s1=ABCDEFGHI,*s2=12345,*s3=,*s4=asd#tr,*s5=ABCD;int k;int pos,len;LString t1,t2,t3,t4;InitString(&t1);Ini。

17、tString(&t2);printf(初始化串t1后,串t1空否?%d(1:空 0:否) 串长=%dn,StrEmpty(t1),StrLength(t1);k=StrAssign(&t1,s3);if(k=1)printf(串t1为: );StrPrint(t1);elseprintf(出错n); / 不能生成空串 k=StrAssign(&t1,s4);if(k=1)printf(串t1为: );StrPrint(t1);elseprintf(出错n); / 不能生成含有变量blank所代表的字符的串 k=StrAssign(&t1,s1);if(k=1)printf(串t1为: );S。

18、trPrint(t1);elseprintf(出错n);printf(串t1空否?%d(1:空 0:否) 串长=%dn,StrEmpty(t1),StrLength(t1);StrAssign(&t2,s2);printf(串t2为: );StrPrint(t2);StrCopy(&t3,t1); printf(由串t1拷贝得到串t3,串t3为: );StrPrint(t3);InitString(&t4);StrAssign(&t4,s5);printf(串t4为: );StrPrint(t4);Replace(&t3,t4,t2);printf(用t2取代串t3中的t4串后,串t3为: )。

19、;StrPrint(t3);ClearString(&t1);printf(清空串t1后,串t1空否?%d(1:空 0:否) 串长=%dn,StrEmpty(t1),StrLength(t1);Concat(&t1,t2,t3);printf(串t1(=t2+t3)为: );StrPrint(t1);Zip(&t1);printf(去除不必要的占位符后,串t1为: );StrPrint(t1); pos=Index(t1,t3,1);printf(pos=%dn,pos);printf(在串t1的第pos个字符之前插入串t2,请输入pos: );scanf(%d,&pos);k=StrInse。

20、rt(&t1,pos,t2);if(k)printf(插入串t2后,串t1为: );StrPrint(t1);elseprintf(插入失败!n);printf(求从t1的第pos个字符起,长度为len的子串t2,请输入pos,len: );scanf(%d,%d,&pos,&len);SubString(&t2,t1,pos,len);printf(串t2为: );StrPrint(t2);printf(StrCompare(t1,t2)=%dn,StrCompare(t1,t2);printf(删除串t1中的子字符串:从第pos个字符起删除len个字符。请输入pos,len:);scanf。

21、(%d,%d,&pos,&len);k=StrDelete(&t1,pos,len);if(k)printf(从第%d位置起删除%d个元素后串t1为:,pos,len);StrPrint(t1);system(pause);return 0;/*输出效果:初始化串t1后,串t1空否?1(1:空 0:否) 串长=0出错出错串t1为: ABCDEFGHI串t1空否?0(1:空 0:否) 串长=9串t2为: 12345由串t1拷贝得到串t3,串t3为: ABCDEFGHI串t4为: ABCD用t2取代串t3中的t4串后,串t3为: 12345EFGHI清空串t1后,串t1空否?1(1:空 0:否) 串长=0串t1(=t2+t3)为: 1234512345EFGHI去除不必要的占位符后,串t1为: 1234512345EFGHIpos=6在串t1的第pos个字符之前插入串t2,请输入pos: 3插入串t2后,串t1为: 121234534512345EFGHI求从t1的第pos个字符起,长度为len的子串t2,请输入pos,len: 2,2串t2为: 21StrCompare(t1,t2)=-1删除串t1中的子字符串:从第pos个字符起删除len个字符。请输入pos,len:2,2从第2位置起删除2个元素后串t1为:1234534512345EFGHI请按任意键继续. . . */。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/567853.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql索引创建及使用注意事项

总结: 1、在使用索引时,一般情况下不建议使用like操作。如果使用,则%放在后面。否则不会使用索引。like ‘%abd%’不会使用索引,而like ‘aaa%’可以使用索引.(最左缀原则) 2、单列索引的使用: 《1》 只…

mulitpartfile怎么接收不到值_和平精英信号接收区和信号值是什么?信号值怎么恢复...

[闽南网]和平精英公测开启,和平精英与刺激战场有什么不同呢?今天小编就为大家带来了信号值详解!各位玩家千万不要错过呀!信号值详解信号接收区和信号值是什么,对选手有什么影响?在游戏战斗界面中&#xff0…

c语言编程判断素数的函数,【面试题】C语言:实现一个函数,判断一个数是不是素数。...

#include#include#includeint prime(int num){int k 0;int i 0;k sqrt(num);for (i 2; i < k; i) /*不满足循环条件时即均不可被整除&#xff0c;不是素数*/{if (num%i 0){return 0;}}return -1;}int main(){int num 0;int ret 0;printf("please input the nu…

Linux命令 umask,chmod使用

一、文件权限详解 1、文件权限介绍 在linux中的每一个文件或目录都包含有访问权限&#xff0c;这些访问权限决定了谁能访问和如何访问这些文件和目录。通过设定权限可以从以下三种访问方式限制访问权限&#xff1a;只允许用户自己访问&#xff1b;允许一个预先指定的用户组中…

python启动c语言gdb,使用gdb调试python程序

游戏服务器菜鸟之C&num;初探三游戏服务在经过上述2番折腾之后,最后决定使用TCP进行通信,所以在一次进行重构 主要重构的要点 1.将过来的HTPP请求,重构为TCP请求: 2.使用组件FluenScheduler进行怪物的定时刷新,和定时 ...Windows环境下的NodeJS&plus;NPM&plus;Bower…

制备pdms膜的方法_船体用钢板基底超疏水表面的制备和性能

鲨鱼皮具有神奇的微纳双层结构&#xff0c;其微米级肋条状结构在水中的整流效果可减小水的阻力。纳米级刺状突起或刚毛具有疏水特性&#xff0c;使植物抱子很难附着其上&#xff0c;海藻等植物也不能在其表面生长&#xff3b;1,2&#xff3d;。这种微纳结构及其疏水性的共同作用…

递归题型解析

#include<iostream> using namespace std; int foo(int n) {if (n < 1)return n;return (foo(n - 1) foo(n - 2)); } int main() {printf("%d\n", foo(5));return 0; } 解析&#xff1a; foo(5)foo(4)f00(3)foo(3)foo(2)foo(3)2foo(3)foo(2)2(foo(2)foo(1…

64位c语言调用32位glibc,glibc fclose源代码阅读及伪造_IO_FILE利用fclose实现任意地址执行...

简介最近学习了一下_IO_FILE的利用&#xff0c;刚好在pwnable.tw上碰到一道相关的题目。拿来做了一下&#xff0c;遇到了一些困难&#xff0c;不过顺利解决了&#xff0c;顺便读了一波相关源码&#xff0c;对_IO_FILE有了更深的理解。文章分为三部分&#xff0c;分别是利用原理…

戴尔笔记本电脑开机黑屏怎么办_戴尔笔记本电脑充不进电怎么办

笔记本电脑电池充不进电要怎么办呢&#xff1f;笔记本电脑之所以这么受欢迎&#xff0c;是因为笔记本有配备电池&#xff0c;能够在没有电源的情况下使用五六个小时。而电池的电用光后&#xff0c;就需要进行充电。不过有些用户反映说&#xff0c;自己的电池充不进电&#xff0…

linux之trap命令

一. trap捕捉到信号之后&#xff0c;可以有三种反应方式&#xff1a;   (1)执行一段程序来处理这一信号   (2)接受信号的默认操作   (3)忽视这一信号 二. trap对上面三种方式提供了三种基本形式&#xff1a; 第一种形式的trap命令在shell接收到signal list清单中数…

IIS安装2个SSL_顶级域名0元撸-免费注册2个腾讯云域名 免费SSL证书

前言这两天折腾甜糖CDN&#xff0c;为了收益最大化申请了公网IP&#xff0c;于是顺带折腾了一下群晖外网访问。使用的DDNS方案是腾讯dnspod&#xff0c;注册一个便宜的顶级域名访问我的群晖&#xff0c;折腾过程中发现可以免费注册2个顶级域名&#xff0c;不敢独享发出来大家一…

c语言中文刷屏,c语言二维数组刷屏练习.doc

c语言二维数组刷屏练习// 二维数组的刷屏综合练习 编制于2012.9.23#include#include#include#include#define WIDTH 22//宏定义/***********************函数声明**********************************************/void init();//数组赋初值void print();//显示当前数组void mov…

三菱a系列motion软体_工控电缆如何制作?(以三菱PLC、触摸屏为例)

RS232接口的三菱Q系列PLC编程通讯电缆三菱GT11/GT15触摸屏RS232串口编程电缆三菱GT11/GT15触摸屏连接Q系列PLC电缆三菱GT11/GT15触摸屏连接FX2/FX2C/A/QnA系列PLC电缆三菱GT11/GT15 触摸屏连接FX3U/FX2N/FX1N系列PLC电缆FX2、A系列PLC到A970GOT人机介面连接电缆FX0s/FX0n/FX2n/…

c语言水仙花验证,[编程入门]水仙花数判断 (C语言代码)

解题思路:三个变量 判断一下 yes就输出注意事项:参考代码:#include using namespace std;int a[5];int used[5];int print[4];void dfs(int cur,int cont){if(cur 4){for(int i 1;i < 3;i){cout<}cout<return;}for(int i 1;i < 4;i){if(used[i] 0&&i !…

C/C++混淆点-与

简介&#xff1a; &&是逻辑与运算符&#xff0c;||是逻辑或运算符&#xff0c;都是逻辑运算符&#xff0c;两边只能是bool类型 &与| 既可以进行逻辑运算&#xff0c;又可以进行位运算&#xff0c;两边既可以是bool类型&#xff0c;又可以是数值类型 区别&#xf…

电脑入门完全自学手册_「新书推荐」新能源汽车维修完全自学手册

《新能源汽车维修完全自学手册》作者&#xff1a;广州瑞佩尔信息科技有限公司 、胡欢贵售价&#xff1a;85.00上市时间&#xff1a;2020年7月本书内容分为 8 章, 第 1 章为高压安全系统, 主要介绍了新能源汽车中高压安全防护装置构造以及维修所需的安全防护工具、 安全作业规范…

c语言 整型转bool,C语言的布尔类型(_Bool)【转】

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼1. 我们自己定义的“仿布尔型”在C99标准被支持之前&#xff0c;我们常常自己模仿定义布尔型&#xff0c;方式有很多种&#xff0c;常见的有下面两种&#xff1a;view plaincopy to clipboardprint?/* 第一种方法 */#define TRUE …

C/C++混淆点-左移右移操作符

对一个数实行左移或者右移操作&#xff0c;即先把操作数转换为二进制&#xff0c;然后左移&#xff08;>>&#xff09;即从左到右开始舍弃&#xff0c;右移&#xff08;<<&#xff09;即从各位之后开始加0。最后再转换为十进制。 #include<iostream> using…

ar路由器 pppoe下发ipv6 dns_IPv6网络设置各种疑难杂症诊疗区

1、Windows电脑系统IPv6无网络访问权限怎么解决&#xff1f;Win7系统下连接IPv6无网络访问权限的解决方法&#xff08;1&#xff09;首先修复网络连接&#xff0c;Win XP操作系统的网络连接有“修复”选项&#xff0c;Win7没有&#xff0c;不过可以使用“诊断”选项&#xff0c…

c语言判断化学方程式,下列是某同学写的六个化学方程式:①Mg+O2点燃.MgO2②C+O2点燃.CO...

化学方程式是最重要的化学语言&#xff0c;正确、熟练地书写化学方程式是学习化学必需具备的重要基本功。怎样书写化学方程式?1.要遵循两个基本原则(1)以客观事实为基础化学方程式既然是化学反应的表达形式&#xff0c;显然&#xff0c;有某一反应存在&#xff0c;才能用化学方…