名词解释
串存储结构
空串
空格串
子串和主串
子串在主串中的位置
串存储结构的实现
- 定长顺序存储:用普通数组(静态数组)存储。
- 堆分配存储:用动态数组存储字符串
- 块链存储:用链表存储字符串
串的定长顺序存储
- 可以理解为采用了“固定长度的顺序存储结构”来存储字符串,因此限定了其底层实现,只能用静态数组。
#include<stdio.h>
int main()
{
char str[19]="data.biancheng.net";
printf("%s\n",str);
return 0;
}
串的堆分配存储结构
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char * a1 = NULL;
char * a2 = NULL;
a1 = (char *)malloc(10 * sizeof(char));
strcpy(a1, "www.bai");
a2 = (char *)malloc(10 * sizeof(char));
strcpy(a2, "du.com");
int lengthA1 = strlen(a1);
int lengthA2 = strlen(a2);
if(lengthA1 < lengthA1 + lengthA2)
{
a1 = (char *)realloc(a1, (lengthA1 + lengthA2) * sizeof(char));
}
for(int i = lengthA1; i < lengthA1 + lengthA2; i++)
{
a1[i] = a2[i - lengthA1];
}
a1[lengthA1 + lengthA2] = '\0';
printf("%s", a1);
free(a1);
free(a2);
return 0;
}
串的块链存储结构
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define linkNum 3//全局设置链表中节点存储数据的个数
typedef struct Link {
char a[linkNum]; //数据域可存放 linkNum 个数据
struct Link * next; //代表指针域,指向直接后继元素
}link; // nk为节点名,每个节点都是一个 link 结构体
link * initLink(link * head, char * str);
void displayLink(link * head);
int main()
{
link * head = NULL;
head = initLink(head, "www.baidu.com");
displayLink(head);
return 0;
}
//初始化链表,其中head为头指针,str为存储的字符串
link * initLink(link * head, char * str) {
int length = strlen(str);
//根据字符串的长度,计算出链表中使用节点的个数
int num = length/linkNum;
if (length%linkNum) {
num++;
}
//创建并初始化首元节点
head = (link*)malloc(sizeof(link));
head->next = NULL;
link *temp = head;
//初始化链表
for (int i = 0; i<num; i++)
{
int j = 0;
for (; j<linkNum; j++)
{
if (i*linkNum + j < length) {
temp->a[j] = str[i*linkNum + j];
}
else
temp->a[j] = '#';
}
if (i*linkNum + j < length)
{
link * newlink = (link*)malloc(sizeof(link));
newlink->next = NULL;
temp->next = newlink;
temp = newlink;
}
}
return head;
}
//输出链表
void displayLink(link * head) {
link * temp = head;
while (temp) {
for (int i = 0; i < linkNum; i++) {
printf("%c", temp->a[i]);
}
temp = temp->next;
}
}