一、字符串
数据结构中,字符串单独用一种存储结构存储,称为串存储结构
空串:存储0个字符的串,如:s=“”(双引号紧挨着)
空格串:只包含空格字符串的串,如s=" “(五个空格)
子串和主串:a=“shujujiegou”, b=“shuju”,a中也包含"shuju”,因此串a为串b的主串,串b为串a的子串
字符串包含三种串的存储结构:
定长顺序存储:用普通数组(又称静态数组)存储
堆分配存储:用动态数组存储字符串
块链存储:用链表存储
二、堆分配存储
具体实现就是使用动态数组存储字符串
堆区的内存空间需要手动使用malloc函数申请,不用后使用free函数释放
//
// Created by 醉人饮梦 on 2023/2/26.
//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char* a1 = NULL;
char* a2 = NULL;
a1 = malloc(10 * sizeof(char));
strcpy_s(a1,6,"hello");
a2 = malloc(10 * sizeof(char));
strcpy_s(a2,7," world");
int length1 = (int)strlen(a1);
int length2 = (int)strlen(a2);
// 总长
int length = length1 + length2;
if(length1 < length){
// 加 1 :给 '\0' 留一个位置
a1 = realloc(a1, (length+1) * sizeof(char));
}
for (int i = length1; i < length; ++i) {
a1[i] = a2[i - length1];
}
a1[length] = '\0';
printf("%s", a1);
free(a1);
free(a2);
exit(0);
}
三、块链存储结构
具体实现采用 链表结构存储数据
例子采用单链表无头结点
各结点仅存储 1 个数据元素的链表
各结点仅存储 4 个数据元素的链表
使用链表存储字符串,其最后一个结点的数据域不一定会被字符串占满,通常使用"#"或其他特殊字符将最后一个结点填满;
如何确定个数:
串的长度和存储的空间大小:如果数据量大,链表申请的存储空间有限,此时应尽可能地让各结点存储更多的数据,提高空间的利用率(每第一个结点,都要申请一个指针域的空间)
程序实现的功能:如果需要做大量的插入或删除操作,则应尽可能减少各结点存储数据的数量
//
// Created by 醉人饮梦 on 2023/2/26.
//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 链表中各节点存储数据的个数
#define LINKNUM 3
typedef struct link{
char a[LINKNUM];
struct link* next;
}link;
link* initLink(link* head,char* str)
{
int length = (int)strlen(str);
// 根据字符串的长度,计算链表使用结点的个数
int num = length/LINKNUM;
if(length%LINKNUM){
num++;
}
head = 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 = malloc(sizeof(link));
newLink->next = NULL;
temp->next = newLink;
temp = newLink;
}
}
return head;
}
void display(link* head)
{
link* temp = head;
while (temp){
for (int i = 0; i < LINKNUM; ++i) {
printf("%c",temp->a[i]);
}
temp = temp->next;
}
}
int main()
{
link* head = NULL;
head = initLink(head, "hello world");
display(head);
return 0;
}
结语
个人记录学习所用,如有错误之处还请指出,谢谢