数据结构中串的C语言
1.串的堆分配存储(实际就是动态数组方式)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<assert.h>
#define SIZE 20
#define true 1
#define false 0
typedef struct
{
char *ch;
int length;
}Str;
//初始化字符串
int InitString(Str *s)
{
s->ch=NULL;
s->length=0;
return 1;
}
//字符串赋值
int AssignString(Str *s,char *ch)
{
int i,len=strlen(ch);
//如果字符串不为空,就志为空
if(s->ch)
{
free(s->ch);
}
// 这里判断是否是空字符串
if(!len)
{
s->ch=NULL;
s->length=0;
return 0;
}
else
{
s->ch=(char*)malloc(sizeof(char)*len);
if(!s->ch)
{
printf("分配空间失败");
exit(-1);
}
for(i=0;i<len;i++)
{
s->ch[i]=ch[i];
}
s->length=len;
return 1;
}
}
//打印字符串
void printString(Str s)
{
int i;
for(i=0;i<s.length;i++)
{
printf("%c",s.ch[i]);
}
printf("\n");
}
//字符串的长度
int LengthString(Str s)
{
return s.length;
}
//判读字符串是否为空
int isEmptyString(Str s)
{
if(s.length==0)
{
printf("字符串为空");
return 1;
}
else
{
printf("字符串不为空");
return 0;
}
}
int ConcatString(Str *s, Str str1,Str str2)
{
int i;
if(s->ch)
free(s->ch);
s->ch=(char *)malloc(sizeof(char)*(str1.length+str2.length));
if(!s->ch)
{
printf("分配内存失败");
exit(-1);
}
for(i=0;i<str1.length;i++)
s->ch[i]=str1.ch[i];
for(i=0;i<str2.length;i++)
s->ch[str1.length+i]=str2.ch[i];
s->length=str1.length+str2.length;
return 1;
}
//删除字符串指定pos位置的len长的字符
void DeleteString(Str *s,int pos,int len)
{
int i;
if(pos>s->length)
{
printf("pos大于整体字符串的长度");
exit(-1);
}
else if(pos+len>s->length)
{
len=s->length-pos+1;//指定的长度超过了,所以直接删除pos到字符串最末尾的元素
}
for(i=pos;i<s->length;i++)
s->ch[i]=s->ch[i+len];
s->length-=len;
}
//BF算法,就是对某子串的定位,返回的k表示从k开始sub子串就和主串相匹配
int BFString(Str str,Str subStr)
{
int i=1,j=1,k=i;
while(i<str.length&&j<subStr.length)
{
if(str.ch[i]==subStr.ch[j])
{
++i;
++j;
}
else
{
j=1;
i=++k;//匹配失败,,i从主串下一个位置开始,k记录着上一次的位置
}
}
if(j>subStr.length)
return k;
else
return 0;
}
//求子串的方法,从字符串str规定的位置pos开始1取出len长度的字符串返回给sub,sub就是str的子串
void subString(Str *sub ,Str str,int pos, int len)
{
int i;
if(pos<1||len>str.length||len<0||len>str.length-pos+1)
{
printf("pos小于1||截取长度大于主串长度||截取长度小于0||截取长度大于主串从pos开始到结束的长度");
exit(-1);
}
if(sub->ch)
free(sub->ch);
//子串返回空字符串
if(len==0)
{
sub->ch=NULL;
sub->length=0;
}
else
{
sub->ch=(char*)malloc(sizeof(char)*len);
for(i=0;i<len;i++)
sub->ch[i]=str.ch[pos+i-1];
sub->length=len;
}
}
int main()
{
Str s,str1,str2,sub;
char a[20]="abcdefg";
char b[20]="_";
char c[20]="qaq";
InitString(&s);
InitString(&str1);
InitString(&str2);
InitString(&sub);
AssignString(&s,a);
AssignString(&str1,b);
AssignString(&str2,c);
printString(s);
printString(str1);
printString(str2);
ConcatString(&s,str1,str2);
printString(s);
DeleteString(&s,0,1);
printString(s);
subString(&sub,s,1,3);
printString(sub);
return 0;
}
2.串的定长顺序存储(就是字符串数组):这个方法比较简单所以和上面的逻辑其实都是相似的所以列举下结构体就是了哈哈
typedef struct Str
{
char elem[SIZE];//elem数组用来存放串的元素
int length;//定义一个串长度
}Str;