《数据结构》 定长顺序串常用操作代码集合
2016-04-06 20:49
711 查看
代码来自老师上课使用的ppt或者课本
/*定长顺序串*/ #define MAXLEN 40 typedef struct { char ch[MAXLEN]; int len; } SString /*插入函数*/ /*在串S中下标为pos的字符之前插入串t*/ int StrInsert(SString *S, int pos, SString t) { int i; if(pos < 0 || pos > S->len) return ERROR; if(S->len + t.len <= MAXLEN) { //插入后串长小于MAXLEN,正常插入 for (i = S->len - 1; i >= pos; i--) { S->ch[i + t.len] = S->ch[i]; } //从后向前后移元素,从下标S->len-1到pos结束,为t腾出位置 for (i = 0; i < t.len; i++) { S->ch[pos + i] = t.ch[i]; //插入t } S->len = S->len + t.len; } else if(pos + t.len <= MAXLEN) { //插入后串长大于MAXLEN,S部分被舍弃 for(i = MAXLEN - t.len -1; i >= pos; i-- ) { S->ch[i + t.len] = S->ch[i]; } //从后向前右移元素,被舍去的元素不移动 for(i = 0; i < t; i++) { S->[pos + i] = t.ch[i]; } S->len = MAXLEN; } else { //插入后串长大于MAXLEN,S移动的元素全部被舍弃,t部分被舍弃 for(i = 0; i < MAXLEN - pos; i++) { S->ch[pos + i] = t.ch[i]; } S->len = MAXLEN; } return OK; } /*删除函数*/ /*在串S中删除从下标pos起len个字符*/ /*S->len-1表示最后一个下标,S->len-1-pos表示从最后一个下标到下标pos间的元素个数*/ int StrDelete(SString *S, int pos, int len) { int i; if(pos < 0 || len < 1 || pos > (S->len - len)) { return ERROR; //从pos起最多删除S->len-1-pos+1 个字符 } for(i = pos +len; i < len; i++) { S->ch[i - len] = ch[i]; } S->len = S->len - len; return OK; } /*串复制函数*/ /*将串t的值复制到串S中*/ void StrCopy(SString *S, SString t) { int i; for(i = 0; i < t.len; i++) { S->ch[i] = t.ch[i]; } S->len = t.len; } /*判空函数*/ int StrEmpty(SString S) { if (S.len == 0) return 1; else return 0; /*return!(s.len)*/ } /*串比较函数*/ /*比较规则与字符串的比较相同*/ int StrCompare(SString S, SString t) { int i; for(i = 0; i < S.len && i < t.len; i++) { if(S.ch[i] != t.ch[i]) { return(S.ch[i] - t.ch[i]); } } return(S.len - t.len); /*包含三种情况*/ } /*求串长函数*/ int StrLength(SString) { return(S.len); } /*清空函数*/ void StrClear(SString *S) { S->len = 0; } /*连接函数*/ /*将串连接在串S的后面,*/ int StrCat(SString *S, SString t) { int i,flag; if(S->len + t.len <= MAXLEN) { /*连接后串长小于MAXLEN,正常插入*/ for(i = S->len; i < S->len + t.len; i++) { S->ch[i] = t.ch[i - S->len]; } S->len += t.len; flag = 1; } else if(S->len < MAXLEN) { /*连接后串长大于MAXLEN,t部分被舍去*/ for (i = S->len; i < MAXLEN; i++) { S->ch[i] = t.ch[i - S->len]; } S->len = MAXLEN; } else { flag = 0; } return flag; //flag = 0表示非正常连接,t部分被舍弃或全部被舍弃 } /*求字串函数*/ /*将串S中下标pos起len个字符串复制到sub中*/ int SubString(SString *sub, SString S, int pos, int len) { int i; if(pos < 0 || pos >S.len - 1 || len <1 || len > S.len - pos) { sub->len = 0; return OK; } else { for(i = 0; i < len; i++) { sub->ch[i] = S.ch[pos + i]; } sub->len = len; return OK; } } /*定位函数即Brute-Force算法*/ /*求主串S的pos位置起,串t第一次出现的位置,成功返回位置序号,失败返回-1*/ int StrIndex(SString S, int pos, SString t) { int, i, start; if(t.len == 0) { //t为空串时,是任意串的匹配 return -1; } start = pos; i = start; j = 0; //主串从pos开始,t从头开始 while(i < S.len && j < t.len) { if(S.ch[i] = t.ch[j]) { i++; j++; } else { start++; /*当前对应字符不等时回溯*/ i = start; j = 0; /*回溯,主串起始位置+1,t从头开始*/ } if(j > t.len) { return start; /*匹配成功,返回匹配起始位置*/ } else return -1; /*匹配不成功,返回-1*/ }
相关文章推荐
- 数据结构:栈
- 数据结构(左偏树,可并堆):BNUOJ 3943 Safe Travel
- c语言数据结构(3)
- 数据结构学习(一)
- mmap函数和mprotect函数
- Python 数据结构与算法 —— Prim 算法与小顶堆
- Python 数据结构与算法 —— Kruskal 算法
- 数据结构与算法之leetcode刷题笔记
- 关于排序的总结和部分实现(个人理解整理版)
- 数据结构中的栈
- 《数据结构》交换双向循环链表的结点p和它的前驱结点
- Tricks(二十四)—— python 复合(嵌套)数据结构
- 数据结构系统调用机制
- 数据结构系统调用机制
- 数据结构系统调用机制
- 数据结构系统调用机制
- 数据结构系统调用机制
- 数据结构系统调用机制
- 数据结构系统调用机制
- 数据结构系统调用机制