串(string,又称字符串)是一种有特殊的线性表,每个元素结点仅由一个字符组成。
串的常见存储结构有顺序存储结构和链式存储结构。
顺序存储结构按存储方式又分为:
静态存储分配(定长顺序存储)
动态存储分配(堆分配存储)
1 串的定长顺序存储
用一组地址连续的存储单元来存储串中的字符序列。
具体类型定义如下:
#define MAXSIZE 100
typedef struct{
char str[MAXSIZE];
int len;
}seqString;
基本操作:
//创建字符串
seqString *createStr(seqString *s){
gets(s->str);
s->len = lenStr(s);
return s;
}
//求字符串长度
int lenStr(seqString *s){
int i=0;
while(s->str[i]!='\0')
i++;
return i;
}
//字符串连接
void catStr(seqString *r1,seqString *r2){
if(r1->len+r2->len > MAXSIZE){
printf("两个字符串相加太长,溢出!");
}else{
for(i=0;i<r2->len;i++)
r1->str[r1->len+i] = r2->str[i];
r1->len=r1->len+r2->len;//修改连接后新串的长度
}
}
//求子串
seqString *subStr(seqString *r,int i,int j){
seqString *r1;
int k;
if(i+j-1>r->len){
printf("子串越界");
return;
}else{
for(k=0;k<j;k++){
r1->str[k] = r->str[i+j-1];//从r中取出子串
r1->len = j;
r1->str[r1->len] = '\0';
}
return r1;
}
//串相等的比较,在2个串长度不相等的情况下比较串的长度,相等的情况下比较第一个不相同的字符的大小
int equalStr(seqString *r1,seqString *r2){
int i;
for(i=0;i<r1->len && i<r2->len;i++)
if(r1->str[i]!=r2->str[i])
return (r1->str[i]-r2->str[i]);
return (r1->len - r2->len);
}
//插入子串
seqString *insertStr(seqString *s,seqString *s1,int i){
if(i>s->len || s->len + s1->len > MAXSIZE){
printf("溢出");
}else{
int k = s1->len-1;
//腾出位置
while(k >= i){
s->str[k+s1->len] = s->str[k];
k--;
}
for(k=i;k<i+s1->len;k++){
s->str[k] = s1->str[k-i];
}
//改变字符串s的长度
s->len = s->len + s1->len;
//修改最后一位
s->str[s->len] = '\0';
}
}
//删除子串,从第i位开始,删除j个字符
void delStr(seqString *r,int i,int j){
int k = 0;
if(i+j-1 > r->len)
printf("子串越界");
else{
while(k<j){
r->str[i+k] = s->str[i+k+j];
k++;
}
r->len = r->len - j;
r->str[r->len] = '\0';//字符串最后以'\0'结束
}
}
2 串的堆分配存储
优点:可以根据具体情况,灵活地申请适当数目的存储空间,从而提高存储资源利用率。
类型定义如下:
typedef struct{
char *str;
int len;
}HString;
基本操作:
(1) 串的赋值
//赋值,将字符串常量r的值赋给堆串s
int createHstr(HString *s,char *r){
int len,i=0;
if(s->str!=NULL) free(s->str);//若s已经存在,将它占据的空间释放掉
while(r[i]!='\0') i++;
if(i!=0){//分配空间
s->str = (char *)malloc(i);
if(s->str == NULL){
printf("空间分配失败");
return(0);
}
for(i=0;i<len;i++)
s->str[i] = r[i];
}else{
s->str = NULL;
}
s->len = i;
return(1);
}
(2) 判断串是否为空
int isStrEmpty(HString *s){
return s->len == 0 ? 0:1;
}
分享到:
相关推荐
数据结构之串和数组(实验)
提供三个数据结构,串,队列,栈,队列有循环队列和链队列。rar格式解压即可用
很好用的串和数组的学习资料, 经过整理和测试运行... 里面讲解丰富
串的更复杂的操作,和文件的第一次打交道,第一个win32程序。
C语言数据结构之串插入操作 实例代码: /* 串的堆分配存储表示 */ #include #include #include #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define OVERFLOW -2 typedef int Status; typedef ...
这个文件包含了数据结构中串的一些基本操作 可为那些嫌麻烦的同学省去一些敲代码的时间
理解、掌握串的有关概念,串的存储形式及常见基本的实现。
数据结构 严蔚敏 串 string
实 验 报 告 "课程名称: "数据结构实践课 " "实验项目: "定长串存储方法 " "姓 名: " " "专 业: " " "班 级: " " "学 号: " " 计算机科学与技术学院 实验教学中心 2017 年 9 月 23 日 实验项目名称: 串的定长...
数据结构 顺序串 包含无回溯类型匹配(BMP)算法
主要介绍了javascript数据结构之串的概念与用法,简单讲述了串的概念、功能并结合实例形式分析了基于javascript实现串的遍历、比较、查找等相关操作技巧,需要的朋友可以参考下
数据结构之串的基本操作,使用C语言,完整代码,可以使用
C语言实现数据结构字符串部分
数据结构课设设计作业之一.实现基本的串基本操作。简单易懂。
c语言 数据结构 严蔚敏 计算机专业 字符串 算法
严蔚敏 数据结构 串 课件ppt C语言描述
数据结构 串 数据结构 串 数据结构 串 数据结构 串 数据结构 串
数据结构实验,了解和掌握串的逻辑结构,掌握串的基本算法及相关的应用。