数据结构-串(C语言)
串是由0个或多个字符组成的有序序列。
基本概念
串的长度:串中字符的数目。
空串:零个字符的串,即长度为0。
子串:串中任意连续的字符组成的子序列称为该串的子串。
主串:包含子串的串。
串相等:当且仅当两个串长度相等,并且各个位置的对应字符都相等。
空格串:由一个或多个空格字符组成的串。
串的三种表示方法:定长顺序存储,堆分配存储,块链存储表示。
本文采用堆分配存储的表示方式。
串的基本操作:
定义
typedef struct
{
char* c;
int length;
}HString;
初始化
int Assign(HString& s,char* cs)
{
char* c=cs;
int length=0;
while(*c){
length++;
c++;
}
if(length==0){
s.length=0;
s.c=NULL;
}else{
s.length=length;
s.c=(char*)malloc(sizeof(char)*length);
for(int i=0;i<length;i++){
*(s.c+i)=*(cs+i);
}
}
}
先求的原始的字符串的串长,如果长度为0则串长度为0,否则依次赋值。
串比较
int compare_HString(HString s1,HString s2)
{
for(int i=0;i<s1.length&&i<s2.length;i++){
if(*(s1.c+i)!=*(s2.c+i)) return *(s1.c+i)-*(s2.c+i);
}
return s1.length-s2.length;
}
比较s1和s2的值。
在不达到二者长度最大值时,依次顺序比较两个串对应位置的元素,如果不等则返回二个字符ASCII码相差数值。若在长度范围内都相等,则比较串长,返回串长相差值。
截取子串
int subHString(HString& t,HString s,int index,int length)
{
if(length+index>s.length||s.length<0||index<0) return 0;
if(length==0){
t.length=0;
t.c=NULL;
}else{
t.length=length;
t.c=(char*)malloc(sizeof(char)*length);
for(int i=0;i<length;i++){
*(t.c+i)=*(s.c+i+index);
}
}
return 1;
}
t为要截取的子串,s为被截取的主串,index为截取的起始位置,length为截取的长度。
1.判断截取子串的位置和长度是否符合被截取字符串。
2.若要截取字符串长度为0则直接赋值长度为0。
3.否则,分配相应空间后一次赋值。
串定位
int indexHString(HString t,HString s,int index)
{
int i,j;
if(index+t.length>s.length||index<0) return -1;
for(i=0,j=index;i<t.length&&j<s.length;){
if(*(s.c+j)!=*(t.c+i)){
i=0;
j=j-i+1;
}else{
i++;
j++;
}
}
if(i==0) return -1;
return j-i;
}
从位置index开始,找到 t在s中的位置并返回,如果t存在与从index开始的s中则返回位置下标,否则返回-1。
源程序
#include<stdio.h>
#include<stdlib.h>
typedef struct
{
char* c;
int length;
}HString;
int Assign(HString& s,char* cs)
{
char* c=cs;
int length=0;
while(*c){
length++;
c++;
}
if(length==0){
s.length=0;
s.c=NULL;
}else{
s.length=length;
s.c=(char*)malloc(sizeof(char)*length);
for(int i=0;i<length;i++){
*(s.c+i)=*(cs+i);
}
}
}
//求串长
int length(HString s)
{
return s.length;
}
int compare_HString(HString s1,HString s2)
{
for(int i=0;i<s1.length&&i<s2.length;i++){
if(*(s1.c+i)!=*(s2.c+i)) return *(s1.c+i)-*(s2.c+i);
}
return s1.length-s2.length;
}
int subHString(HString& t,HString s,int index,int length)
{
if(length+index>s.length||s.length<0||index<0) return 0;
if(length==0){
t.length=0;
t.c=NULL;
}else{
t.length=length;
t.c=(char*)malloc(sizeof(char)*length);
for(int i=0;i<length;i++){
*(t.c+i)=*(s.c+i+index);
}
}
return 1;
}
int indexHString(HString t,HString s,int index)
{
int i,j;
if(index+t.length>s.length||index<0) return -1;
for(i=0,j=index;i<t.length&&j<s.length;){
if(*(s.c+j)!=*(t.c+i)){
i=0;
j=j-i+1;
}else{
i++;
j++;
}
}
if(i==0) return -1;
return j-i;
}
//遍历串
void print(HString s)
{
for(int i=0;i<s.length;i++)
printf("%c",*(s.c+i));
printf("\n");
}
int main()
{
//定义4个字符串
HString s1,s2,s3,t;
char* cs1="1234";
char* cs2="2456";
char* cs3="asdfghjkg";
//分别初始化s1,s2,s3
Assign(s1,cs1);
Assign(s2,cs2);
Assign(s3,cs3);
//遍历并打印s1,s2,s3
print(s1);
print(s2);
print(s3);
//求s1串长
printf("%d\n",length(s1));
//比较s1和s2的值
printf("%d\n",compare_HString(s1,s2));
//截取字符串
subHString(t,s3,3,3);
print(t);
//串定位
printf("%d\n",indexHString(t,s3,1));
printf("%d\n",indexHString(t,s3,5));
return 0;
}