《数据结构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请按任意键继续. . . */。

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

  1. 串的块链存储c语言栈,小蚂蚁学习数据结构(18)——串的块链的代码实现

    感觉上块链的代码实现比数组的代码实现要难一些,估计因为数组的实现书上有伪代码,而块链连伪代码都木有,不过归根到底还是水平不行--哭瞎--╥﹏╥... /* 数据结构C语言版 串的块链存储表示和实现 * ...

  2. c语言单链表存储字符串,串的块链存储结构(C语言)详解

    ,指的是使用 本节实现串的块链存储使用的是无头节点的单链表.当然根据实际需要,你也可以自行决定所用链表的结构(shujujiegou,该链表各个节点中可存储 1 个字符: 图 1 各节点仅存储 1 个 ...

  3. 数据结构小作业——串连接(块链结构)

    文章目录 概要 reference 串 存储结构 创建块链 连接块链 总 概要 以块链结构表示串,试编写将串s插入到串t某个字符之后的算法. reference link 串 和线性表相比就是对主要是 ...

  4. 4-3-串的块链存储结构-串-第4章-《数据结构》课本源码-严蔚敏吴伟民版

    课本源码部分 第4章  串 - 块链串 --<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接☛☛☛ <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集 ...

  5. 串的顺序存储结构c语言版,数据结构C语言版串的定长顺序存储表示和实现.doc

    . . #include #include #include #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define O ...

  6. 逆置单链表c语言程序,(数据结构C语言版)顺序表和单链表的逆置

    <(数据结构C语言版)顺序表和单链表的逆置>由会员分享,可在线阅读,更多相关<(数据结构C语言版)顺序表和单链表的逆置(7页珍藏版)>请在人人文库网上搜索. 1.实验1-1顺序 ...

  7. 【C语言】数据结构C语言版 实验4 栈与字符串

    /* 利用顺序栈结构,编写算法函数void Dto16(unsigned int m)实现十进制无符号整数m到十六进制数的转换功能. */ /***************************** ...

  8. 【C语言】数据结构C语言版 实验7 二叉树

    /* 编写算法函数void preorder1(bintree t)实现二叉树t的非递归前序遍历. */ #include "bintree.h" char *a="AB ...

  9. 【C语言】数据结构C语言版 实验6 树

    /* 编写算法函数void levelorder(tree t)实现树的层次遍历. */ #include "tree.h" void levelorder(tree t) /* ...

最新文章

  1. 限制内存用快排原理PHP
  2. java内存泄露分析方案
  3. Python数据结构与算法(第四天)
  4. 文本分类中的特征词选择算法系列科普(前言AND 一)
  5. TS对象中的实例属性和静态属性
  6. k近邻算法(KNN)-分类算法
  7. Stream Part.7
  8. 【Tensorflow】深度学习实战06——Tensorflow实现ResNet
  9. 符号实体(转义字符)
  10. c语言 overflow_一文读懂:C语言编程中“堆”和“栈”的七大区别
  11. python 修改dataframe列名的几种方法
  12. Android框架揭秘-JAVA服务框架
  13. Python基础--步长
  14. BusinessSkinForm VCL
  15. 2015 ACOUG 年终总结感恩会圆满落幕
  16. python怎么把照片转成卡通_如何把照片变成手绘动漫化?
  17. linux mount error(79): Can not access a needed shared library
  18. 快手极速版源码 - autojs 自阅
  19. HTML文字左侧留白,DIV CSS padding内补白(内边距)left right top bottom
  20. 威尔逊定理公式的理解

热门文章

  1. php多表递归查询,使用公用表表达式的递归查询
  2. react 子传参父_React 子组件向父组件传值的方法
  3. html超链接使用d,HTML图像的调用和超链接
  4. flutter不支持热更新_Flutter 在安卓上可以实现热更新了
  5. java kafka 分区_Java kafka如何实现自定义分区类和拦截器
  6. java后台解析json并保存到数据库_[Java教程]ajax 发送json 后台接收 遍历保存进数据库...
  7. Gensee Android SDK(一)组成结构
  8. python 网页自动化框架_python+selenium自动化框架
  9. java 微信 回复_微信java 开发2 发送文本消息并回复
  10. ec200s 方案 移远_移远 4G Cat 1 无线通信模块EC200S