数据结构(C语言版 严蔚敏著)——串
2018-03-26 20:28
204 查看
关于串,下面只介绍堆分配存储的串。
· 由于堆分配存储结构的串既有顺序存储结构的特点,处理方便,操作中对串长
又没有任何限制,更显灵活,因此在串处理的应用程序中也常被选用。
更char数组类似
下面直接贴代码:#include <stdio.h>
#include <stdlib.h>
typedef struct {
char *ch;
int length;
} HString;
int StrInsert(HString &S, int pos, HString T) {
//在串S的第pos个字符之前插入串T
if (pos < 1 || pos > S.length + 1)
return 0;
if (T.length) {
//分配空间
if (!(S.ch = (char *) realloc((S.ch), (S.length + T.length) * sizeof(char))))
exit(0);
// 为插入T,把pos后面的往后挪,腾出空间
for (int i = S.length - 1; i < pos - 1; --i)
S.ch[i + T.length] = S.ch[i];
//插入
for (int j = 0; j < T.length; ++j)
S.ch[pos - 1 + j] = T.ch[j];
S.length += T.length;
}
return 1;
}
int StrAssign(HString &T, char *chars) {
//生成一个其值等于串常量chars的串T
int i;
//释放原有空间
if (T.ch)
free(T.ch);
for (i = 0; chars[i]; ++i);//统计chars长度
//空串
if (!i) {
T.ch = NULL;
T.length = 0;
} else {
//一一复制,相当于拷贝一份
if (!(T.ch = (char *) malloc(i * sizeof(char))))
exit(0);
T.length = i;
for (; i > 0; i--)
T.ch[i - 1] = chars[i - 1];
}
return 1;
}
int StrLength(HString S) {
//返回S的元素个数,称为串的长度
return S.length;
}
int StrCompare(HString S, HString T) {
//S>T,则返回值>0;若S=T,则返回值=0;
//若S<T,则返回值<0
for (int i = 0; i < S.length && i < T.length; ++i) {
if (S.ch[i] != T.ch[i])
//返回此时不同字符的ASC码的差
return S.ch[i] - T.ch[i];
}
return S.length - T.length;
}
int ClearString(HString &S) {
//将S清为空串
if (S.ch) {
free(S.ch);
S.ch = NULL;
}
S.length = 0;
return 1;
}
int 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(0);
//放入S1
for (int i = 0; i < S1.length; ++i) {
T.ch[i] = S1.ch[i];
}
//总长
T.length = S1.length + S2.length;
//放入S2
for (int j = S1.length; j < T.length; ++j) {
T.ch[j] = S2.ch[j - S1.length];
}
return 1;
}
int 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)
return 0;
//释放旧空间
if (Sub.ch)
free(Sub.ch);
//空子串
if (!len) {
Sub.ch = NULL;
Sub.length = 0;
} else {
//分配空间
Sub.ch = (char *) malloc(len * sizeof(char));
//复制子串
for (int i = 0; i < len; ++i) {
Sub.ch[i] = S.ch[pos - 1 + i];
}
Sub.length = len;
}
return 1;
}
· 由于堆分配存储结构的串既有顺序存储结构的特点,处理方便,操作中对串长
又没有任何限制,更显灵活,因此在串处理的应用程序中也常被选用。
更char数组类似
下面直接贴代码:#include <stdio.h>
#include <stdlib.h>
typedef struct {
char *ch;
int length;
} HString;
int StrInsert(HString &S, int pos, HString T) {
//在串S的第pos个字符之前插入串T
if (pos < 1 || pos > S.length + 1)
return 0;
if (T.length) {
//分配空间
if (!(S.ch = (char *) realloc((S.ch), (S.length + T.length) * sizeof(char))))
exit(0);
// 为插入T,把pos后面的往后挪,腾出空间
for (int i = S.length - 1; i < pos - 1; --i)
S.ch[i + T.length] = S.ch[i];
//插入
for (int j = 0; j < T.length; ++j)
S.ch[pos - 1 + j] = T.ch[j];
S.length += T.length;
}
return 1;
}
int StrAssign(HString &T, char *chars) {
//生成一个其值等于串常量chars的串T
int i;
//释放原有空间
if (T.ch)
free(T.ch);
for (i = 0; chars[i]; ++i);//统计chars长度
//空串
if (!i) {
T.ch = NULL;
T.length = 0;
} else {
//一一复制,相当于拷贝一份
if (!(T.ch = (char *) malloc(i * sizeof(char))))
exit(0);
T.length = i;
for (; i > 0; i--)
T.ch[i - 1] = chars[i - 1];
}
return 1;
}
int StrLength(HString S) {
//返回S的元素个数,称为串的长度
return S.length;
}
int StrCompare(HString S, HString T) {
//S>T,则返回值>0;若S=T,则返回值=0;
//若S<T,则返回值<0
for (int i = 0; i < S.length && i < T.length; ++i) {
if (S.ch[i] != T.ch[i])
//返回此时不同字符的ASC码的差
return S.ch[i] - T.ch[i];
}
return S.length - T.length;
}
int ClearString(HString &S) {
//将S清为空串
if (S.ch) {
free(S.ch);
S.ch = NULL;
}
S.length = 0;
return 1;
}
int 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(0);
//放入S1
for (int i = 0; i < S1.length; ++i) {
T.ch[i] = S1.ch[i];
}
//总长
T.length = S1.length + S2.length;
//放入S2
for (int j = S1.length; j < T.length; ++j) {
T.ch[j] = S2.ch[j - S1.length];
}
return 1;
}
int 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)
return 0;
//释放旧空间
if (Sub.ch)
free(Sub.ch);
//空子串
if (!len) {
Sub.ch = NULL;
Sub.length = 0;
} else {
//分配空间
Sub.ch = (char *) malloc(len * sizeof(char));
//复制子串
for (int i = 0; i < len; ++i) {
Sub.ch[i] = S.ch[pos - 1 + i];
}
Sub.length = len;
}
return 1;
}
相关文章推荐
- 数据结构(第二版,C语言版)严蔚敏编著 第一章绪论中的错误
- 数据结构(C语言版 严蔚敏著)——栈和队列
- 数据结构(C语言版 第2版)课后习题答案 严蔚敏 编著
- 数据结构(C语言版 严蔚敏著)——数组和广义表
- 数据结构与算法(C语言版)__链表的迭代器
- 迷宫求解 《数据结构——严蔚敏》
- 数据结构与算法(C语言版)__选择排序
- 数据结构与算法(C语言版)__双向链表
- 【数据结构】顺序存储结构线性表C语言版
- 数据结构(严蔚敏)C语言实现---线性表的顺序存储
- 数据结构与算法(C语言版)__红黑树06
- 数据结构之顺序串(整理严蔚敏数据结构)
- 顺序表的合并(无序合并且相同数据不在插入) 严蔚敏(c语言版)
- 数据结构课程设计四则运算表达式求值(C语言版)
- 数据结构(严蔚敏版)学习要点总结(一)
- 数据结构实验(严蔚敏版)2.9迷宫问题
- 数据结构(严蔚敏)之六——链式队列c语言实现
- 数据结构之实用单链表(参考整理严蔚敏数据结构)
- 经典数据结构视频教程下载 (清华大学 严蔚敏)
- 数据结构之队列(C语言版)