[简述]数据结构-字符串(C语言实现)
second60 20180422
1. 串的定义
串,即字符串,是由零个或多个字符组成的有限序列。
空串:没有字符。
串长:字符的个数。
2. 串的抽象数类型定义
ADT String
{
数据对象:
D={ai | i<=i <= n,n>=0,ai char类型}
数据关系:
R={<ai, ai+1> | ai,ai+1为D}
基本运算:
StrAssign(&s, cstr): 赋值
StrCopy(&s, t): 复制
StrEqual(s,t): 比较
StrLength(s): 串长
Concat(s, t): 串连接
SubStr(s,i,j): 求子串
InsStr(s1,i,s2): 插入
DelStr(s,i,j): 删除
RepStr(s,i,j,t): 替换
DispStr(s): 打印
}ADT String
3. 串的顺序储存结构
typedef struct
{
char data[MAXSIZE];
int len;
}SqString;
算法代码如下,C语言实现:
#include "stdio.h"
#define MAXSIZE 1024
typedef int ElemType;
typedef struct
{
char data[MAXSIZE];
int len;
}SqString;
void StrAssign(SqString *s,char cstr[])
{
int i ;
if(!s) return ;
for(i = 0; cstr[i] != '\0'; i++)
{
if(i <= MAXSIZE-1)
{
s->data[i] = cstr[i];
}
else
{
break;
}
}
s->len = i;
}
void StrCopy(SqString *s,SqString *t)
{
int i;
if(!s || !t) return ;
for(i=0;i< t->len;i++)
{
s->data[i] = t->data[i];
}
s->len = t->len;
}
int StrEqual(SqString *s,SqString *t)
{
int result=1,i;
if(!s || !t) return 0;
if(s->len != t->len)
result = 0;
else
{
for(i=0; i< s->len; i++)
{
if(s->data[i] != t->data[i])
{
result = 0;
break;
}
}
}
return result;
}
int StrLength(SqString *s)
{
if(!s) return 0;
return s->len;
}
/*
这里没有判断字符串超过MAXSIZE情况
现实项目中必须判断
*/
SqString Concat(SqString *s,SqString *t)
{
SqString str ;
int i;
if(!s || !t) return str;
for(i=0; i < s->len;i++)
str.data[i] = s->data[i];
for(i=0; i < t->len;i++)
str.data[s->len +i] = t->data[i];
str.len = s->len + t->len;
return str;
}
SqString SubString(SqString *s,int i ,int j)
{
SqString str;
int k;
str.len = 0;
if( i<=0 || i> s->len || j<0 || i+j-1 >s->len)
return str;
for( k = i-1; k<i+j-1; k++)
str.data[k-i+1] = s->data[k];
str.len = j;
return str;
}
SqString InsStr(SqString *s1, int i, SqString *s2)
{
int j;
SqString str;
str.len = 0;
if( i<=0 || i>s1->len +1)
return str;
for(j=0; j<i-1; j++)
str.data[j] = s1->data[j];
for(j=0; j<s2->len; j++)
str.data[i+j-1] = s2->data[j];
for(j=i-1;j<s1->len; j++)
str.data[s2->len +j] = s1->data[j];
str.len = s1->len + s2->len;
return str;
}
SqString DelStr(SqString *s,int i,int j)
{
int k;
SqString str;
str.len = 0;
if(i<=0 || i>s->len || i+j > s->len +1)
return str;
for(k = 0; k<i-1; k++)
str.data[k] = s->data[k];
for(k=i+j-k; k< s->len; k++)
str.data[k-j] = s->data[k];
str.len = s->len -j;
return str;
}
SqString RepStr(SqString *s,int i,int j, SqString *t)
{
int k;
SqString str;
str.len = 0;
if( i<=0 || i> s->len || i+j-1 > s->len)
return str;
for(k=0; k<i-1;k++)
str.data[k] = s->data[k];
for(k=0; k< t->len; k++)
str.data[i+k-1] = t->data[k];
for(k=i+j-1; k<s->len; k++)
str.data[t->len +k -j] = s->data[k];
str.len = s->len - j + t->len;
return str;
}
void DispStr(SqString *s)
{
int i;
if(s->len >0)
{
for(i=0;i< s->len ; i++)
{
printf("%c", s->data[i]);
}
printf("\n");
}
}
4. 串的链式储存结构
链串与一般链表类似。主要区别在于,链串的一个结点,可以存储一个或多个字符。
以结点大小为1,数据类型定义
typedef struct snode
{
char data;
struct snode *next;
}LiString;
算法实现,C语言:
因为跟链表类型,这里就不在实现代码,原理也就是链表与链表间的操作,参考链表实现
后面有时间再补上代码
5. 串的运用
字符串,可以说是程序中,最重要的数据结构之一。因为无论什么语言,还是最后的底层逻辑,很多都会转到最后,为字符串的操作。
6. 总结
在学习C++时,很常用的,就是std::string,但不少人只知道字符串,但产不了解字符串的原理,本文的内容,讲的串,其实就是字符串的原理及在顺序和链表中的实现。学习后会对字符串有深刻的了解,而不仅仅停留在使用std:string中。
简单地说,字符串,其实就是一串char类型的数组,或链表。
(注:代码中可能有些少了判断空指针或少了某些条件,时间比较仓促,如果你拿代码去用,记得一定要补上那些条件,见谅)