C语言实现串的顺序存储表示与基本操作

本文实例为大家分享了C语言实现串的顺序存储表示与基本操作代码,供大家参考,具体内容如下

1、串的三种存储表示

串,即:字符串。要注意的是,C语言中是没有字符串数据类型的,而将其作为一种数据结构——“内容受限的线性表”进行实现,并对空串、空格串、串的长度、子串与主串等概念进行了约定【详见 《数据结构(C语言版)》 ,严蔚敏、吴伟民编著】 。

串的存储表示主要分为三种:

【1】顺序存储表示 :使用字符型数组(一块连续的内存存储空间)来存储串的内容,其最大长度已经定义则不可修改;(这也是C语言中初始约定好的一种较为字符串内容的表示方式)

【2】堆分配存储表示:使用malloc和free函数对堆区进行操作,进行堆区内存的动态分配与释放,而这块存储空间就用于存储串的内容;

【3】块链存储表示:即采用链表的形式,通过指针,将位于不同存储空间的多个字符串“碎片”进行连接,“拼凑”成为一个完整的串

在此只介绍第一种,即:串的顺序存储表示。

2、串的顺序存储表示与基本操作

这部分就直接贴代码了

【因为这里是对数组元素的操作,就偷个懒,直接用了C语言string.h头文件中提供的一些库函数,对一些基本操作进行了简单实现。需要详细写代码的部分到串的堆分配实现时候再体现】

2.1 头文件声明

/**

* 串的顺序存储实现

*/

#include <string.h>

#define MAXLEN 255

//结构体定义-表示串结构体

typedef struct{

char ch[MAXLEN+1];//存储串内容的字符型数组[+1是为了存储结束标志'\0']

int length;//当前串的长度

}SString;

/**

* 将字符串T复制为chars

*/

int StrAssignS(SString* T,char* chars);

/**

* 获取字符串长度

*/

int StrLengthS(SString T);

/**

* 字符串的判空操作

*/

int StrIsEmptyS(SString T);

/**

* 串连接操作

*/

int StrConcatS(SString* T,char* s1,char* s2);

/**

* 截取子串

*/

int SubStringS(SString* T,SString src,int pos,int len);

/**

* 串清空

*/

int ClearStringS(SString* T);

/**

* 串比较

*/

int StrCompareS(SString T1,SString T2);

2.2 函数实现

#include "SString.h"

/**

* 将字符串T复制为chars

*/

int StrAssignS(SString* T,char* chars){

//清空原始内容

memset(T->ch,0,MAXLEN);

T->length=0;

//重新赋值为chars

strcpy(T->ch,chars);

T->length=(int)strlen(chars);

/*printf("len=%d\n",strlen(T->ch));*/

return 0;

}

/**

* 字符串的判空操作

*/

int StrIsEmptyS(SString T){

return T.length==0;

}

/**

* 获取字符串长度

*/

int StrLengthS(SString T){

return T.length;

}

/**

* 串连接操作

*/

int StrConcatS(SString* T,char* s1,char* s2){

//辅助变量

char *p;

//清空T中的内容

memset(T->ch,0,MAXLEN);

T->length=0;

//连接字符串

p=strcat(s1,s2);

//字符串连接到T中

strcpy(T->ch,p);

T->length=(int)strlen(p);

return 1;

}

/**

* 截取子串

*/

int SubStringS(SString* T,SString src,int pos,int len){

//清空T中的原始内容

memset(T->ch,0,MAXLEN);

T->length=0;

//获取子串

/**

char *strncpy(char *dest, const char *src, size_t n)

dest -- 指向用于存储复制内容的目标数组

src -- 要复制的字符串

n -- 要从源中复制的字符数

*/

strncpy(T->ch,src.ch+pos,len);

//重新设置串的长度

T->length=len;

return 1;

}

/**

* 串比较

*/

int StrCompareS(SString T1,SString T2){

/*

int strcmp(const char *str1, const char *str2)

如果返回值小于 0,则表示 str1 小于 str2

如果返回值大于 0,则表示 str1 大于 str2

如果返回值等于 0,则表示 str1 等于 str2

*/

return strcmp(T1.ch,T2.ch);

}

/**

* 串清空

*/

int ClearStringS(SString* T){

memset(T->ch,0,MAXLEN);

T->length=0;

return 1;

}

2.3 函数测试

#include <stdio.h>

#include <stdlib.h>

#include "SString.h"

int main(int argc,char **argv){

SString str1,str2;

//str1.ch="Hello,World!";

StrAssignS(&str1,"Hello,World");

StrAssignS(&str2,"Hello");

printf("len=%d\n",StrLengthS(str1));

//字符串连接

StrConcatS(&str1,"SHello","Hi");

printf("len=%d\n",StrLengthS(str1));

//打印字符串内容

printf("str1=%s\n",str1.ch);

printf("str2=%s\n",str2.ch);

printf("CompareRes=%d\n",StrCompareS(str1,str2));

//截取子串

SubStringS(&str2,str1,2,3);

puts(str1.ch);

puts(str2.ch);

//清空字符串内容

ClearStringS(&str1);

printf("str1's len=%d,str2's len=%d,\nso str1 isEmpty:%d,str2 isEmpty:%d\n",StrLengthS(str1),StrLengthS(str2),StrIsEmptyS(str1),StrIsEmptyS(str2));

return 0;

}

贴上测试结果的截图:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

以上是 C语言实现串的顺序存储表示与基本操作 的全部内容, 来源链接: utcz.com/p/247216.html

回到顶部