欢迎光~临~^_^
目录
知识树
1、串的定义
串是由零个或多个字符组成的有限序列。在计算机科学中,常用串来表示文本、代码或数据。串是程序设计中重要的基本数据类型之一,常用于字符串匹配、文本处理和密码学等领域。
子串是指在一个字符串中取出一段连续的字符所得到的字符串。例如,在字符串 "hello world" 中,"hello"、"world"、"lo"、"l"、"rld" 都是它的子串。
空串指的是没有任何字符的字符串,表示为 ""(两个引号之间没有任何字符)。而空格串指的是只包含空格字符的字符串,例如 " "。虽然两者在形式上都是字符串,但含义不同。
2、串的存储结构
2.1顺序存储
静态存储
串的静态存储指的是在程序运行时在固定的内存地址上分配空间来存储串。在静态存储中,串的长度是固定的,不能动态地改变。通常,在编写程序时,我们可以使用字符数组来存储字符串,这样可以方便地对字符串进行操作和访问。
例如,在C语言中,可以通过以下方式来定义一个静态的字符串:
char str[] = "hello world";
这里,str
是一个字符数组,被初始化为字符串"hello world"。在编译时,系统会为str
分配一个固定的内存空间,用来存储这个字符串。在程序运行时,我们可以通过str
来访问和修改这个字符串。需要注意的是,这个字符串的长度是固定的,即为11(包括字符串末尾的'\0'字符)。如果我们需要动态地改变字符串的长度,就需要使用动态存储方式,如堆内存或栈内存。
动态存储
串的动态存储一般采用字符数组或链表进行实现。
1.字符数组
字符数组是串的静态存储方式,但可以通过动态分配内存来实现动态存储。具体实现方法为:
(1)定义一个字符指针变量,用于指向动态分配的字符数组。
(2)根据实际需要确定串的最大长度,调用C语言中的动态内存分配函数malloc()
申请空间。
(3)将申请到的空间赋值给字符指针变量。
(4)通过scanf()
、gets()
等函数向分配的空间中读入字符。
(5)使用完后,需要释放已分配的内存空间,以便于其他程序使用。
示例代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char* str;
int len;
printf("Input the length of the string:");
scanf("%d", &len);
str = (char*)malloc(len * sizeof(char));
if (!str)
{
printf("Memory allocation failed!\n");
return 0;
}
printf("Input the string:");
scanf("%s", str);
printf("The string you input is:%s\n", str);
free(str);
return 0;
}
2.链表
链表是动态存储的一种常见方式,可以在运行时动态增加或删除节点。对于串的存储,链表的每个节点都可以存储一个字符。链表的实现方法如下:
(1)定义一个节点结构体,包含一个字符变量和一个指向下一个节点的指针变量。
(2)定义一个头指针变量,用于指向链表的第一个节点。
(3)通过调用C语言的动态内存分配函数malloc()
申请一个节点,并将节点的指针挂在链表的末尾。
(4)向新申请的节点中存入要存储的字符。
(5)通过指针操作,可以在链表中进行插入、删除、修改等操作。
(6)使用完链表后,需要释放每个节点占用的内存空间。
示例代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
char data;
struct node* next;
}Node;
int main()
{
Node* head = NULL;
Node* tail = NULL;
c