搜索文档
c
/* 串的顺序存储 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct HStr {
char * ch; // 字符的存储单元
int length; // 串的长度
} HStr,*PHStr;
typedef enum Status {
ok = 1,
Error = 0,
} Status;
/*
* 初始化
* 步骤:
* 令串的存储单元为空
* 令串的长度等于 0
*/
void InitStr(PHStr str)
{
str->ch = NULL;
str->length = 0;
}
/*
* 赋值
* 步骤:
* 首先获取要插入的字符串长度
* 为串存储单元申请空间
* 遍历字符串,将每个字符插入线性表中
* 修改线性表长度
*/
Status AssigStr(PHStr str,char * chars)
{
int len = strlen(chars);
int i = 0;
if(!len) return Error;
InitStr(str);
str->ch = (char *) malloc(sizeof(char) * len);
if(!str->ch)
{
printf("空间申请失败!\n");
return Error;
}
while (i < len)
{
str->ch[i] = chars[i];
i++;
}
str->length = len;
return ok;
}
/*
* 打印字符串
*/
void PrintStr(PHStr str)
{
int i = 0;
if(!str->length)
{
printf("空串!\n");
return;
}
printf("\n打印字符串:");
while (i < str->length)
{
if(i == str->length - 1) printf("%c\n",str->ch[i]);
else printf("%c、",str->ch[i]);
i++;
}
}
/*
* 拷贝字符串
*/
Status CopyStr(PHStr str, PHStr cs)
{
int len = str->length;
int i = 0;
if(!len) return Error;
InitStr(cs);
cs->ch = (char *) malloc(sizeof(char) * len);
if(!cs->ch)
{
printf("空间申请失败!\n");
return Error;
}
while (i < len)
{
cs->ch[i] = str->ch[i];
i++;
}
cs->length = len;
return ok;
}
/*
* 串连接
*/
Status ConcatStr(PHStr str,char * ist)
{
int strLen = str->length;
int istLen = strlen(ist);
int i = strLen;
str->ch = (char *) realloc(str->ch,sizeof(char) * istLen);
while (i < strLen + istLen)
{
str->ch[i] = ist[i - strLen];
i++;
}
str->length += istLen;
return ok;
}
/*
* 串比较
*/
void CompStr(PHStr str,char * chars)
{
int i = 0;
printf("\n");
while (i < str->length && i < strlen(chars))
{
if(str->ch[i] != chars[i])
{
if(str->ch[i] - chars[i] > 0)
{
printf("str > chars");
}
else
{
printf("str < chars");
}
printf("\n");
return;
}
i++;
}
int comp = str->length - strlen(chars);
if(comp > 0) printf("str > chars");
else if(comp < 0) printf("str < chars");
else printf("str = chars");
}
/*
* 插入子串
*/
Status InsertStr(PHStr str,int index,char * chars)
{
if(index < 0 || index > str->length)
{
printf("参数错误!\n");
return Error;
}
int len = strlen(chars);
int i = index + len;
int j = index;
str->ch = (char *) realloc(str->ch,sizeof(char) * len);
while (i < str->length + len)
{
str->ch[i] = str->ch[i - len];
i++;
}
while (j < index + len)
{
str->ch[j] = chars[j - index];
j++;
}
str->length += len;
return ok;
}
/*
* 找子串首次出现的位置
*/
int GetIndex(PHStr str,char * chars)
{
int i = 0;
int j = 0;
int index = -1;
int sLen = str->length;
int cLen = strlen(chars);
while (i < sLen && j < cLen)
{
if(str->ch[i] != chars[j])
{
i++;
continue;
}
i++;
j++;
}
if(j == cLen) index = i - cLen;
return index;
}
/*
* 查找子串
*/
void Lookup(PHStr str,char * chars)
{
int index = GetIndex(str,chars);
if(index == -1)
{
printf("\n不是子串\n");
}
else
{
printf("\n子串的位置是:%d\n",index);
}
}
/*
* 删除子串
*/
Status DelStr(PHStr str,int index,int len)
{
int sLen = str->length;
int i = index;
if(index < 0 || index > sLen - len)
{
printf("参数错误!\n");
return Error;
}
while (i < index + len)
{
str->ch[i] = str->ch[i + len];
i++;
}
str->length -= len;
return ok;
}
int main() {
int retVal;
HStr str0;
HStr str1;
AssigStr(&str0,"chinese");
PrintStr(&str0);
CopyStr(&str0,&str1);
PrintStr(&str1);
ConcatStr(&str0,"good");
PrintStr(&str0);
CompStr(&str0,"chinesegood");
CompStr(&str0,"chinese");
CompStr(&str0,"chinesf");
InsertStr(&str1,3,"abc");
PrintStr(&str1);
Lookup(&str0,"abc");
Lookup(&str0,"ese");
DelStr(&str1,3,3);
PrintStr(&str1);
return 0;
}