23、数据结构笔记之二十三串的堆分配实现
2017-09-14 00:07
232 查看
23、数据结构笔记之二十三串的堆分配实现
“人的价值是由自己决定的。”
接下去是看下如何用C实现串。
typedefstruct {
charch[MAXLEN];
intlen;
}SString;
SString StrCopy(SString *s,SStringt){
inti;
for(i= 0;i <
t.len;i++)
s->ch[i]=
t.ch[i];
s->len=
t.len;
return *s;
}
void StrShow(constSStrings){
inti;
for(i= 0; i <
s.len; ++i)
printf("%c",s.ch[i]);
printf("\n");
}
void StrInsert(SString *s,intpos,SStringt){
inti;
if(pos< 0 )
pos = 0;
if(pos>
s->len - 1)
pos =s->len;
if(s->len+
t.len <=
MAXLEN){
// 长度适中
for(i=
s->len +
t.len- 1;i >
pos;i--)
s->ch[i]=
s->ch[i -
t.len];
for(i= 0;i <
t.len;i++)
s->ch[i+
pos] =
t.ch[i];
s->len+=
t.len;
}
elseif(pos
+t.len>
MAXLEN) {
// 长度超限1,从pos后不再有s的内容
for(i=
pos;i <
MAXLEN;++i)
s->ch[i]=
t.ch[i -
pos];
s->len=
MAXLEN;
}
else {//长度超限2,从pos+
t.len后还有s的部分内容
for(i= MAXLEN - 1; i >=
pos +
t.len;--i)
s->ch[i]=
s->ch[i -
t.len];
for(i= 0; i <
t.len; ++i)
s->ch[i+
pos] =
t.ch[i];
s->len=
MAXLEN;
}
}
SStringstra = {"abcdefghijklmnopqrstuvwxyz",26};
SStringstrb = {"01234567890123456789",20},strc;
StrCopy(&strc,stra);
printf("串a:\n");
StrShow(stra);
printf("串b:\n");
StrShow(strb);
StrInsert(&stra,22,strb);
//
printf("串a:\n");
StrShow(stra);
printf("串c:\n");
StrShow(strc);
return0;
}
结果如下图1所示:
#defineMAXLEN40
typedefstruct {
charch[MAXLEN];
intlen;
}SString;
void StrInsert(SString *s,intpos,SStringt){
inti;
if(pos< 0 )
pos = 0;
if(pos>
s->len - 1)
pos =s->len;
if(s->len+
t.len <=
MAXLEN){
// 长度适中
for(i=
s->len +
t.len- 1;i >
pos;i--)
s->ch[i]=
s->ch[i -
t.len];
for(i= 0;i <
t.len;i++)
s->ch[i+
pos] =
t.ch[i];
s->len+=
t.len;
}
elseif(pos
+t.len>
MAXLEN) {
// 长度超限1,从pos后不再有s的内容
for(i=
pos;i <
MAXLEN;++i)
s->ch[i]=
t.ch[i -
pos];
s->len=
MAXLEN;
}
else {//长度超限2,从pos+
t.len后还有s的部分内容
for(i= MAXLEN - 1; i >=
pos +
t.len;--i)
s->ch[i]=
s->ch[i -
t.len];
for(i= 0; i <
t.len; ++i)
s->ch[i+
pos] =
t.ch[i];
s->len=
MAXLEN;
}
}
SString StrCopy(SString *s,SStringt){
inti;
for(i= 0;i <
t.len;i++)
s->ch[i]=
t.ch[i];
s->len=
t.len;
return *s;
}
void StrShow(constSStrings){
inti;
for(i= 0; i <
s.len; ++i)
printf("%c",s.ch[i]);
printf("\n");
}
int main() {
SStringstra = {"abcdefghijklmnopqrstuvwxyz",26};
SStringstrb = {"01234567890123456789",20},strc;
StrCopy(&strc,stra);
printf("串a:\n");
StrShow(stra);
printf("串b:\n");
StrShow(strb);
StrInsert(&stra,22,strb);
//
printf("串a:\n");
StrShow(stra);
printf("串c:\n");
StrShow(strc);
return0;
}
“人的价值是由自己决定的。”
接下去是看下如何用C实现串。
1. 定义
定义结构体如下,一种字符数组,一个表示数组的长度。以一组地址连续的存储单元存放串值字符序列,但是他们的存储空间是在程序执行过程中动态分配而得。typedefstruct {
charch[MAXLEN];
intlen;
}SString;
2. 复制
将一个串内容复制到另一个结构体中区。SString StrCopy(SString *s,SStringt){
inti;
for(i= 0;i <
t.len;i++)
s->ch[i]=
t.ch[i];
s->len=
t.len;
return *s;
}
3. 字符串显示
代码简单明了void StrShow(constSStrings){
inti;
for(i= 0; i <
s.len; ++i)
printf("%c",s.ch[i]);
printf("\n");
}
4. 字符串插入
在第一个字符串中的指定位置插入字符串。主要是要主要插入字符串的位置,及插入后是否超过了字符串最多支持的上限。void StrInsert(SString *s,intpos,SStringt){
inti;
if(pos< 0 )
pos = 0;
if(pos>
s->len - 1)
pos =s->len;
if(s->len+
t.len <=
MAXLEN){
// 长度适中
for(i=
s->len +
t.len- 1;i >
pos;i--)
s->ch[i]=
s->ch[i -
t.len];
for(i= 0;i <
t.len;i++)
s->ch[i+
pos] =
t.ch[i];
s->len+=
t.len;
}
elseif(pos
+t.len>
MAXLEN) {
// 长度超限1,从pos后不再有s的内容
for(i=
pos;i <
MAXLEN;++i)
s->ch[i]=
t.ch[i -
pos];
s->len=
MAXLEN;
}
else {//长度超限2,从pos+
t.len后还有s的部分内容
for(i= MAXLEN - 1; i >=
pos +
t.len;--i)
s->ch[i]=
s->ch[i -
t.len];
for(i= 0; i <
t.len; ++i)
s->ch[i+
pos] =
t.ch[i];
s->len=
MAXLEN;
}
}
5. MAIN函数
int main() {SStringstra = {"abcdefghijklmnopqrstuvwxyz",26};
SStringstrb = {"01234567890123456789",20},strc;
StrCopy(&strc,stra);
printf("串a:\n");
StrShow(stra);
printf("串b:\n");
StrShow(strb);
StrInsert(&stra,22,strb);
//
printf("串a:\n");
StrShow(stra);
printf("串c:\n");
StrShow(strc);
return0;
}
结果如下图1所示:
6. 源码
#include<stdio.h>#defineMAXLEN40
typedefstruct {
charch[MAXLEN];
intlen;
}SString;
void StrInsert(SString *s,intpos,SStringt){
inti;
if(pos< 0 )
pos = 0;
if(pos>
s->len - 1)
pos =s->len;
if(s->len+
t.len <=
MAXLEN){
// 长度适中
for(i=
s->len +
t.len- 1;i >
pos;i--)
s->ch[i]=
s->ch[i -
t.len];
for(i= 0;i <
t.len;i++)
s->ch[i+
pos] =
t.ch[i];
s->len+=
t.len;
}
elseif(pos
+t.len>
MAXLEN) {
// 长度超限1,从pos后不再有s的内容
for(i=
pos;i <
MAXLEN;++i)
s->ch[i]=
t.ch[i -
pos];
s->len=
MAXLEN;
}
else {//长度超限2,从pos+
t.len后还有s的部分内容
for(i= MAXLEN - 1; i >=
pos +
t.len;--i)
s->ch[i]=
s->ch[i -
t.len];
for(i= 0; i <
t.len; ++i)
s->ch[i+
pos] =
t.ch[i];
s->len=
MAXLEN;
}
}
SString StrCopy(SString *s,SStringt){
inti;
for(i= 0;i <
t.len;i++)
s->ch[i]=
t.ch[i];
s->len=
t.len;
return *s;
}
void StrShow(constSStrings){
inti;
for(i= 0; i <
s.len; ++i)
printf("%c",s.ch[i]);
printf("\n");
}
int main() {
SStringstra = {"abcdefghijklmnopqrstuvwxyz",26};
SStringstrb = {"01234567890123456789",20},strc;
StrCopy(&strc,stra);
printf("串a:\n");
StrShow(stra);
printf("串b:\n");
StrShow(strb);
StrInsert(&stra,22,strb);
//
printf("串a:\n");
StrShow(stra);
printf("串c:\n");
StrShow(strc);
return0;
}
相关文章推荐
- 数据结构笔记及Java实现 (排序)
- 数据结构与算法学习笔记——链表部分实现(数组形式)
- 8、数据结构笔记之八栈的应用之括号匹配检验实现
- 9、数据结构笔记之九栈的应用之行编辑实现
- 10、数据结构笔记之十栈的应用之迷宫求解实现
- 数据结构与算法学习笔记——动态规划的入门与编程实现
- 数据结构与算法笔记 —— 排序算法及代码实现
- 32. 数据结构笔记之三十二广义表实现一
- 数据结构笔记(一)线性表的顺序表示和基本操作及其顺序表实现的集合运算(A-B)U(B-A)实例
- 12、数据结构笔记之十二栈的应用之栈与递归之阶乘实现
- 数据结构基础(1)--数组C语言实现--动态内存分配(跟风追逐,加强突击)
- 33. 数据结构笔记之三十三广义表实现二
- 38. 数据结构笔记之三十八图的邻接矩阵存储实现
- 11、数据结构笔记之十一栈的应用之表达式求值实现
- 【数据结构与算法学习笔记】PART2 向量(接口与实现,可扩充向量,无序向量,有序向量)
- 19、数据结构笔记之十九链表实现等价类寻找
- 数据结构与算法笔记 —— 查找算法及代码实现
- 21、数据结构笔记之十九列队实现离散事件模拟
- 3、数据结构笔记之三线性表单项链表实现
- 数据结构 学习笔记之:静态链表--史上最简单的C语言实现——只为掌握概念——不清楚静态链表的鸟鸟们有福了!