1. 串的概念
字符串操作可谓是常见中的常见,usual中的usually,不好意思先秀一把英文。
串可以通过一组连续地址存储,即为串的顺序存储。
也可以通过链表存储,即为串的链式存储。
2. 顺序存储代码实现
使用C语言数组实现字符串的操作,还是便于兄弟们理解字符串在内存中的组织与操作的。代码如下,精华都在注释中
#include <stdio.h> #define MAX_LENGTH 100 /* * 主题:使用数组实现字符串操作实例 * 作者:熊猫大大 * 时间:2020-01-15 */ //字符串结构体 typedef struct{ char content[MAX_LENGTH];//内容部分,最后一位存储'\0',所以实际字符串内容长度是MAX_LENGTH-1 int length;//实际长度 }String; //打印字符串 void printStr(String *str) { printf("str:%s\n",str->content); } //请空字符串 void clearStr(String *str) { str->content[0] = '\0'; str->length = 0; } //返回字符串长度 int getStrLength(String *str) { return str->length; } //判断字符串是否为空 是1 否0 int isEmpty(String *str) { if (str->length == 0) { return 1; } else { return 0; } } //添加字符 int appendChar(String *str,char c) { if (str->length < MAX_LENGTH - 1) { str->content[str->length] = c; str->length++; str->content[str->length] = '\0'; return 1; } else //长度不足,返回失败0 { return 0; } } //插入字符,index从0开始,注意需要将后面的字符全部向后挪一个位置 int insertChar(String *str,int index,char c) { int i; if (str->length < MAX_LENGTH - 1) { for (i = str->length; i >= index; i--) //从最后一个'\0'开始都向后移动一个位置 { str->content[i+1] = str->content[i]; } str->content[index] = c;//将插入元素放入指定位置 return 1; } else //长度不足,返回失败0 { return 0; } } //删除指定位置元素,index从0开始,直接从后面往前覆盖即可 int deleteChar(String *str,int index) { int i; for (i = index; i <= str->length; i++) { str->content[i ] = str->content[i+1]; } return 1; } //将str2连接到str1 int concat(String *str1,String *str2) { int i = 0; int leftLength = MAX_LENGTH - 1 - str1->length;//剩余可用长度 if (leftLength < str2->length) {//长度不足返回失败 return 0; } //依次取出str2中元素追加到str1 for (i = 0; i < str2->length; i++) { appendChar(str1,str2->content[i]); } return 1; } int main() { //str1测试 String str1; clearStr(&str1); printf("str1清空后:\n"); printStr(&str1); printf("str1是否为空?\n"); printf("%d\n", isEmpty(&str1)); printf("str1当前长度:\n"); printf("%d\n", getStrLength(&str1)); appendChar(&str1, 'a'); appendChar(&str1, 'b'); appendChar(&str1, 'c'); printf("str1添加abc后:\n"); printStr(&str1); insertChar(&str1, 0, 'x'); printf("str1插入x后:\n"); printStr(&str1); deleteChar(&str1,1); printf("str1删除a后:\n"); printStr(&str1); //str2测试 String str2; clearStr(&str2); appendChar(&str2, 'e'); appendChar(&str2, 'f'); appendChar(&str2, 'g'); printf("str2添加efg后:\n"); printStr(&str2); //str1连接str2 concat(&str1, &str2); printf("str1连接str2后:\n"); printStr(&str1); }
3. 链式存储代码实现
实际上将线性表的数据区域的数据类型int改为char,不就是一个链式存储的字符串么。
直接附上链接:链式存储线性表